playbook简介:
playbook主要功能在于将实现归并为一组的主机装扮成事先通过ansible中的task定义好的角色。
playbook是由yaml语法编写的文本文件,由play和task两部分组成。
- play:主要是定义要操作的主机或者主机组
- task:主要定义对主机或者主机组具体执行的任务,可以是一个任务,也可以是多个任务(模块)
playbook和AD-hoc的主要区别:
- playbook是对ad-hoc的一种编排方式
- playbook可以持久运行,而ad-hoc只能临时运行
- playbook适合复杂的任务,而ad-hoc适合快速简单的任务
- playbook能控制任务执行的先后顺序
playbook编写规范
1、yaml语法规范
- 在单一档案中,可以连续三个连子号“-”区分多个档案,也就是说在一个文件里可以写多个playbook。另外,还有选择性的连续三个点号"..."用来表示档案结尾,当文件中油一个playbook时,写上比较规范,不写也不回报错。
- 此行开始正常些playbook的内容,一般建议写明该playbook的功能,使用#注释代码
- 短横线"-"表示列表项,使用一个短横杠加一个空格。
- 缩进必须是统一的,不能空格和tab混用。缩进的级别也必须是一致的。
- yaml文件内容和linux系统大小写判断方式保持一致,是区别大小写的,
- k/v的值可以同行写,也可以换行写。
- 以冒号结尾的除外,其他所有冒号后边必须有空格。
- yaml文件扩展名通常为yml或者yaml。
2、yaml语法要素
1、列表
其所有元素都是用“-”打头,表示平级关系;
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
2、字典
Dictionary,通常由多个key与value构成,类似于变量赋值,key相当于变量,value为值,只不过用冒号连接
# An employee record
name: wuzhaobo
job: Technical Engineer
skill: ansible
也可以将key:value放置于{}中进行表示多个key:value,多个之间用逗号“,”隔开
或者
{name: Example Developer,job: Developer,skill: Elite}
3、列表和字典的结合使用:
name: wuzhaobo
age: 30
gender: Male
spouse: #字典嵌套,spouse 为key,name\age\gender 为值
name: kangkexin
age: 28
gender: Female
children: #字典与列表嵌套
- name: aaa #被嵌套的列表
age: xx #列表中的字典
gender: Female
- name: bbb
age: xx
gender: Male
3、playbook核心元素
- Hosts:执行的远程主机列表,Hosts为key,其值为将来要执行的主机列表
- Tasks:任务集
- Varniables:内置变量或自定义变量在playbook中调用
- Templates (模板):可替换模板文件中的变量并实现一些简单的逻辑的文件
- Handlers和notity结合使用:由特定条件触发的操作,满足条件才执行,否则不执行;
- tags(标签):指定某条任务执行,用于选择运行playbook中的部分代码,ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常的长。可以使用tags跳过代码片段
4、playbook基础组件
1、Host
playbook中每个play的目的都是为了让某个或者某些主机以某个用户指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,必须事先在主机清单中。
2、remote_user
可用于Host和task中。表示在远程的主机上以谁的身份去进行后面的任务。也可以指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某个任务;甚至可以在sudo时使用sudo_user指定sudo时切换的用户
- hosts: websrvs
remote_user: root <==指定全局为root身份
tasks:
- name: test connection
ping:
remote_user: xu <==表示针对name这个模块使用xu
sudo: yes <==默认sudo为root
sudo_user:wang <==指定sudo切换时,使用wang
3、task列表
play 的主体部分是tasks list.
task list 中的各任务按次序逐个在hosts中指定的所有主机上运行,即在所有主机上完成第一个任务后,再开始第二个任务。
task 的目的是使用指定的参数执行模块,而在模块参数中可以使用变量
每个task都应该有其name,用于playbook的执行结果输出。
格式:
action: module arguments
action: command /sbin/setenforce 0
module: arguments 建议使用
command: /sbin/setenforce 0
注意:
- shell和command模块后面跟命令,而非key=value;
- 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers(触发任务);
- 任务可以通过"tags“打标签,而后可在ansible-playbook命令上使用 -t 指定进行调用;
示例
---
- hosts: web
remote_user: root
tasks:
- name: Test connectivity
ping:
- name: copy file
copy:
src: /tmp/asd.yaml
dest: /tmp/
notify: Restart Httpd Server
- name: fetch k8s-node-2 a.log
fetch:
src: /tmp/a.log
dest: /tmp/
- name: status kubelet.service
systemd:
name: kubelet.service
state: stopped
handlers:
- name: Restart Httpd Server
service:
name: kubelet.service
state: restarted
检查语法:
[root@k8s-master-1 test]# ansible-playbook test.yaml --syntax-check
执行:
[root@k8s-master-1 test]# ansible-playbook test.yaml
PLAY [web] ***************************************************************************
TASK [Gathering Facts] ***************************************************************
ok: [192.168.134.138]
TASK [Test connectivity] *************************************************************
ok: [192.168.134.138]
TASK [copy file] ********************************************************************
changed: [192.168.134.138]
TASK [fetch k8s-node-2 a.log] ********************************************************
changed: [192.168.134.138]
TASK [status kubelet.service] *********************************************************
changed: [192.168.134.138]
PLAY RECAP *****************************************************************************
192.168.134.138 : ok=8 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0