一、简介
playbook是一个非常简单的配置管理和多主机部署系统。可作为一个适合部署复杂应用程序的基础。
playbook可以定制配置,可以按指定的操作步骤有序执行,支持同步和异步方式。
playbook是通过YAML格式来进行描述定义的,可实现多台主机应用的部署,对不同分组的主机执行特定指令步骤。
1、第一个playbook
测试playbook:first.yml。
---
- hosts: all
remote_user: root
tasks:
- name: test yml
command: /usr/bin/wall "hello world"
2、Playbook工作流程
二、Playbook核心元素
1、hosts
hosts 行的内容是一个或多个组或主机的 patterns,以逗号为分隔符。通常是/etc/ansible/hosts定义的主机列表。
remote_user 就是远程执行任务的账户名。
---
- hosts: cluster1,cluster2
remote_user: root
2、tasks
任务集
tasks:
- name: install httpd
yum: name=httpd
- name: start httpd
service: name=httpd state=started
- name: check http port
shell: ss -ntl|grep 80 > /tmp/httpd.txt
- name: fetch
fetch: src=/tmp/httpd.txt dest=/tmp
一个yml文件里可以设计多个playbook,不过呢,为了更清晰的管理,建议应该独立存放不同任务需求,方便以后调用。
3、Handlers 和 notity
由特定条件触发的操作,满足条件方才执行,否则不执行。
Handlers也是task列表,这些task与前述的tasks并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作
还是拿上个例子的playbook修改下。
---
- hosts: clutser1
remote_user: root
tasks:
- name: install httpd
yum: name=httpd
- name: change httpd.conf
copy: src=/app/httpd.conf dest=/etc/httpd/conf/ backup=yes
notify: restart httpd # 在 notify 中定义内容一定要和handlers中定义的 - name 内容一样,这样才能达到触发的效果,否则会不生效。
- name: start httpd
service: name=httpd state=started
- name: wall http status
shell: /usr/bin/wall `ss -nltp|grep httpd`
handlers:
- name: restart httpd # 只有接收到通知才会执行这里的任务
service: name=httpd state=restarted
4、tags
指定某条任务执行,用于选择运行 playbook 中的部分代码。 ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断。可以为每个tasks设置tags,这样方便调用。
- name: change httpd.conf
copy: src=/app/httpd.conf dest=/etc/httpd/conf/
tags: copyconf # tags:后除了一个空格外,不要有其他空格,中间可以使用_下划线。
notify: restart httpd
# ansible-playbook --tags=copyconf first.yml
三、变量
1、变量名称
变量名仅能由字母、数字和下划线组成,且只能以字母开头。
2、变量定义
1、# ansible setup facts 远程主机的所有变量都可直接调用。setup模块就是用来获取远程主机的相关信息的。一般以ansible_开头的就是变量可以调用
2. 在/etc/ansible/hosts中定义
普通变量:主机组中主机单独定义,优先级高于公共变量
公共(组)变量:针对主机组中所有主机定义统一变量
[web]
10.0.0.4 hname=nginx http_prot=8080 # 主机普通变量
10.0.0.9 hname=httpd http_prot=8081 # 主机普通变量
10.0.0.19 hname=httpd24 http_prot=8082 # 主机普通变量
[web:vars] 注意:vars是关键字,针对web组内所有主机设置的变量
hname=web > 主机公共(组)变量,
3. 通过命令行指定变量,优先级最高
#ansible-playbook –e 变量名=变量值
http_port=80
4. 在playbook中定义
vars: > 关键字
- var1: value1
- var2: value2
5. vars_files指定变量文件
vars_files:
- /app/vars.yml
3、通过playbook中使用vars: 定义调用
---
- hosts: web
remote_user: root
vars: # 关键字
- username: wzlinux # 键值对
- groupname: wzlinux # 键值对
tasks:
- name: add group
group: name={{ groupname }} # 变量调用
- name: add user
user: name={{ username }} # 变量调用
4、通过playbook中使用setup中的变量调用
---
- hosts: web
remote_user: root
tasks:
- name: create file
copy: dest=/app/ip.txt content="{{ ansible_all_ipv4_addresses }}" # 调用了setup 模块收集的ansible_all_ipv4_addresses变量值
...
#cat /app/ip.txt
["10.0.0.4"]
5、通过主机清单定义普通变量并调用
[web]
10.0.0.4 hname=nginx http_prot=8080
10.0.0.9 hname=httpd http_prot=8081
10.0.0.19 hname=httpd24 http_prot=8082
---
- hosts: web
remote_user: root
tasks:
- name: set hostname
hostname: name={{ hname }}-{{ http_prot }}
结果:
#ansible web -m shell -a 'echo $HOSTNAME'
10.0.0.4 | SUCCESS | rc=0 >>
nginx-8080
10.0.0.9 | SUCCESS | rc=0 >>
httpd-8081
10.0.0.19 | SUCCESS | rc=0 >>
httpd24-8082
四、我的案例
- hosts: all
remote_user: root
tasks:
- name: stop tomcat and delete adscanh5.war
shell: nohup /root/tomcat_stop.sh &
command: /bin/rm -rf /home/webapps/{adscanh5,adscanh5.war}
- name: copy adscanh5.war
copy: src=/root/adscanh5.war dest=/home/webapps
- name: start the tomcat
shell: nohup /root/tomcat_start.sh &