一、简介

playbook是一个非常简单的配置管理和多主机部署系统。可作为一个适合部署复杂应用程序的基础。
playbook可以定制配置,可以按指定的操作步骤有序执行,支持同步和异步方式。
playbook是通过YAML格式来进行描述定义的,可实现多台主机应用的部署,对不同分组的主机执行特定指令步骤。

1、第一个playbook

测试playbook:first.yml。

---

- hosts: all
  remote_user: root

  tasks:
    - name: test yml
      command: /usr/bin/wall "hello world"

运维自动化工具 Ansible-playbook (二)_第1张图片

2、Playbook工作流程

运维自动化工具 Ansible-playbook (二)_第2张图片

二、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 &