Today is a beautifu|

caibutou

园龄:5年10个月粉丝:17关注:8

Ansible之handler和notify结合触发条件

handlers和notify结合使用触发条件

·Handlers(触发器)

  是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作。

·Notify(通知)

  此action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成最后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。

·以http服务为例

复制代码
---
- hosts: websrvs
  remote_ user: root

  tasks :
     - name: install httpd package
       yum: name=httpd
     - name: copy conf file 
       copy: src=files/httpd. conf de st=/etc/httpd/conf/ backup=yes
       notify: 
      - restart service#起到通知作用
- name: start service service: name=httpd state=started enab led=yes handlers:#这个是触发器 - name: restart service service: name=httpd state=restarted
复制代码

 ·playbook中的tags使用(创建标签)

 

复制代码
---
- hosts: websrvs
  remote_ user: root

  tasks :
     - name: install httpd package
       yum: name=httpd
     - name: copy conf file 
       copy: src=files/httpd. conf de st=/etc/httpd/conf/ backup=yes
       notify: 
      - restart service#起到通知作用
       tags: inshttpd#创建便签,可以通过名字调用上面的内容
     - name: start service
       service: name=httpd state=started enab led=yes
  handlers:#这个是触发器
     - name: restart service
       service: name=httpd state=restarted
复制代码

 

···可以通过调用标签单独执行角色里面的内容···

ansible-playbook -t inshttpd httpd.yml#-t是指定要执行的标签,多个标签用逗号隔开,多个标签可以定义一样的名字

playbook中的变量

  变量名:仅能由字母、数字和下划线组成,且只能以字母开头

  变量来源:

    1.ansible setup facts 远程主机的所有变量都可以直接调用

    2.在/etc/ansible/hosts中定义

      普通变量:主机组中的主机单独定义,优先级高于公共变量

      公共组变量:针对主机组中所有主机定义统一变量

[webserver]
192.168.157.1
192.168.157.2 hosts1=25#普通变量
[webserver:vars]#定义组变量
nodname=www
dom=magendu.com

    3.通过命令行执行指定变量,优先级最高 

复制代码
---
- hosts: websrvs
  remote_ user: root

  tasks :
     - name: install httpd package
       yum: name={{变量}}
     - name: start service
       service: name={{变量}} state=started enabled=yes
ansible-playbook -e '变量=httpd' http.yml#多个变量执行时,用空格隔开
复制代码

    4.在playbook中定义

    vars:

    - var1:value1

    - var2:value2

复制代码
---
- hosts: websrvs
  remote_ user: root
  vars:
     - pkname1: httpd
     - pkname1: vsftp

  tasks :
     - name: install httpd package
       yum: name={{pkname1}}
     - name: start service
       service: name={{pkname2}} state=started enabled=yes
复制代码

    5.在role中定义

    6.可以在一个文件中定义许多变量

vim vasr.yml
var1: httpd
var2: vsftp

在使用的时候需要指定

复制代码
---
- hosts: 10.6.12.56
  remote_user: root
  vars_files: 
      - vars.yml

  tasks:
     - name:install package
       yum: name={{ var1 }}
复制代码

模板templates

·文本文件,嵌套由有脚本(使用模板编程语言编写)

·jinja2语言,使用字面量,有下面形式

  字符串:使用单引号或双引号

  数字:整数,浮点数

  列表:[item1,item2,。。。]

  元组:(item1,item2,。。。)

  字典:{item1,item2,。。。}

  布尔型:true/false

·算数运算:+,-,*,/,//,%,**

·比较操作:==,!=,>,>=,<,<=

·逻辑运算:and,or,not

·流表达式:For If When

·在选取文件当模板的时候需要改名,一般以j2当文件后缀,并将文件放在templates文件目录下

  以管理nginx为例

复制代码
---
- hosts: 10.6.12.53
  renout_user: root

  tasks:
     - name:  install package
        yum: name=nginx
     - name: copy template
        templates:  src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
     - name: start service
       service: name=nignx start=stared enabled=yse
复制代码

when

  条件测试:如果需要根据变量,facts或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法式。

·when语句

·在task后添加wen子句即可使用条件测试;when语句支持jinja2表达式语法

复制代码
---
- hosts: 10.6.12.53
  renout_user: root

  tasks:
     - name:  install package
        yum: name=nginx
     - name: copy template
        templates:  src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
        when: ansible_distribution_major_version=="7"#当符合这个条件就执行上面
     - name: start service
       service: name=nignx start=stared enabled=yse
复制代码

本文作者:caibutou

本文链接:https://www.cnblogs.com/zrxuexi/p/11722796.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   caibutou  阅读(6762)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起