playbook编写(三)

实施任务控制

在ansible playbook中管理任务控制 处理程序 任务错误

编写循环和条件任务 - loop

最近简单的写法(没有循环)
- name: start  httpd 
   service:   
       name:  httpd   
       state:  started 

- name: start firewlld 
    service:   
        name:  firewalld   
        state:  started    
Ansible 使用 loop 关键字对一组项目进行迭代,简单的循环             

        service:                     
            name: "{{ item }}"    --->item 循环变量                     
            state: started            
        loop:                     
            - httpd                     
            - firewalld     

方法二:


--- - name: Deploy and start Apache HTTPD service hosts: webserver vars: services: 变量名 - httpd - firewalld tasks: - name: install package yum: name: -
"{{ web_pkg }}" - "{{ firewall_pkg }}" state: latest - name: start service httpd service: name: "{{ item }}" state: started loop: "{{ services }}" - name: the firewall port for http is open firewalld: service: "{{ rule }}" permanent: yes state: enabled immediate: true

早期: 循环关键字: With_items    --->行为 loop 关键字相同   Ansible 版本不同,循环关键字不同 

循环散列或字典列表: 

--- 
- name: Create user group   
  hosts: servera.lab.example.com   
  become: true   
  tasks:           
    - name:  create user             
       user:                     
          name: "{{ item.name }}"                     
          state: present                     
          groups: "{{ item.groups }}"             
        loop:                     
          - name: natasha                       
          - groups: wheel     

将register(注册变量)与loop 一起使用

 有条件的运行任务

ansible 可以使用 conditionals 在符合特定条件时执行任务或play(when语句)

  如:在执行前先判断主机内存 是否 >= 384G 

条件任务语法

when 语句用于有条件的运行任务,他取要测试的条件作为值,如果条件满足则运行,否则就跳过任务

---
- name: simple boolean task demo
  hosts: all
  vars:
    run_my_task: true

  tasks:
    - name: httpd package is installed
        yum:
          name: httpd
        when: run_my_task

例如:测试my_service 变量是否有值,若有值,将 my_service 的值用作要安装的软件包的名称,如果未定义 my_service 变量,则跳过任务且不显示错误

---
- name: test variable is defind demo
  hosts: all
  vars:
     my_service: httpd

  tasks:
     - name: "{{ my_service }} package is installed "
        yum:
            name: "{{ my_service }}"
         when: my_service is defind 

 示例:

 第一个变量的值存在,作为第二个变量的列表的值

--- 
- name : demo   
  hosts: all   
  vars:           
    supported_distros:                   
        - Red Hat                   
        - CentOS   
  tasks:           
    - name: install httpd             
      yum:                     
        name: httpd                     
        state: latest             
    when: ansible_distribution in supported_distros

~ 注意点: When 语句的缩进,when 语法不是模块变量,它必须通过缩进到任务的最高级别,放置在 模块的外面

例子:组合使用 注册变量= register 和条件 when  任务详情:只有在postfix服务处于运行状态时才会重启httpd服务

- name: Restart HTTPD if Postfix is Running   
  hosts: all   
  become: true   
  tasks:           
    - name: Get Postfix server status             
      command: /usr/bin/systemctl is-active postfix    ----查看 postfix 是否运行             
      ignore_errors: yes  如果 command 这个模块的命令失败,则不停止运行             
      register: cloudshelledu (名字自定义)   将 command 模块的结果信息临时存储到 cloudshelledu 该变量中           

  - name: print debug
   debug:
     var:
cloudshelledu (注册变量的名字)
- name: Restart Apache HTTPD based on Postfx status             
      service:                     
        name: httpd                     
        state: restarted             
      when: cloudshelledu.rc == 0     如果 systemctl is-active postfix 命令代码为 0, 说明 postfix 服务是启动的,那么条件满足,重启 httpd 服务

小结:在写playbook时会经常用到 register注册变量 和 when 判断语句,为了判断上一段代码有没有执行成功,当用到when语句时多用到debug模块,将信息打印出来用于判断

注:archive (了解下这个模块)

配置服务,修改了服务的配置文件,重启该服务:

示例二:

notify 语句的触发条件: 取决于上面条件有没有对文件做修改,changed=1 ,才会触发, 由handlers 进行处理

handlers : - name:名字要和 上面notify 写的名字一致

原文地址:https://www.cnblogs.com/leading-net/p/13023166.html