linux系统ansible工具中的剧本playbook基础内容
playbook
- playbook
- 使用场景
- 核心元素
- 剧本格式
- 运行剧本
- 运行剧本的方式
- playbook查看执行命令过程
- 角色roles
- 介绍
- 角色创建
- 角色创建后的目录
- 角色使用
- 变量定义
- facts调用
- 批量修改主机 host 文件
- 自定义变量
- 命令行传入
- playbook中定义
- roles定义变量
- 主机清单定义
- 向不同的主机传递不同的变量
- 向组中的主机传递相同的变量
- 主机清单定义内置参数
- when语句
- with循环
- 字典
playbook
playbook 是 ansible 用于配置,部署,和管理被控节点的剧本。
通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态
playbook就像Ansible控制器给被控节点列出的的一系列to-do-list,而被控节点必须要完成
在Ansible中,由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。
使用场景
执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用playbook不过playbook有自己的语法格式。使用playbook可以方便的重用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。在使用Ansible的过程中,将所处理的大部分操作都是编写playbook。可以把常见的应用都编写成playbook,之后管理服务器会变得十分简单
核心元素
Hosts:主机组
Tasks:任务列表
Variables:变量,设置方式有四种,vars
Templates:包含了模板语法的文本文件
Handlers:由特定条件触发的任务
remote_user:在远程主机上执行任务的用户
某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers
任务可以通过“tags“打标签,而后可在ansible-playbook命令上使用-t或者--tags指定进行调用
剧本格式
文件的第一行应该以 "---" (三个连字符)开始,表明YMAL文件的开始。
在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。
同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。
play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":"分隔表示,":"后面还要增加一个空格。
host部分:使用hosts指示使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hosts,hosts也可以使用通配符格式。在运行清单文件的时候,–list-hosts选项会显示那些主机将会参与执行task的过程中。remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行task的用户,可以任意指定,也可以使用sudo,但是用户必须要有执行相应task的权限。 tasks:指定远端主机将要执行的一系列动作。tasks的核心为 ansible 的模块,前面已经提到模块的用法。tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必须的,同时也要给予模块相应的参数。
运行剧本
运行剧本的方式
ansible-playbook 剧本名 //运行剧本ansible-playbook 剧本名 --syntax-check //检查剧本语法正确与否ansible-playbook 剧本名 --list-task //列出所有任务ansible-playbook 剧本名 --list-hosts //列出在那些机器执行ansible-playbook --tags=标签名 剧本名 //只运行标签语句
ansible-playbook -t=标签名 剧本名 //只运行标签语句
playbook查看执行命令过程
ad-hoc:点对点运行可以看到命令执行结果playbook:只能看到命令是否执行成功
如果需要查看执行过程的数据需要添加模块tasks
- name:xxx模块:执行名令register: result register:变量名
- name: debugdebug Var: 变量名["对变量名进行裁剪"]
角色roles
介绍
roles 用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等。使用roles只需要在playbook中使用include指令即可。roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,也是用于构建守护进程等场景中。
角色创建
ansible-galaxy init 角色名字 //在当前所在目录下创建角色文件
角色创建后的目录
defaults:用于设定默认变量;files:存放剧本所需文件handlers:用于定义各handler;其它的文件需要由main.yml进行“包含”调用; meta:定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用; README.md:说明书tasks:用于定义各task;其它的文件需要由main.yml进行“包含”调用;templates:存储由template模块调用的模板文本;tests:用于存放测试文件的目录vars:用于定义各variable;其它的文件需要由main.yml进行“包含”调用;
角色使用
和角色同级创建 执行剧本文件.yaml,文件内编写执行主机、执行用户、执行角色
---
- hosts: 主机remote_user: rootroles:- 角色名字
运行角色剧本
ansible-playbook 执行剧本文件.yaml
变量定义
facts调用
直接调用setup收集的信息,这个模块就是通过调用facts组件来实现的。这里的variables也可以直接调用facts组件。具体的facters可以使用setup模块来获取,然后直接放入剧本中调用即可。
ansible_all_ipv4_addresses:仅显示ipv4的信息==》显示ipv4所有的信息
ansible_ens33['ipv4']['address']:仅显示ipv4的信息==》ens33的ip地址
ansible_devices:仅显示磁盘设备信息
ansible_distribution:显示是什么系统,例:centos,suse等
ansible_distribution_version:仅显示系统版本
ansible_machine:显示系统类型,例:32位,还是64位
ansible_eth0:仅显示eth0的信息
ansible_hostname:仅显示主机名
ansible_kernel:仅显示内核版本
ansible_lvm:显示lvm相关信息
ansible_memtotal_mb:显示系统总内存
ansible_memfree_mb:显示可用系统内存
ansible_memory_mb:详细显示内存情况
ansible_swaptotal_mb:显示总的swap内存
ansible_swapfree_mb:显示swap内存的可用内存
ansible_mounts:显示系统磁盘挂载情况
ansible_processor:显示cpu个数(具体显示每个cpu的型号)
ansible_processor_vcpus:显示cpu个数(只显示总的个数)
ansible_python_version:显示python版本
批量修改主机 host 文件
---
- hosts: web vars: IP: "{{ ansible_eth0['ipv4']['address'] }}" tasks: - name: 将原有的hosts文件备份 shell: mv /etc/hosts /etc/hosts_bak - name: 将ansible端的hosts复制到各自机器上 copy: src=/etc/hosts dest=/etc/ owner=root group=root mode=0644 - name: 在新的hosts文件后面追加各自机器内网ip和hostname lineinfile: dest=/etc/hosts line="{{ IP }} {{ ansible_hostname }} "
自定义变量
命令行传入
执行剧本时,-e 变量名=变量值
ansible-playbook 剧本名 -e 变量名=变量值{{ 变量名 }} //调用变量
playbook中定义
在playbook中定义
vars:
- 变量名: 变量值{{ 变量名 }} //调用变量
roles定义变量
创建角色后,在角色的目录下的vars/main.yml里面定义变量变量名: 变量值
主机清单定义
主机清单定义:/etc/ansible/hosts
向不同的主机传递不同的变量
[主机组]
主机1
主机2[主机1]
主机变量名=主机变量值[主机2]
主机变量名=主机变量值
向组中的主机传递相同的变量
[主机组]
主机
主机[主机主:vars]
变量名=变量值
主机清单定义内置参数
| 参数 | 用途 |
|---|---|
| ansible ssh host | 定义 hosts ssh 地址 |
| ansible ssh port | 定义 hosts ssh 端口 |
| ansible ssh user | 定义 hosts ssh 认证用户 |
| ansible ssh pass | 定义 hosts ssh 认证密码 |
| ansible sudo | 定义 hosts sudo 用户 |
| ansible sudo pass | 定义 hosts sudo 密码 |
| ansible sudo exe | 定义 hosts sudo 路径 |
| ansible connection | 定义 hosts 连接方式 |
| ansible ssh private key file | 定义 hosts 私钥 |
| ansible ssh shell type | 定义 hosts shell 类型 |
| ansible python interpreter | 定义 hosts 任务执行python路径 |
| ansible * interpreter | 定义 hosts 其它语言解析路径 |
when语句
- name: Task Nameansible.builtin.command: /bin/rebootwhen: ansible_facts['os_family'] == "RedHat"ansible_when语句的格式是
when: condition
其中condition是一个布尔表达式,如果为真,则执行该任务。
with循环
tasks:
- name: unstall web packagesyum: name={{ item }} state=absentwith_items:- httpd- php- php-mysql
现在模块也支持多次运行tasks:
- name: unstall web packagesyum: name=httpd,php,php-mysql state=absent
字典
多个with是字典
- name: install some packagesyum: name={{ item }} state=presentwith_items:- nginx- memcached- php-fpm
- name: add some groupsgroup: name={{ item }} state=presentwith_items:- group11- group12- group13
- name: add some usersuser: name={{ item.name }} group={{ item.group }} state=presentwith_items:- { name: 'user11', group: 'group11' }- { name: 'user12', group: 'group12' }- { name: 'user13', group: 'group13' }