一、playbooks
如果用模块形式一般有幂等性,如果用shell或者command没有幂等性
playbooks相当于是shell脚本,可以把要执行的任务写到文件当中,一次执行,方便调用
tasks:一个task相当于是一个play
varibles:变量,一定定义,多处调用
template:模板,可以区分不同主机的特点
handlers:触发器,依赖于前一个任务,前一个任务如果执行改变,那么就会触发handlers
二、yaml介绍及格式
yaml是一个可读性高的用来表达资料序列的格式,yaml参考了其他多种语言,包括:xml,c语言,python,perl以及电子邮件格式RFC2822等,ClarkEvans在2001年在首次发表了这种语言。
特点:
(1)yaml的可读性好
(2)yaml和脚本语言的交互性好
(3)yaml使用实现语言的数据类型
(4)yaml有一个一致的信息模型
(5)yaml易于实现
(6)yaml可以基于流程来处理
(7)yaml表达能力强,扩展性好
编写说明:
(1)缩进:yaml 的缩进要求比较严格。一定不能使用tab键
(2)冒号:每个冒号后面一定要有一个空格
注意:1. 以冒号结尾不需要空格
2. 表示文件路径的模版可以不需要空格
(3)短横线-:想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分
注意:
1. 严格控制空格编写剧本的时候
2. 剧本编写不支持tab
书写规范注意点:
1、脚本名:***.yml 【不是.yml也行】
2、注释: “#”
3、tasks: (后不能加任何字符-可以加注释#)
4、- name: 一个 - name: 下不能有两条功能(行)
.每个-和:即冒号之后要有一个空格,task除外。
剧本格式:
--- ### 剧本的开头,可以不写
- hosts: all <- 处理所有服务器,找到所有服务器; -(空格)hosts:(空格)all
tasks: <- 剧本所要干的事情; (空格)(空格)task:
- command: (空格)(空格)空格)(空格)-(空格)模块名称:(空格)模块中对应的功能
测试剧本命令后面可以跟多个-v进行调试检查
常用命令:
1、对剧本语法检测
ansible-playbook --syntax-check /root/ansible/httpd.yaml
2、-C模拟执行剧本
ansible-playbook -C /root/ansible/httpd.yaml
3、执行剧本
ansible-playbook /root/ansible/httpd.yaml
三、ansible剧本实例
实例一:基础(编写一个rehttpd.yaml剧本)
第一步:编写剧本
[root@ren5 ~]# vim rehttpd.yaml
1 - hosts: test_ren1 2 remote_user: root 3 tasks: 4 - name: copy httpd.conf 5 copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf 6 - name: restart httpd 7 service: name=httpd state=restarted
第二步:语法检测
[root@ren5 ~]# ansible-playbook --syntax-check rehttpd.yaml
playbook: rehttpd.yaml
第三步:模拟执行剧本
[root@ren5 ~]# ansible-playbook -C rehttpd.yaml
第四步:真正执行剧本
[root@ren5 ~]# ansible-playbook rehttpd.yaml
第五步:检查是否已经启动成功
[root@ren5 ~]# ansible test_ren1 -m shell -a "ss -tnl |grep 80"
实例二:打标签
-t:执行指定tag标签任务
--skip-tags:执行--skip-tags以外的任务
执行:ansible-playbook xxx.yaml -t TAG
ansible-playbook xxx.yaml --skip-tags TAG
定义带tag标签的yaml文件:
1 - hosts: test_ren1 2 remote_user: root 3 tasks: 4 - name: "touch 123.txt" 5 shell: echo {{ ansible_all_ipv4_addresses }} > 123.txt 6 tags: 7 - tag1 8 - name: "date" 9 shell: date >> 123.txt 10 tags: 11 - tag2 12 - tag3
[root@ren5 ~]# ansible-playbook tag.yaml -t tag1 #只执行tag1标签的任务
[root@ren5 ~]# ansible all -a "cat 123.txt" #查看文件内容
实例三:include
include:如果有多个任务要执行,写在一个yaml文件里就显得太臃肿了,而且阅读性也比较低,这个时候可以用include关键字把多个任务联合到1个yaml文件里,方便调用
比如有2个文件,a.yaml和b.yaml,那么我们可以把a.yaml,b.yaml联合到一个exec.yaml文件中执行
a.yaml的内容如下:
1 - name: "touch abc.txt" 2 shell: echo 'hello' >> abc.txt
b.yaml的内容如下:
1 - name: "touch abc.txt" 2 shell: echo 'world' >> abc.txt
exec.yaml的内容如下:
1 - hosts: test_ren1 2 remote_user: root 3 tasks: 4 - include_tasks: a.yaml 5 - include_tasks: b.yaml
[root@ren5 ~]# ansible-playbook --syntax-check exec.yaml
[root@ren5 ~]# ansible-playbook exec.yaml
[root@ren5 ~]# ansible test_ren1 -m shell -a "cat abc.txt"
实例四:剧本中使用变量
变量的引用:{{变量名}}
一、自定义变量的实现方式:
第一种:直接写在yaml文件中,在文件中声明变量
vars和tasks同级,并要写在tasks前面
vars:
- 变量名: 变量值
vars:
- file: httpd.conf #file就是一个变量
1 - hosts: 192.168.11.4 2 remote_user: root 3 vars: 4 - packages: tree 5 tasks: 6 - name: yum install tree 7 yum: name={{ packages }} state=present
第二种:在inventory file文件中定义
vim /etc/ansible/hosts
[test_ren1:vars]
file=httpd.conf
packages=tree #file和packages是两个变量
第三种:执行playbook文件时候给与变量 --extra-vars
ansible-playbook test.yaml --extra-vars "touch_file=test.txt"
二、注册变量
register注册变量:把date命令输出的结果赋予给date_output