playbook
play是针对清单中选定的主机运行的一组有序任务。playbook是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表。
Play可以将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测的成功成果。在playbook中,可以将play内的任务序列保存为人类可读并可立即运行的形式。根据任务的编写方式,任务本身记录了部署应用或基础架构所需的步骤。
编写playbook
[root@localhost httpd]# vim httpd_install.yml
---
- name: install httpd
hosts: http
gather_facts: no # 关闭事实收集
tasks:
- name: install httpd using yum
yum:
name: httpd
state: present
- name: service is enabled
service:
name: httpd
state: started
enabled: yes
Playbook是以YAML格式编写的文本文件,通常使用扩展名yml保存。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则:
- 处于层次结构中同一级别的数据元素(例如同一列表中的项目)必须具有相同的缩进量。
如果项目属于其他项目的子项,其缩进量必须大于父项. - 只有空格字符可用于缩进,不允许使用tab键。约定俗成的缩进量一般是一级2个空格。
Playbook开头的一行由三个破折号(—)组成,这是文档开始标记。其末尾可能使用三个圆点(…)作为文档结束标记,尽管在实践中这通常会省略。
运行playbook
[root@localhost httpd]# ansible-playbook httpd_install.yml
PLAY [install httpd] ***********************************************************
TASK [install httpd using yum] *************************************************
ok: [192.168.172.142]
TASK [service is enabled] ******************************************************
ok: [192.168.172.142]
PLAY RECAP *********************************************************************
192.168.172.142 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
通常而言,Ansible Playbook中的任务是幂等的,而且能够安全地多次运行playbook。如果目标受管主机已处于正确的状态,则不应进行任何更改。如果再次运行这个playbook,所有任务都会以状态OK传递,且不报告任何更改。
语法验证
在执行playbook之前,最好要进行验证,确保其内容的语法正确无误。
成功:
[root@localhost httpd]# ansible-playbook --syntax-check httpd_install.yml
playbook: httpd_install.yml
失败:将报告语法错误。输出中包含语法问题在playbook中的大致位置。
编写多个play
[root@localhost lamp]# cat restart.yml
---
- name: restart httpd
hosts: http
gather_facts: no
tasks:
- name: restart httpd
service:
name: httpd
state: restarted
- name: restart php
hosts: php
gather_facts: no
tasks:
- name: restart php
service:
name: php-fpm
state: restarted
play中的远程用户和特权升级
Play可以将不同的远程用户或特权升级设置用于play,取代配置文件中指定的默认设置。这些在play本身中与hosts或tasks关键字相同的级别上设置。
用户属性
playbook中的任务通常通过与受管主机的网络连接来执行。与临时命令相同,用于任务执行的用户帐户取决于Ansible配置文件/etc/ansible/ansible.cfg中的不同关键字。运行任务的用户可以通过remote_user关键字来定义。不过,如果启用了特权升级,become_user等其他关键字也会发生作用。
如果用于任务执行的Ansible配置中定义的远程用户不合适,可以通过在play中使用remote_user关键字覆盖。
remote_user: remoteuser
特权升级属性
Ansible也提供额外的关键字,从而在playbook内定义特权升级参数。become布尔值关键字可用于启用或禁用特权升级,无论它在Ansible配置文件中的定义为何。它可取yes或true值来启用特权升级,或者取no或false值来禁用它。
become: true
如果启用了特权升级,则可以使用become_method关键字来定义特定play期间要使用的特权升级方法。
以下示例中指定sudo用于特权升级:
become_method: sudo
此外,启用了特权升级时,become_user关键字可定义特定play上下文内要用于特权升级的用户帐户。
become_user: privileged_user
模块文档
ansible-doc [module name]
显示模板帮助文档
[root@ansible ~]# ansible-doc user //user模块的帮助文档
> USER (/usr/lib/python3.6/site-packages/ansible/modules/syste>
Manage user accounts and user attributes. For Windows tar>
use the [win_user] module instead.
* This module is maintained by The Ansible Core Team
OPTIONS (= is mandatory):
- append
If `yes', add the user to the groups specified in `groups>
If `no', user will only be added to the groups specified >
`groups', removing them from all other groups.
Mutually exclusive with `local'
......
语法变化
** YAML注释 **
注释也可以用于提高可读性。在YAML中,编号或井号字符(#)右侧的所有内容都是注释。如果注释的左侧有内容,请在该编号符号的前面加一个空格。
# This is a YAML comment
some data # This is also a YAML comment
** YAML字符串 **
YAML中的字符串通常不需要放在引号里,即使字符串中包含空格。字符串可以用双引号或单引号括起。
this is a string
'this is another string'
"this is yet another a string"
编写多行字符串有两种方式。可以使用管道符表示要保留字符串中的换行字符。
include_newlines: |
Example Company
123 Main Street
Atlanta, GA 30303
要编写多行字符串,还可以使用大于号字符来表示换行字符转换成空格并且行内的引导空白将被删除。这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性。
fold_newlines: >
This is an example
of a long string,
that will become
a single sentence once folded.
** YAML字典 **
下面是一个简单的字典形式:
name: svcrole
svcservice: httpd
svcport: 80
字典也可以使用以大括号括起的内联块格式编写,如下所示:
{name: svcrole, svcservice: httpd, svcport: 80}
** YAML列表 **
最简单的列表如下:
hosts:
- servera
- serverb
- serverc
- ```
列表也有以中括号括起的内联格式,如下所示:
```shell
hosts: [servera, serverb, serverc]