一、Roles技巧之Handlers-动态变更

如上节介绍,Roles不仅支持Tasks调用,同时支持Vars、Files、Handlers、Meta、Templates的调用。本节为大家介绍Handlers在Roles中的使用技巧。

客观讲“动态变更“形容不是很恰当,官方原文为“Running Operations On Change“-只有当状态变化时才会执行命令,Handlers通常和Notify搭配使用,当(文件/进程/返回等)状态有变化时Notify会通过Handlers做指定的变更。我们通过一个功能完整的Roles来整体了解Vars、Files、Handlers、Meta、Templates,然后逐步深入Roles Handlers用法,请看示例example.yml:

site.yml
webservers.yml
fooservers.yml
roles/
   common/
     files/
     templates/
     tasks/
     handlers/
     vars/
     defaults/
     meta/
   webservers/
     files/
     templates/
     tasks/
     handlers/
     vars/
     defaults/
     meta/

example.yml为大家展示了两个功能齐全的Roles,分别为common和webservers,每个Roles均包括 files、templates、tasks、handlers、vars、defaults、meta,在Playbooks中的调用方式如下:

---
- hosts: webservers
  roles:
     - common
     - webservers
Ok,了解了Roles支持的功能集和调用方式后,我们再来了解这些功能集的含义。
  • roles/x/tasks/main.yml :主函数,包括在其中的所有任务将被执行

  • roles/x/handlers/main.yml :所有包括其中的 handlers 将被执行

  • roles/x/vars/main.yml :所有包括在其中的变量将在roles中生效

  • roles/x/meta/main.yml:roles所有依赖将被正常登入

  • roles/x/{files,templates,tasks}/ (dir depends on task) :所有文件,模板都将可存放在这里,放在这里最大的好处是不用指定绝对路径

1、通过案例来学习Handlers的应用场景

  • 案例说明:当Apache的配置文件发生变化时重启Apache进程。

    • 编辑roles/apache/tasks/main.yml内容如下:

    • 步骤1 编排Roles目录结构如下:
      roles/apache/
      ├── handlers
      │   └── main.yml
      └── tasks
      ├── restart.yml
      └── main.yml
      目录结构需按要求编排,不得随意变更名称。
    • 步骤2 编辑roles/apache/handers/main.yml的内容如下:
      # sleep 10s
      # 
      -name:restart apache
      service: name=apache state=restarted
    • 步骤3 编辑roles/apache/tasks/restart.yml内容如下:
      -name: transfer apache config
      copy: src=httpd.conf dest=/opt/apache/httpd.conf
      notify:
       - restart apache
      该YML功能为更新Apache配置文件,如配置文件有变化则重启Apache。
      - include: restart.yml
    • 步骤4 编辑Roles同级目录apache.yml文件,内容如下:
      -hosts: webserver
      remote_user: root
      roles:
      - role: apache
      该YML为总调度文件,完成Apache配置文件的变更和Apache的重启工作。
    • 步骤5 执行命令ansile-playbook apache.yml 验证结果
      命令运行结果为更新Apache配置文件,如配置文件有更新则重启Apache,如无错误返回为正常。

如上,我们即完成了当Apache配置文件有更新时才重启Apache,在实际工作中我们并不希望随意重启应用造成服务中断吧,所以Handlers非常有用。接下来我们看Roles中Files的使用。

二、Roles技巧之Files-文件传输

Files和Templates均用于Ansible文件处理,两者主要区别是Files(不是file模块)目录下的文件无需写死绝对路径即可将将文件传输至远程主机,Templates目录下的文件以Jinja2渲染,且传输文件至远程主机的同时支持预定义变量替换。接下来我们看Roles中Files的使用方式

1、通过案例学习

  • 案例说明:将example role下的MAGEDU.PPT和STANLEY.PPT两个文件传输至远程修改文件名为全小写。

    • 返回如下结果:

    • ./file.yml内容如下:

    • ./roles/example/tasks/file.yml内容如下:

    • ./roles/example/tasks/main.yml内容如下:

    • MAGEDU.PPT内容如下:

      This is magedu.ppt file.
    • STANLEY.PPT内容如下:

      This is stanley.ppt file.
    • 步骤1 编排目录结构如下(不得随意变更):
      file.yml
      roles/example/
      ├── files
      │   ├── MAGEDU.PPT
      │   └── STANLEY.PPT
      ├── tasks
      │   ├── file.yml
      │   └── main.yml
    • 步骤2 依次创建文件MAGEDU.PPT、STANLEY.PPT
    • 步骤3 依次编辑./file.yml、./roles/example/tasks/file.yml、./roles/example/tasks/main.yml
      # This playbook deploys the whole application stack in this site.  
      - hosts: 192.168.37.142
       remote_user: root
       gather_facts: false
       roles:
        - role: example
      - name: file change example
      #copy: src=MAGEDU.PPT  dest=/data/magedu.ppt owner=stanley group=stanley
      copy: src={{ item.src }}  dest=/data/{{ item.dest }} owner=stanley group=stanley
      with_items:
      - { src: 'MAGEDU.PPT', dest: 'magedu.ppt' }
      - { src: 'STANLEY.PPT', dest: 'stanley.ppt' }
      - include: file.yml
    • 步骤4 传输文件到远程主机并修改文件名为全小写
      ansible-playbook file.yml
      和roles目录同级目录下执行命令:
      PLAY [192.168.37.14      ********************************************************* 
      TASK: [example | file change example] ***************************************** 
      changed: [192.168.37.142] => (item={'dest': 'magedu.ppt', 'src': 'MAGEDU.PPT'})
      changed: [192.168.37.142] => (item={'dest': 'stanley.ppt', 'src': 'STANLEY.PPT'})
      PLAY RECAP ******************************************************************** 
      192.168.37.142             : ok=1    changed=1    unreachable=0    failed=0
      没有False返回即为正常。我们回头再来理下本次的执行逻辑,如下图所示:

      [原创]Roles的高级玩法,带你玩转自动化_java

Ansible-playbook调用执行file.yml(和roles目录同级的file.yml文件),随后根据文件内容依次用./roles/example/tasks/main.yml、./roles/example/tasks/main.yml、./roles/example/files/{MAGEDU.PPT,STANLEY.PPT}。此过程严重依赖目录结构及命名,请勿随意更改目录及文件名
Roles的Files功能设计主要针对业务文件传输需求,凡存放于对应Role的Files目录下的文件,传输时只需指定相对路径即可,这很大程度解决了管理机故障迁移时Ansible的健壮性,同时也从规则上使使用者有意规范自己的文件存放习惯。在企业中我们不仅仅会遇到文件传输的需求,如对于应用的配置文件,针对不同的主机需要进行相应的配置变更该怎么办呢?Templates可以满足我们需求,接下来我们来深入了解Templates。