1. playbook
1.1 playbook介绍
- playbook是一个或多个play组成的列表
- play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible的task定义好的角色。从根本上讲,所谓task无非就是调用ansible的一个模块。将多个play组织在一个playbook中,即可以让它们联通起来按事先编排的机制同唱一场大戏。
- playbook采用YAML语言编写。
1.2 YAML介绍
-
YAML是一个可读性高的用来表达资料序列的格式。
-
YAML语言大小写敏感
- YAML语言通过缩进表示层级关系
- YAML语言禁止使用tab缩进,只能使用空格键
- YAML语言使用#表示注释
1.3 playbook语法简介
- 文档需以“---”(3个减号)开始,且需顶行手写。文档需以“…”(3个点号)结尾。
- 次行开始正常写playbook的内容。
- 使用#号注释代码。
- 缩进必须是统一的,不能空格和Tab混用。
- 缩进的级别也必须是一致的,同样的缩进代码同样的级别,程序判断配置的级别是通过缩进结合换行实现的。
- k/v的值可同行也可换行写,同行使用:分隔。
- v可以是一个字符串,也可以是一个列表。
- 一个完整的代码块功能需最少元素,需包括name:task。
- 一个name只能包括一个task。
- YAML文件扩展名通常为yml或yaml
1.4 playbook核心元素
- hosts:执行的远程主机列表,需事先定义在主机清单里
- tasks:任务集
- variables:内置变量或自定义变量在playbook中调用
- templates:模板,可替换模板文件中的变量并实现一些简单逻辑的文件
- handlers:和notity结合使用,由特定条件出发的操作,满足条件方可执行,否则不执行
- tags:标签,指定某条任务执行,用于选择运行playbook中的部分代码。
2. playbook基本使用
--- #文档开始
- hosts: all #要执行的远程主机列表
remote_user: root #用于指定远程主机上的执行任务的用户
tasks: #任务集,用于执行多个动作
- name: "安装httpd"
yum: name=httpd state=present
- name: "启动httpd,设置为开机自启动"
service: name=httpd state=started enabled=yes
... #文档结束
如果命令或脚本的推出码不为0(也就是出错了),可以使用或代替:
tasks:
- name: hello
command: hostname || /bin/true
或者使用ignore_errors来忽略错误信息:
tasks:
- name: hello
command: hostname
ignore_errors: True
2.1 playbook运行
用法:ansible-playbook [options] playbook.yml
options选项 | 说明 |
--check/-C | 只检测可能会发生的改变,但不真正的执行操作 |
--list-hosts | 列出运行任务的主机 |
--limit 主机列表 | 只针对主机列表中的主机执行 |
-v | 显示过程,-vv、-vvv更详细 |
[root@CentOS7 ~]# ansible-playbook httpd.yml
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.146.111]
ok: [192.168.146.112]
ok: [192.168.146.122]
TASK [安装httpd] *****************************************************************
changed: [192.168.146.122]
changed: [192.168.146.112]
changed: [192.168.146.111]
TASK [启动httpd,设置为开机自启动] ********************************************************
changed: [192.168.146.122]
changed: [192.168.146.112]
changed: [192.168.146.111]
PLAY RECAP *********************************************************************
192.168.146.111 : ok=3 changed=2 unreachable=0 failed=0
192.168.146.112 : ok=3 changed=2 unreachable=0 failed=0
192.168.146.122 : ok=3 changed=2 unreachable=0 failed=0
2.2 Shell与playbook
shell语法
#!/bin/bash
#install apache
yum install httpd -y
#copy configuration files
cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf
cp /tmp vhosts.conf /etc/httpd/conf.d/
#start apache
systemctl start httpd
systemctl enable httpd
yaml语法
---
- hosts: all
remote_user: root
tasks:
- name: 'install apache'
yum: name=httpd state=present
- name: 'copy index.html'
copy: src=/var/www/html/index.html dest=/var/www/html/index.html
- name: 'start apache'
service: name=httpd state=started enabled=yes
...
2.3 handlers和notify结合使用触发条件
handlers是task列表指定的操作,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作。
notify,此action可用于在每个play的最后被触发,这样可避免多次有改变发生时都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。
[root@CentOS7 ~]# vim httpd.yml
---
- hosts: all
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=present
- name: copy index.html
copy: src=/var/www/html/index.html dest=/var/www/html/index.html
notify: restart service
- name: start apache
service: name=httpd state=started enabled=yes
handlers:
- name: restart service
service: name=httpd state=restarted
...
[root@CentOS7 ~]# ansible-playbook httpd.yml
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.146.111]
ok: [192.168.146.112]
ok: [192.168.146.122]
TASK [install httpd package] ***************************************************
ok: [192.168.146.112]
ok: [192.168.146.111]
ok: [192.168.146.122]
TASK [copy index.html] *********************************************************
changed: [192.168.146.122]
changed: [192.168.146.112]
changed: [192.168.146.111]
TASK [start apache] ************************************************************
ok: [192.168.146.122]
ok: [192.168.146.112]
ok: [192.168.146.111]
RUNNING HANDLER [restart service] **********************************************
changed: [192.168.146.122]
changed: [192.168.146.112]
changed: [192.168.146.111]
PLAY RECAP *********************************************************************
192.168.146.111 : ok=5 changed=2 unreachable=0 failed=0
192.168.146.112 : ok=5 changed=2 unreachable=0 failed=0
192.168.146.122 : ok=5 changed=2 unreachable=0 failed=0
2.4 playbook中tags使用
- 通过指定标签来指定执行指定的action,多个标签之间用逗号隔开
- 多个action可以公用一个标签
[root@CentOS7 ~]# vim httpd.yml
---
- hosts: all
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=present
tags: install httpd
- name: copy index.html
copy: src=/var/www/html/index.html dest=/var/www/html/index.html
notify: restart service
- name: start apache
service: name=httpd state=started enabled=yes
tags: restart httpd
handlers:
- name: restart service
service: name=httpd state=restarted
...
[root@CentOS7 ~]# ansible-playbook -t 'restart httpd' httpd.yml
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.146.122]
ok: [192.168.146.112]
ok: [192.168.146.111]
TASK [start apache] ************************************************************
changed: [192.168.146.112]
changed: [192.168.146.122]
changed: [192.168.146.111]
PLAY RECAP *********************************************************************
192.168.146.111 : ok=2 changed=1 unreachable=0 failed=0
192.168.146.112 : ok=2 changed=1 unreachable=0 failed=0
192.168.146.122 : ok=2 changed=1 unreachable=0 failed=0
2.5 playbook中变量的使用
变量名:仅能由字母、数字和下划线组成,且只能以字母开头
变量来源:1.ansible setup facts远程主机的所有变量都可以直接调用
2.在/etc/ansible/hosts中定义
普通变量:主机中中主机单独定义,优先级高于公共变量
公共(组)变量:针对主机组中所有主机定义统一变量
3.通过命令行指定变量,优先级最高: ansible-playbook -e varname=name
4.在playbook中定义
vars:
- var1: value1
- var2: value2
5.在role中定义
命令行的优先级一般优于配置文件
2.在/etc/ansible/hosts中定义
[root@CentOS7 ~]# vim /etc/ansible/hosts
[webservers:vars]
prname=www.
poname=.cn
[webservers]
192.168.146.111 http_port=81
192.168.146.112 http_port=82
192.168.146.122 http_port=83
[root@CentOS7 ~]# vim hostname.yml
---
- hosts: all
remote_user: root
tasks:
- name: set hostname
hostname: name={{ prname }}{{ http_port }}{{ poname }}
[root@CentOS7 ~]# ansible-playbook hostname.yml
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.146.122]
ok: [192.168.146.112]
ok: [192.168.146.111]
TASK [set hostname] ************************************************************
changed: [192.168.146.122]
changed: [192.168.146.112]
changed: [192.168.146.111]
PLAY RECAP *********************************************************************
192.168.146.111 : ok=2 changed=1 unreachable=0 failed=0
192.168.146.112 : ok=2 changed=1 unreachable=0 failed=0
192.168.146.122 : ok=2 changed=1 unreachable=0 failed=0
[root@CentOS7 ~]# ansible all -m shell -a 'echo $HOSTNAME'
192.168.146.112 | SUCCESS | rc=0 >>
www.82.cn
192.168.146.122 | SUCCESS | rc=0 >>
www.83.cn
192.168.146.111 | SUCCESS | rc=0 >>
www.81.cn
3.通过命令行定义
[root@CentOS7 ~]# vim s.yml
---
- hosts: all
remote_user: root
tasks:
- name: install package
yum: name={{ package_name }} state=present
- name: start service
service: name={{ package_name }} state=started enabled=yes
…
#安装vsftpd包,多个包中间使用空格隔开
[root@CentOS7 ~]# ansible-playbook -e 'package_name=vsftpd' s.yml
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.146.112]
ok: [192.168.146.111]
ok: [192.168.146.122]
TASK [install package] *********************************************************
ok: [192.168.146.112]
ok: [192.168.146.122]
ok: [192.168.146.111]
TASK [start service] ***********************************************************
changed: [192.168.146.122]
changed: [192.168.146.111]
changed: [192.168.146.112]
PLAY RECAP *********************************************************************
192.168.146.111 : ok=3 changed=1 unreachable=0 failed=0
192.168.146.112 : ok=3 changed=1 unreachable=0 failed=0
192.168.146.122 : ok=3 changed=1 unreachable=0 failed=0
4.在playbook中定义
[root@CentOS7 ~]# vim s.yml
---
- hosts: all
remote_user: root
vars:
- package_name: httpd
tasks:
- name: install package
yum: name={{ package_name }} state=present
- name: start service
service: name={{ package_name }} state=started enabled=yes
...