1、简介
2、使用场景
1、基本格式
playbook由YMAL语言编写。YAML( /ˈjæməl/ )参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822,Clark Evans在2001年5月在首次发表了这种语言,另外Ingy döt Net与OrenBen-Kiki也是这语言的共同设计者。
YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。首先学习了解一下YMAL的格式,对我们后面书写playbook很有帮助。以下为playbook常用到的YMAL格式:
举例:
---
#安装与运行mysql服务
- hosts: node1
remote_user: root
tasks:
- name: install mysql-server package
yum: name=mysql-server state=present
- name: starting mysqld service
service: name=mysql state=started
文件名称应该以.yml结尾,像我们上面的例子就是mysql.yml。其中,有三个部分组成:
2、核心元素
3、基本组件
任务格式:
tasks:
– name: TASK_NAME
module: arguments
notify: HANDLER_NAME
handlers:
– name: HANDLER_NAME
module: arguments
(1) 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;
(2) 任务可以通过“tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;
为websrvs组创建一个nginx组和用户,复制文件到dbsrvs组。
- hosts: websrvs
remote_user: root
tasks:
- name: create nginx group
group: name=nginx system=yes gid=2334
- name: create nginx user
user: name=nginx uid=2334 group=nginx system=yes
- hosts: dbsrvs
remote_user: root
tasks:
- name: copy file to dbsrvs
copy: src=/etc/inittab dest=/tmp/inittab.ansible
1、Host和Users
playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户执行任务,hosts用于指定要执行任务的主机,其可以是一个或多个由冒号分隔主机组。remote_user则用于指定远程主机上的执行任务的用户。
不过,remote_user也可以用于各task中,也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务,此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户。
---
- hosts: webservers
remote_user: root
tasks:
- name: test connection
ping:
remote_user: yourname
sudo: yes
2、tasks 列表和 action
每一个play包含了一个tasks列表(任务列表)。
任务列表中的各任务按次序逐个在hosts中指定的所有主机上执行即在所有主机上完成第一个任务后再开始第二个。在自上而下运行某playbook时如果中途发生错误,所有已执行任务都将回滚,因此在更正playbook后重新执行即可。
每一个tasks必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个tasks的。如果没有定义name,“action”的值将会用作输出信息中标记特定的tasks。
tasks的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。每个task都应该有其name用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name则action的结果将用于输出。
如果要声明一个tasks,以前有一种格式:“action: module options”(可能在一些老的playbooks中还能见到)。现在推荐使用更常见的格式:“module: options”。
下面是一种基本的task的定义,service moudle使用key=value格式的参数,这也是大多数module使用的参数格式:
tasks:
- name: make sure apache is running
service: name=httpd state=running
# 在众多模块中,只有command和shell模块仅需要给定一个列表而无需使用“key=value”格式如下:
tasks:
- name: disable selinux
command: /sbin/setenforce 0
# 使用command module和shell module时,我们需要关心返回码信息,如果有一条命令,它的成功执行的返回码不是0,我们可以这样做:
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true
# 或者使用ignore_errors来忽略错误信息
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True
# 如果action行看起来太长,可以使用space(空格)或者indent(缩进)隔开连续的一行:
tasks:
- name: Copy ansible inventory file to client
copy: src=/etc/ansible/hosts dest=/etc/ansible/hosts
owner=root group=root mode=0644
3、Handlers 在发生改变时执行的操作
用于当关注的资源发生变化时采取一定的操作。在执行playbook时如果返回的是OK则表示没有变化,如果返回的是changed则表示发生了改变。
module具有“幂等”性,所以当远程主机被人改动时,可以重放playbooks达到恢复的目的。playbooks本身可以识别这种改动,并且有一个基本的event system(事件系统),可以响应这种改动。
(当发生改动时)“notify”这个actions会在playbook的每一个tasks结束时被触发,而且即使有多个不同的tasks通知改动的发生,“notify” actions只会被触发一次。这样可以避免多次有改变发生时每次都执行指定的操作,取而代之仅在所有的变化发生完成后一次性地执行指定操作。
在“notify”中列出的操作称为handlers,即“notify”中调用handlers中定义的操作。
例子:复制配置文件到指定主机上,如果配置文件和原本主机上的不同,则覆盖然后触发操作。
[root@ansible-node1 ~]# vim apache.yml
- hosts: websrvs
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=present
- name: install configuration file for httpd
copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd service
service: enabled=true name=httpd state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted
4、variables变量名
(1)使用:vars: 添加变量
vars:
(2)直接引用Ansible变量,这些变量在前面使用setup模块可以查看,例如:ansible_all_ipv4_addresses 获取IP
(3)引用主机变量,在组的主机后面添加变量
vim /etc/ansible/hosts
vim c.yml
5、条件判断
when的值是一个条件表达式,如果条件判断成立,这个task就执行,如果判断不成立,则task不执行
如果需要根据变量、facts(setup)或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,在Playbook中条件测试使用when子句。
在task后添加when子句即可使用条件测试:when子句支持jinjia2表达式或语法,例如:
(1)单条件判断
(2)多条件判断
(3)组条件判断
(4)自定义条件判断
6、迭代
有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句指明迭代的元素列表即可。
7、Tags
(1)在一个playbook中,我们一般会定义很多个task,如果我们只想执行其中的某一个task或多个task时就可以使用tags标签功能。
任务可以通过“tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用
# ansible-playbook hosts.yml --tags="only" //只执行这个标签上面的任务
(2)事实上,不光可以为单个或多个task指定同一个tags。playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。
ansible-playbook hosts.yml --tags="only" //去被管理主机上查看文件创建情况 2个tags都会执行
1、简介
在实际应用中,我们的配置文件有些地方可能会根据远程主机的配置的不同而有稍许的不同,template可以使用变量来接收远程主机上setup收集到的facts信息,针对不同配置的主机,定制配置文件。用法大致与copy模块相同
template_host包含模板机器的节点名称
template_uid所有者的数字用户标识
template_path是模板的路径
template_fullpath是模板的绝对路径
template_run_date是模板呈现的日期
2、参数
attributes(2.3后新增):文件或目录的属性
backup:如果原目标文件存在,则先备份目标文件
block_end_string(2.4后新增):标记块结束的字符串
block_start_string(2.4后新增):标记块的开始的字符串
dest:目标文件路径
follow(2.4后新增):是否遵循目标中的文件链接
force:是否强制覆盖,默认为yes
group:目标文件或目录的所属组
owner:目标文件或目录的所属主
mode:目标文件的权限。对于那些习惯于/usr/bin/chmod的记住,模式实际上是八进制数字(如0644or 01777)。离开前导零可能会有意想不到的结果。从版本1.8开始,可以将模式指定为符号模式(例如u+rwx或u=rw,g=r,o=r)
newline_sequence(2.4后新增):指定用于模板文件的换行符序列(\n、\r、\r\n)
src:源模板文件路径
trim_blocks(2.4后新增):如果这设置为True,则删除块后的第一个换行符
validate:在复制之前通过命令验证目标文件,如果验证通过则复制
variable_end_string(2.4后新增):标记打印语句结束的字符串
variable_start_string(2.4后新增):标记打印语句开头的字符串
3、示例
# 官方简单示例
- template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode=0644
- template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode="u=rw,g=r,o=r"
- template: src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s'
playbook的引用该模板配置文件的方法示例:
- name: Setup BIND
host: all
tasks:
- name: configure BIND
template: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=0644
# 或者是这样
- template:
src: /etc/httpd/conf/httpd.conf
dest: /etc/file.conf
owner: root
group: root
mode: 0644
# 创建DOS样式文本文件
- template:
src: config.ini.j2
dest: /share/windows/config.ini
newline_sequence: '\r\n'
转载:https://www.cnblogs.com/keerya/p/8004566.html
https://blog.51cto.com/13630803/2154192
https://blog.51cto.com/13525470/2112720