playbook是由一个或多个“play” 组成的列表
play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏。
Playbook采用YAML语言编写
 

playbook逻辑关系:

YAML语言简介

 YAML是一个可读性高的用来表达资料序列的格式。 YAML参考了其他多种语言,包括: XML、C语言、 Python、 Perl以及电子邮件格式RFC2822等。 Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。
 YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时, YAML的意思其实是: "Yet Another Markup Language"(仍是一种标记语言)。
 特性:
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好
更多的内容及规范参见http://www.yaml.org

YAML语法简介

  •  在单一文件中,可用连续三个连字号(——)区分多个文件。另外,还有选择性的连续三个点号( ... )用来表示文件结尾
  •  次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
  •  使用#号注释代码
  •  缩进必须是统一的,不能空格和tab混用
  •  缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
  •  YAML文件内容是区别大小写的, k/v的值均需大小写敏感
  •  k/v的值可同行写也可换行写。同行使用:分隔
  •  v可是个字符串,也可是另一个列表
  •  一个完整的代码块功能需最少元素需包括 name: task
  •  一个name只能包括一个task
  •  YAML文件扩展名通常为yml或yaml

List:列表,其所有元素均使用“-” 打头

示例:
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango

Dictionary:字典,通常由多个key与value构成

示例:
---
# An employee record
name: Example Developer
job: Developer
skill: Elite
也可以将key:value放置于{}中进行表示,用,分隔多个key:value
示例:
---
# An employee record
{name: Example Developer, job: Developer, skill: Elite}
 

Playbook核心元素

  • Hosts 执行的远程主机列表
  • Tasks 任务集
  • Varniables 内置变量或自定义变量在playbook中调用
  • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
  • Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
  • tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。 ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断

playbook基础组件
Hosts:

playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。 hosts用于指定要执行指定任务的主机,须事先定义在主机清单中
可以是如下形式:

  • one.example.com
  • one.example.com:two.example.com
  • 192.168.1.50
  • 192.168.1.*
  • Websrvs:dbsrvs 两个组的并集
  • Websrvs:&dbsrvs 两个组的交集
  • webservers:!phoenix 在websrvs组,但不在dbsrvs组

示例: - hosts: websrvs: dbsrvs
 

remote_user:

可用于Host和task中。也可以通过指定其通过sudo的方式在远
程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使
用sudo_user指定sudo时切换的用户
- hosts: websrvs
remote_user: root
tasks:
- name: test connection
ping:
remote_user: magedu
sudo: yes 默认sudo为root
sudo_user:wang sudo为wang
 

task列表和action

  • play的主体部分是task list。 task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后,再开始第二个任务
  • task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
  • 每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出

tasks:任务列表
格式: (1) action: module arguments
            (2) module: arguments 建议使用
注意: shell和command模块后面跟命令,而非key=value
某任务的状态在运行后为changed时,可通过“notify” 通知给相应的handlers
任务可以通过"tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用
示例:
tasks:
- name: disable selinux
command: /sbin/setenforce 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
 

运行playbook


运行playbook的方式
ansible-playbook <filename.yml> ... [options]
常见选项
--check 只检测可能会发生的改变,但不真正执行操作
--list-hosts 列出运行任务的主机
--limit 主机列表 只针对主机列表中的主机执行
-v 显示过程 -vv -vvv 更详细
 

简单示例:

使用-C选项可用来测试,真正运行时不加-C 

 

--list-host可以显示对那些主机起作用
 #ansible-playbook  test.yml --list-hosts

 若只想对其中某台主机执行playbook,可以使用--limit
#ansible-playbook --limit 192.168.36.6 test2.yml

 

 

handlers和notify结合使用触发条件
Handlers

是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作。

Notify

此action可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。
 

示例:当配置文件发生变化时,才重启httpd服务,否则不重启

- hosts: websrvs
remote_user: root
tasks:
- name: Install httpd
yum: name=httpd state=present
- name: Install configure file
copy: src=files/httpd.conf dest=/etc/httpd/conf/
notify: restart httpd
- name: ensure apache is running
service: name=httpd state=started enabled=yes
handlers:
- name: restart httpd
service: name=httpd status=restarted

【handlers和notify之间的关系为多对多,可以有多个notify触发同一个handlers,也可以有多个notify触发多个handlers】

标签tags:

对playbook中的某一动作设置标签,设置标签后可单独执行该标签的动作。

加选-t conf执行playbook

【可对多个动作添加相同标签】 

10-02 15:54