5.5_Ansible中的任务执行控制

##1.循环##

#循环迭代任务#

(1)简单循环

复制代码
loop:
  - value1    ##赋值列表
  - value2
  - ...

{{item}}      ##迭代变量名称

#实例#
---
- name: create file
  hosts: 172.25.0.254
  tasks:
    - name: file module
      file:
        name: /mnt/{{item}}
        state: present
      
      loop:
        - westos_file1
        - westos_file2

(2)循环散列或字典列表

复制代码
---
- name: create file
  hosts: 172.25.0.254
  tasks:
    - name: file module
      service:
        name: "{{ item.name}}"
        state: "{{ item.state }}"
      
      loop:
        - name: httpd
          state: started
        - name: vsftpd
          state: stopped

测试:

安装并开启vsftpd、apache、dns,并在火墙中允许这些服务访问。

##2.条件##

复制代码
when:
  - 条件1
  - 条件2 

#条件判断#
 =    value == "字符串",value == 数字
 <    value <  数字
 >    value >  数字
 <=   value <= 数字
 >=   value >= 数字 
 !=   value != 数字
 is defined value   value is defined        变量存在
 is not defined     value is not defined    变量不存在
 in                 value is in value       变量为   
not in              value is not in value   变量不为
bool变量 为true      value                   value的值为true
bool变量 false       not value               value的值为false
                     value in value2        value的值在value2列表中

复制代码
#多条条件组合#
when:
  条件1 and 条件2
  - 条件1
  - 条件2

when:
  条件1 or 条件2
 
when: >
  条件1
  or
  条件2

测试题:

建立playbook ~/ansibles/lvm.yml要求如下:

*建立大小为1500M名为exam_lvm的lvm 在westos组中

*如果westos不存在请输出:

vg westos is not exist

*如果westos大小不足1500M请输出:

vg westos is less then 1500M

并建立800M大小的lvm

##3.触发器##

notify: 触发器当遇到更改时触发handlers

handlers:触发器触发后执行的动作

复制代码
#实例#---- name: create virtualhost for web server
  hosts: 172.25.0.254
  vars_files:
    ./vhost_list.yml
  tasks:
    - name: create document
      file:
        path: "{{web2.document}}"
        state: directory
    - name: create vhost.conf
      copy:
        dest: /etc/httpd/conf.d/vhost.conf
        content:
          "<VirtualHost *:{{web1.port}}>\n\tServerName {{web1.name}}\n\tDocumentRoot 
{{web1.document}}\n\tCustomLog logs/{{web1.name}}.log combined\n</VirtualHost>\n\n<VirtualHost *:
 {{web2.port}}>\n\tServerName {{web2.name}}\n\tDocumentRoot {{web2.document}}\n\tCustomLog logs/
 {{web2.name}}.log combined\n</VirtualHost>"
      notify:
        restart apache
 
  handlers:
    - name: restart apache
      service:
        name: httpd
        state: restarted

#4.处理失败任务#

(1)ignore_errors

#作用:

当play遇到任务失败是会终止

ignore_errors: yes将会忽略任务失败使下面的任务继续运行

复制代码
#实例#
- name: test
  dnf:
    name: westos
    state: latest
  ignore_errors: yes
  
- name: create file
  file:
    path: /mnt/westos
    state: touch

(2)force_handlers#

#作用:

#当任务失败后play被终止也会调用触发器进程

复制代码
#example
---
- name: apache change port
  hosts: 172.25.0.254
  force_handlers: yes
  vars:
    http_port: 80
  tasks:
    - name: configure apache conf file
      lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: "^Listen"
        line: "Listen {{ http_port }}"
      notify: restart apache
    
    - name: install error
      dnf:
        name: westos
        state: latest
 
  handlers:
    - name: restart apache
      service:
        name: httpd
        state: restarted
        enabled: yes

(3)changed_when#

#作用:

#控制任务报告它已进行更改

复制代码
#实例
---
- name: apache change port
  hosts: 172.25.0.254
  force_handlers: yes
  vars:
    http_port: 8080
  tasks:
    - name: configure apache conf file
      lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: "^Listen"
        line: "Listen {{ http_port }}"
      changed_when: true
      notify: restart apache
  
  handlers:
    - name: restart apache
      service:
        name: httpd
        state: restarted
        enabled: yes

(4)failed_when#

#当符合条件时强制任务失败

复制代码
---
  - name: test
  hosts: 172.25.0.254
  tasks:
    - name: shell
      shell: echo hello
      register: westos
      failed_when: "'hello' in westos.stdout"

(5)block

block: ##定义要运行的任务

rescue: ##定义当block句子中出现失败任务后运行的任务

always: ##定义最终独立运行的任务

#测试练习#

挂载/dev/cdrom到/mnt/isodir里

如果/mnt/isodir不存在 -----> /mnt/isodir is not exist -----> create /mnt/isodir

如果/mnt/isodir存在 -----> 直接挂载

相关推荐
超绝振刀怪2 分钟前
【Linux工具】环境基石:软件包管理器 yum 与 Vim 编辑器详解
linux·编辑器·vim
UVM_ERROR25 分钟前
UVM实战:RDMA Host侧激励开发全流程问题排查与解决
服务器·网络·数据库
福尔摩斯张32 分钟前
插件式架构:解耦与扩展的艺术与实践(超详细)
linux·服务器·网络·网络协议·tcp/ip
txzz888841 分钟前
CentOS-Stream-10 搭建YUM源Web服务器
linux·运维·centos·yum源·linux系统更新·centos系统更新·自建web yum源
Molesidy1 小时前
【Linux】基于Imx6ull Pro开发板和platform_device+platform_driver框架的LED驱动设计以及上机测试
linux·驱动开发
我科绝伦(Huanhuan Zhou)1 小时前
Linux系统硬件时钟与系统时钟深度解析及同步实操指南
linux·运维·服务器
k***92161 小时前
【Linux】进程概念(六):地址空间核心机制
linux·运维·算法
李白同学1 小时前
Linux:调试器-gdb/cgdb使用
linux·服务器·c语言·c++
保持低旋律节奏1 小时前
linux——进程调度(时间片+优先级轮转调度算法O(1))
linux·运维·算法
浔川python社2 小时前
《C++ 小程序编写系列》(第四部):实战:简易图书管理系统(类与对象篇)
java·开发语言·apache