Ansible中的执行控制

##一.循环##
#循环迭代任务#
#1.简单循环#

loop:		       ##赋值列表
  - value1
  - value2
  - ...
  {{item}}	##迭代变量名称

实例

---
- name: playbook test
  hosts: 172.25.6.1
  tasks:
    - name: test
      file:
        name: /mnt/{{item}}
        state: touch

      loop:
        - westos_file1
        - westos_file2
~                       

在这里插入图片描述
在这里插入图片描述

#2.循环散列或字典列表#

---
- name: playbook test
  hosts: 172.25.6.1
  tasks:
    - name:
      dnf:
        name: "{{ item.name }}"
        state: "{{ item.state }}"
      loop:
        - name: httpd
          state: latest
        - name: vsftpd
          state: latest

在这里插入图片描述
##二.条件##

when:
  - 条件1
  - 条件2

#条件判断#
=			value == "字符串",value == 数字
<			value <  数字
>			value >  数字
<=			value <= 数字
>=			value >= 数字 
!=			value != 数字
is defined value	value is defined	变量存在
is not defined		value is not defined	变量不存在
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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
##三.触发器##
notify: 触发器当遇到更改是触发handlers

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

---
- name: playbook test
  hosts: 172.25.6.1
  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

在这里插入图片描述
在这里插入图片描述
#四.处理失败任务#
#1.ignore_errors#
#作用:
当play遇到任务失败是会终止
ignore_errors: yes 将会忽略任务失败使下面的任务继续运行

---
- name: test
  hosts: 172.25.6.1
  ignore_errors: no
  tasks:
    - name: dnf
      dnf:
        name: westos
        state: latest
    - name: create file
      file:
        path: /mnt/westos
        state: touch

在这里插入图片描述
在这里插入图片描述
#2.force_handlers#
#作用:
#当任务失败后play被终止也会调用触发器进程

---
- name: apache change port
  hosts: 172.25.6.1
  force_handlers: yes
  vars:
    http_port: 80
  tasks:
    - name: configure appache conf
      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.6.1
  force_handlers: yes
  vars:
    http_port: 80
  tasks:
    - name: configure appache conf
      lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: "^Listen"
        line: "Listen {{http_port}}"
      changed_when: true
      notify: restart apache
    - name: install error
      dnf:
        name: westos
        state: latest
  handlers:
    - name: restart apache
      service:
        name: httpd
        state: restarted
        enabled: yes     

在这里插入图片描述
在这里插入图片描述
#4.failed_when#
#当符合条件时强制任务失败

---
- name: test
  hosts: 172.25.6.1
  tasks:
    - name: shell
      shell: echo hello
      register: westos
      failed_when: "'hello' in westos.stdout"

在这里插入图片描述
在这里插入图片描述
#5.block#
block: ##定义要运行的任务
rescue: ##定义当block句子中出现失败任务后运行的任务
always: ##定义最终独立运行的任务
实例:
建立playbook ~/westos.yml要求如下:
建立大小为1500M名为/dev/vdb1的设备
如果/dev/vdb不存在请输入:
/dev/vdb is not exist
如果/dev/vdb大小不足1.5G请输出:
/dev/vdb is less then 1.5G
并建立800M大小的/dev/vdb1
此设备挂载到/westos上

---
- name: fdisk
  hosts: all
  tasks:
    - name: check
      debug:
        msg: "{{ansible_facts.enp1s0.ipv4.address}} is not exist with /dev/vdb"
      when: ansible_facts.devices.vdb is not defined
    - name: create disk
      block:
        - name: create 1500M
          parted:
             device: /dev/vdb
             number: 1
             state: present
             part_end: 1500MiB
          when: ansible_facts.devices.vdb is defined
      rescue:
        - name: disk 800
          parted:
             device: /dev/vdb
             number: 2
             state: present
             part_end: 800MiB
          when: ansible_facts.devices.vdb is defined
      always:
        - name: xfs
          filesystem:
             dev: /dev/vdb1
             fstype: xfs
        - name: mounted
          mount:
            path: /westos
            src: /dev/vdb1
            fstype: xfs
            state: mounted

在这里插入图片描述
红色是block
蓝色是rescue
绿色是always

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值