一、YAML语法简介 .yaml .yml
playbook由YAML语言编写。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。
YAML格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。
以下为playbook常用到的YAML格式:
1、文件的第一行应该以 "---" (三个连字符)开始,表明YAML文件的开始。
2、在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
3、YAML中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。
4、同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。
5、play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":"分隔表示,":"后面还要增加一个空格。
二、字符类型
字符串:
ipaddress: 192.168.10.12
列表:
colors:
- red
- green
- yellow
- blue
- orange
字典或MAP
user:
name: jerry
state: present
三、语法检测
语法检测:
# ansible-playbook --syntax-check /path/to/playbook.yaml
测试运行
# ansible-playbook -C /path/to/playbook.yaml
四、 常用语法结构
1.基本语法
---
- hosts: web1
tasks:
- name: create user ljz
user:
name: ljz
state: present
- name: create file /root/ljz
file:
path: /root/ljz
state: directory
- hosts: 192.168.100.90
tasks:
- name: delete /root/a.txt
file:
path: /root/a.txt
state: absent
注意:
hosts参数指定了对哪些主机进行操作;
tasks指定了任务列表,其下面的name参数是任务的ID,在执行过程中会打印出来。
2. 变量定义及使用 :
---
- hosts: web1
gather_facts: false
vars:
- UserName: jerry
- FileName: jerry.txt
tasks:
- name: create user "{{UserName}}"
user:
name: "{{UserName}}"
state: present
- name: create file "/root/{{FileName}}"
file:
path: "/root/{{FileName}}"
state: touch
owner: "{{UserName}}"
注意:
name参数对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值 ,可以省略;
gather_facts参数指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用到setup获取的信息时用到;
vars参数指定了变量,这里指字一个user变量,其值为test ,需要注意的是,变量值一定要用引号引住;
user提定了调用user模块,name是user模块里的一个参数,而增加的用户名字调用了上面user变量的值。
3.条件判断:
---
- hosts: web1
user: root
gather_facts: True
tasks:
- name: use when
file:
path: /root/when.txt
state: touch
when:
- "'192.168.100.80' in ansible_all_ipv4_addresses"
类型为字符串: ansible_distribution == "CentOS"
类型为列表: "'192.168.10.12' in ansible_all_ipv4_addresses"
类型为字典: ansible_memory_mb.real.free >= 500 (也可写作 ansible_memory_mb["real"]["free"])
如果要从ansible_facts中取数据, 一定要从顶层字段取起
注意:
(1)要求多条件同时满足可用and连接或写成列表的形式;
(2)变量要先定义才能进行比较
4.循环 :
---
- hosts: web1
gather_facts: no
tasks:
- name: test loop
file:
name: "/root/{{item}}"
state: touch
loop:
- 1.txt
- 2.txt
- 3.txt
- hosts: 192.168.100.80
gather_facts: no
tasks:
- name: create two hard links
file:
src: "/etc/{{item.src}}"
dest: "/root/{{item.dest}}"
state: hard
loop:
- { src: passwd, dest: 123 }
- { src: hosts, dest: 456 }
说明:
循环:迭代,需要重复执行的任务;
对迭代项的引用,固定变量名为"item",而后使用 loop 给定要迭代的元素列表
5.register
register 是个寄存器,接收任务的返回值或者状态.
register 用于获取task输出,检测是否执行正常或失败。可以通过使用 register 关键字来实现获取输出。
register 关键字可以存储指定task的输出结果到一个自定义的变量中,我们通过访问这个自定义变量就可以获取到task的输出结果。
# 例1
---
- hosts: 192.168.10.21
gather_facts: false
tasks:
- name: 获取当前日期
shell: date +%F
register: day
- name: 查看变量内容
debug:
var: day
# 例2
---
- hosts: 192.168.10.21
gather_facts: false
tasks:
- name: 获取当前星期
shell: date +%w
register: week_day
- name: 星期三在/tmp目录下创建记录日期的文件a.txt
shell: date > /tmp/a.txt
when: week_day.stdout == "3"
6. handlers
---
- hosts: 192.168.10.12
vars:
- user_name: "hello"
tasks:
- name: create user hello
user:
name: "{{ user_name }}"
state: present
notify: change owner to file # notify后面是handler的ID
- name: create file /tmp/test.txt
file:
path: /tmp/test.txt
state: touch
handlers:
- name: change owner to file
file:
name: /tmp/a.txt
owner: "{{ user_name }}"
state: touch
(1)任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;
(2)当所有任务执行完毕后才会执行handlers
以上只有 user 模块真正执行后,才会去调用下面的 handlers 相关的操作,追加内容。所以这种比较适合配置文件发生更改后,需要重启服务的操作。