playbook简介
playbook是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。我们完成一个任务,例如安装部署一个httpd服务,我们需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,他的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML。
playbook本身由以下各部分组成
- Tasks:任务,即通过 task调用 ansible的模板将多个操作组织在一个playbook中运行
- Variables:变量
- Templates:模板
- Handlers:处理器,当notify所在任务满足changed状态条件时,触发执行的操作
- Roles:角色
playbook示例
vim httpd.yaml
- hosts: webserver
vars:
http_port: 80
max_clients: 200
user: root
tasks:
- name: ensure apache is at the latest version
yum: pkg=httpd state=latest
- name: write the apache config file
template: src=/root/test/httpd.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restart apache
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
#---------------------playbook解释------------------------
- hosts: webserver //定义的主机组,即应用的主机
vars: //定义变量
http_port: 80
max_clients: 200
user: root //指定用户执行任务
tasks: //执行的任务
- name: ensure apache is at the latest version //自定义输出内容,任务名称
yum: pkg=httpd state=latest //yum模块:指定软件包和版本参数;即使用yum安装最新版的httpd
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf //定义一个httpd的模板(在管理端自己创建)
notify: //调用下面的操作
- restart apache //操作的名字,在handlers下定义
- name: ensure apache is running
service: name=httpd state=started //输出httpd状态
handlers: //处理器
- name: restart apache //被调用的操作名字
service: name=httpd state=restarted //重启httpd服务
2、执行playbook
格式:
ansible-playbook [yaml文件名]
例如:ansible-playbook ping.yml
参数:-k(–ask-pass) 用来交互输入ssh密码
-K(-ask-become-pass) 用来交互输入sudo密码
-u 指定用户
补充命令:
ansible-playbook XXXX.yaml --syntax-check #检查yaml文件的语法是否正确
ansible-playbook XXXX.yaml --list-task #检查tasks任务
ansible-playbook XXXX.yaml --list-hosts #检查生效的主机
ansible-playbook XXXX.yaml --start-at-task='ensure apache is at the latest version' #指定从某个task开始运行
3、hosts和users介绍
hosts: webserver #指定主机组,可以是一个或多个组。
remote_user: root #指定远程主机执行的用户名
还可以为每个任务定义远程执行用户:
vim mysql.yaml
- hosts: mysql
remote_user: root
tasks:
- name: test connection
ping:
remote_user: li #指定远程主机执行tasks的运行用户为li
4、为每个任务定义远程执行用户
cd /opt
vim 1.yaml
- hosts: mysql
remote_user: root
tasks:
- name: test connection
ping:
remote_user: mysql
ansible mysql -m user -a 'name=mysql'
ansible mysql -m shell -a 'echo 123123 | passwd --stdin mysql'
ansible-playbook 1.yaml -k
123456
5、指定远程主机切换用户执行剧本
vim 2.yaml
- hosts: mysql
remote_user: root
become: yes
become_user: mysql
tasks:
- name: copy text
copy: src=/etc/fstab dest=/home/mysql/fstab.bak
ansible-playbook 2.yaml
6、tasks忽略错误,强制返回成功
1、Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始。在运行playbook时 (从上到下执行),如果一个host执行task失败, 整个tasks都会停止。
2、每一个task必须有一个名称 name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。
7、Handlers介绍
Handlers也是一些task的列表,和一般的task并没有什么区别。
是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了,则Handlers被执行
不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次
示例
vim handler.yaml
- hosts: webserver
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
- name: install configuration file for httpd
copy: src=/root/handler/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd service
service: enabled=true name=httpd state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted
8、playbook使用变量
(1)通过ansible命令传递
例如:编辑如下yaml
vim test1.yml
- hosts: mysql
remote_user: root
vars:
- user:
tasks:
- name: add new user
user: name={{user}}
然后执行命令: ansible-playbook test1.yml -e "user=lisi"
可以执行命令查看:ansible mysql -m shell -a 'cat /etc/shadow |grep "lisi"'
(2)直接在yaml中定义变量
vim test2.yml
- hosts: webserver
remote_user: root
vars:
package: httpd
service: httpd
tasks:
- name: install httpd package
yum: name={{package}} state=latest
- name: install configuration file for httpd
copy: src=/root/handler/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd service
service: enabled=true name={{service}} state=started
handlers:
- name: restart httpd
service: name={{service}} state=restarted
(3)直接引用一些变量 引用ansible的固定变量
vim test3.yml
- hosts: mysql
remote_user: root
tasks:
- name: copy file
copy: content="{{ansible_all_ipv4_addresses}}," dest=/opt/vars.txt
引用主机变量
vim /etc/ansible/hosts
在mysql组的主机后面添加如下
[mysql]
192.168.19.18 testvar="test1111" #定义testvar变量的值为test1111
vim test3.yml #添加{{testvar}}主机变量
- hosts: mysql
remote_user: root
tasks:
- name: copy file
copy: content="{{ansible_all_ipv4_addresses}},{{testvar}}" dest=/opt/vars.txt
9、条件测试
如果需要根据变量、facts(setup)或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,在Playbook中条件测试使用when子句。
在task后添加when子句即可使用条件测试:when子句支持jinjia2表达式或语法,例如:
vim when.yml
- hosts: mysql
remote_user: root
tasks:
- name: "shutdown CentOS"
command: /sbin/shutdown -h now
when: ansible_distribution == "CentOS"
10、迭代
当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句指明迭代的元素列表即可。例如:
vim install.yaml
- hosts: webserver
remote_user: root
tasks:
- name:
command: rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
- name: "Install Packages"
yum: name={{ item }}
with_items:
- httpd
- mysql-server
- php