Playbook剧本是由一个或多个”play”组成的列表。它的主要功能在于,将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作。Playbook文件使用Yaml语言。
YAML 语言
YAML 语言介绍
官方网站:http://www.yaml.org
YAML:YAML Ain’t Markup Language,即YAML不是标记语言。不过,在开发的这种语言时,YAML的意思其实是:”Yet Another Markup Language”(仍是一种标记语言)。
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingydöt Net与Oren Ben-Kiki也是这语言的共同设计者,目前很多最新的软件流行采用YAML格式的文件存放配置信息,如:ubuntu,anisble,docker,kubernetes等。
YAML 语言特性
- YAML的可读性好
- YAML和脚本语言的交互性好
- YAML使用实现语言的数据类型
- YAML有一个一致的信息模型
- YAML易于实现
- YAML可以基于流来处理
- YAML表达能力强,扩展性好
YAML语法简介
- 在单一文件第一行,用连续三个连字号”-” 开始,还有选择性的连续三个点号( … )用来表示文件的结尾
- 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
- 使用#号注释代码
- 缩进必须是统一的,不能空格和tab混用
- 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
- YAML文件内容是区别大小写的,key/value的值均需大小写敏感
- 多个key/value可同行写也可换行写,同行使用,分隔
- key后面冒号要加一个空格 比如: key: value
- value可是个字符串,也可是另一个列表
- YAML文件扩展名通常为yml或yaml
支持的数据类型
- 标量:单个的、不可再分的值
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
scalar 标量
key对应value
name: qinwa
age: 20
使用缩进的方式
name:
qinwa
age:
20
Dictionary 字典
字典由多个key与value构成,key和value之间用 冒号分隔,并且冒号后面有一个空格。
可以写在同一行也可以不同行。
account: {name: root, password: 123456}
account:
name: root
password: 123456
List列表
列表由多个元素组成,每个元素放在不同行,且元素前均使用”-“打头,并且 – 后有一个空格,或者将所有元素用 [ ] 括起来放在同一行。
course: [linux,golang,python]
course:
- linux
- golang
- python
playbook 命令
ansible-playbook <filename.yml> ... [options]
选项
--syntax-check #语法检查,可缩写成--syntax,相当于bash -n
-C --check #模拟执行,只检测可能会发生的改变,但不真正执行操作,dry run
--list-hosts #列出运行任务的主机
--list-tags #列出所有标签
--list-tasks #列出所有任务
--limit 主机列表 #只针对主机列表中的特定主机执行
-i INVENTORY #指定主机清单文件,通常一个项目对应一个主机清单文件
--start-at-task START_AT_TASK #从指定task开始执行,而非从头开始,START_AT_TASK为任务的name
-v -vv -vvv #显示过程
Playbook 核心组件
官方文档:https://docs.ansible.com/ansible/latest/reference_appendices/playbooks_keywords.html
下面会列举anible-playbook中的常用组件。
hosts 组件
A list of groups, hosts or host pattern that translates into a list of hosts that are the play’s target.
指定要执行任务的主机,需要在主机清单中提前定义。
- hosts: webservers
remote_user 组件
User used to log into the target via the connection plugin.
用来登录目标主机的用户。
- hosts: webservers
remote_user: root
tasks组件
Main list of tasks to execute in the play, they run after roles and before post_tasks.
PLAY中执行的主要任务清单。
task按次序在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task。
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的。
每个task都应该有它的name,用于playbook执行结果的输出,如果未提供,则action的结果将用于输出。
支持两种格式
action: module arguments
module: arguments
范例:
action: shell wall "hello world"
shell: wall "hello world"
ignore_errors组件
Boolean that allows you to ignore task failures and continue with play. It does not affect connection errors.
当某个task执行失败,忽略这次失败,继续往下执行。
---
- hosts: webservers
tasks:
- name: error
command: /bin/false
ignore_errors: yes
- name: continue
command: wall continue
/bin/false 会输出失败信息导致下面的任务无法执行,可以用ignore_errors跳过失败的任务,然后继续往下执行。
handlers组件
A section with tasks that are treated as handlers, these won’t get executed normally, only when notified after each section of tasks is complete. A handler’s listen field is not templatable.
只有被触发才会执行的任务。
注意:
- 如果多个task通知了相同的handlers, 此handlers仅会在所有tasks结束后运行一 次
- 只有notify对应的task发生改变了才会通知handlers, 没有改变则不会触发handlers
- handlers 是在所有前面的tasks都成功执行才会执行,如果前面任何一个task失败,会导致handler跳过执行,可以使用force_handlers: yes 强制执行handler
案例:
当httpd的配置文件内容发生改变,会触发重启服务和广播消息。
---
- hosts: webservers
gather_facts: no
force_handlers: yes
tasks:
- name: Install Httpd
yum: name=httpd state=present
- name: Copy Config File
copy: src=/tmp/httpd.conf dest=/etc/httpd/conf
notify:
- restart service
- wall
handlers:
- name: restart service
service: name=httpd state=restarted
- name: wall
shell: wall "Config File changed"
tags组件
Tags applied to the task or included tasks, this allows selecting subsets of tasks from the command line.
tags用于为特定的任务设置标签,运行playbook时可以只运行指定标签的任务。
一个task可以有多个tag,也可以多个task对应一个tag。
关键字:
- tagged 运行已标记
- untagged 运行未标记
- all 运行所有任务
案例:
假设我写了一个httpd.yml
---
- hosts: webservers
gather_facts: no
force_handlers: yes
tasks:
- name: Install Httpd
yum: name=httpd state=present
tags: yum
- name: Copy Config File
copy: src=/tmp/httpd.conf dest=/etc/httpd/conf
notify:
- restart service
- wall
tags: config
handlers:
- name: restart service
service: name=httpd state=restarted
- name: wall
shell: wall "Config File changed"
列出所有的tags
ansible-playbook --list-tags httpd.yml
只安装服务不修改配置
ansible-playbook -t yum httpd.yml