ansible playbook 介绍
playbook 是 ansible 用于配置,部署,和管理被控节点的脚本,使用YAML语言编写
一、简单说明YAML的基本语法:
基本语法:
大小写敏感
使用缩进表示层级关系
缩进不允许使用 tab,只允许空格
缩进的空格数不重要,只要相同层级的元素左对齐即可
# 表示注释
: 号后面要加空格,这个容易忘记,需要特别注意
YAML数据类型:
对象:键值对的集合,key:value 字典(dictionary)
数组:一组按次序排列的值,列表(list)[ ]
纯量(scalars):字符串/布尔值/整数/浮点数/Null/时间/日期
###-开头表示属组
1. name
2. age
3. height
### [name,age,heihgt]
companies:
-
id: 1
name: company1
price: 20W
-
id: 2
name: company2
price: 50W
#另一种写法
companies: [{
id: 1,name: company1,price: 20W},{
id: 2,name: company2,price: 50W}]
二、ansible playbook常用到的YMAL格式:
1、文件的第一行应该以 “—” (三个连字符)开始,表明YMAL文件的开始。
2、在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
3、YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。
4、同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。
5、play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":“分隔表示,”:"后面还要增加一个空格。
三、使用ansible-playbook运行playbook文件,得到如下输出信息,输出内容为JSON格式。并且由不同颜色组成,便于识别。一般而言
| 绿色代表执行成功,系统保持原样
| 黄色代表系统代表系统状态发生改变
| 红色代表执行失败,显示错误输出
执行有三个步骤:1、收集facts 2、执行tasks 3、报告结果
四、Playbook的核心元素:
Hosts:主机组;
Tasks:任务列表;
Variables:变量,设置方式有四种;
Templates:包含了模板语法的文本文件;
Handlers:由特定条件触发的任务;
五、Playbooks配置文件的基础组件:
- Hosts:运行指定任务的目标主机
- remoute_user:在远程主机上执行任务的用户;
- tasks:需要执行的任务列表
#格式:
tasks:
– name: TASK_NAME
module: arguments
notify: HANDLER_NAME
handlers:
– name: HANDLER_NAME
module: arguments
4、handlers:任务在特定条件下触发;接收到其它任务的通知时被触发;
(1) 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;
(2) 任务可以通过“tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;
测试的play-book文件:
[root@test ~]# cd /etc/ansible
[root@test ansible]# vim test-nginx.yml
--- ###表示开始写playbook
- hosts: testnode ###要运行的主机组
remote_user: root ###运行用户
tasks: ###要执行的任务,按定义顺序执行主任务,任务失败会导致整个Playbook中止,可以使用ignore_errors: true跳过失败任务,继续执行后续任务,以列表的形式写内容[key1:value1,key2:value2]
- name: install nginx ####安装一个nginx
yum: name=nginx state=present
- name: copy nginx.conf ###复制配置文件
copy: src=/tmp/nginx.conf dest=/etc/nginx/nginx.conf backup=yes ###原文件做备份
notify: reload #当nginx.conf发生改变时,通知给相应的handlers,reload是handlers的名称不是执行的命令
tags: reloadnginx #打标签,方便在后续ansible-playbook 命令中直接调用这个任务
- name: start nginx service
service: name=nginx state=started
tags: startnginx #打标签
- name: test error task
yum: ssiil ###执行这个任务会报错
ignore_errors: true ###出现错误忽略
handlers: #注意,前面没有-,是两个空格
- name: reload ###notify 指定的名称
service: name=nginx state=restarted #为了在进程中能看出来
单独说明一下notify
1、触发条件,只有ngtify所在的任务这些结果发生变化才执行notify指定的handlers任务
1. changed=1:表示任务执行后目标状态发生了变化(如文件被修改、服务重启等)。
2. changed=0:任务未执行或执行后无变化(如文件已存在、服务已运行),不会触发notify。
2、执行时机
1. notify定义的handlers不会立即执行,而是在当前tasks中所有普通任务完成后统一执行。
2. 若同一任务多次触发notify,最终只执行一次对应的handler,避免重复操作(如多次重启服务)。
示例:
[root@lrtm ansible]# ansible-playbook test-nginx.yml
PLAY [testnode] #节点上执行playbook中的任务
******************************************************
TASK [Gathering Facts] #第一步收件节点信息
*******************************************************
ok: [gz-node10] ##信息收集完成
TASK [install nginx] #执行第一个tasks任务按照nginx
*****************************************************
changed: [gz-node10] ##已经安装完成
TASK [copy nginx.conf] # 复制nginx配置文件
*****************************************************
ok: [gz-node10] ###执行完成
TASK [start nginx] # 启动nginx
*********************************************
changed: [gz-node10] ###完成
PLAY RECAP # 执行结果4个任务执行都OK,2个步骤发生了变化
****************************
gz-node10 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@lrtm ansible]# ansible gz-node10 -m shell -a "ss -tnl|grep 80" ####80端口已经监听
gz-node10 | CHANGED | rc=0 >>
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:80 [::]:*
[root@lrtm ansible]# ansible-playbook test-nginx.yml -t startnginx ##使用-t 参数指定执行标签任务
PLAY [testnode] ***************

最低0.47元/天 解锁文章
768

被折叠的 条评论
为什么被折叠?



