ansible中的任务执行控制

1 循环

循环迭代任务

1.1 简单循环

(1)格式

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

(2)loop使用的示例

  • 题目: 利用loop在受控主机建立多个文件
---
- name: loop
  hosts: list1
  tasks:
    - name: touch file
      file:
        path: /opt/{{item}} ##迭代变量
        state: touch
      loop:   ##赋值列表
        - file1
        - file2
...

在这里插入图片描述

测试结果

在这里插入图片描述

1.2 循环散列或字典列表

实例:

---
- name: loop
  hosts: list1
  tasks:
    - name: touch file
      file:
        path: /opt/{{item.name}}
        owner: "{{item.owner}}"
        state: touch
      loop:
        - name: file1    ##字典列表
          owner: westos
        - name: file2
          owner: root
...

测试

在这里插入图片描述

在这里插入图片描述

2 条件

格式:

	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

测试题:如果westos组不存在,报错;否则创建一个800M的lvm

查看lvm的信息:ansible list1 -m setup -a "filter=ansible_lvm"
在这里插入图片描述

在这里插入图片描述

---
- name: create lvm
  hosts: list1
  tasks:
    - name:
      debug:
        msg: "westos is not exit"
      when: ansible_facts['lvm']['vgs']['westos'] is not  defined ##如果westos的vg组不存在,提示不存在

    - lvol:
        vg: westos
        lv: westos
        size: 800
      when: ansible_facts['lvm']['vgs']['westos'] is   defined  ##创建一个800M的vg
---
- name: create lvm
  hosts: list1
  tasks:
    - name:
      debug:
        msg: "westos is not exit"
    - lvol:
        vg: westos
        lv: westos
        state: absent
        force: yes
      when: ansible_facts['lvm'] is defined

3 触发器

	notify:		触发器当遇到更改是触发handlers
	handlers:	触发器触发后执行的动作

实例:配置ftp服务

---
- name: config vsftpd
  hosts: list1
  tasks:
    - name: install vsftpd
      dnf:
        name: vsftpd
        state: present
    - name: config vsftpd.conf
      template:
        src: ./vsftpd.conf.j2
        dest: /etc/vsftpd/vsftpd.conf
      notify: restarted vsftpd  ##当j2文件更改时会触动handlers
    - name: config ftpdir
      file:
        path: /var/ftp/pub
        mode: '775'
        group: ftp
        setype: "public_content_rw_t"
    - name: set sebool
      seboolean:
        name: ftpd_anon_write
        state: yes
        persistent: yes
  handlers:
    - name: restarted vsftpd
      service:
        name: vsftpd
        state: restarted
        enabled: yes
...

在这里插入图片描述

4 处理失败任务

4.1 ignore_errors

	作用:当play遇到任务失败时会终止
	ignore_errors: yes	将会忽略任务失败使下面的任务继续运行
---
- name: config vsftpd
  hosts: list1
  tasks:
    - name:
      shell: rpm -q vsftpd  ##如果vstftp未安装,会报错
      ignore_errors: yes ##如果程序报错,会忽略错误,继续执行下面的命令
    - name: install vsftpd
      dnf:
        name: vsftpd
        state: present

...

在这里插入图片描述

4.2 force_handlers

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

配置完成

---
- name: config vsftpd
  force_handlers: yes ##执行过程中出错也会调用触发器进程,否则幸存程序将终止
  hosts: list1
  tasks:
    - name: install vsftpd
      dnf:
        name: vsftpd
        state: present
    - name: config vsftpd.conf
      template:
        src: ./vsftpd.conf.j2
        dest: /etc/vsftpd/vsftpd.conf
      notify: restarted vsftpd  ##当j2文件更改时会触动handlers
    - name: firewalld
      firewalld:
        service: vsftpd ##执行到此处时会出错
        permanent: yes
        state: enabled
  handlers:
    - name: restarted vsftpd
      service:
        name: vsftpd
        state: restarted
        enabled: yes

当 force_handlers: no,或没有此语句时:

在这里插入图片描述

当脚本中force_handlers: yes时:如果执行过程中任务失败也会启动触发器

在这里插入图片描述

4.3 changed_when

  • 作用:控制任务在何时报告它已进行更改
---
- name: config vsftpd
  force_handlers: yes
  hosts: list1
  tasks:
    - name: install vsftpd
      dnf:
        name: vsftpd
        state: present
    - name: config vsftpd.conf
      template:
        src: ./vsftpd.conf.j2
        dest: /etc/vsftpd/vsftpd.conf
      changed_when: true
      notify: restarted vsftpd
  handlers:
    - name: restarted vsftpd
      service:
        name: vsftpd
        state: restarted
        enabled: yes

不更改j2模板文件, changed_when: false或者未定义 changed_when时:
在这里插入图片描述
不更改j2模板文件,脚本中changed_when: true时:
在这里插入图片描述

4.4 failed_when

作用:当符合条件时强制任务失败

---
- name: config vsftpd
  force_handlers: yes
  hosts: list1
  tasks:
    - name: check vsft
      shell: rpm -q vsftpd
      register: vsftpd_status ##注册变量
      failed_when: vsftpd_status.rc==0 ##vsftp已经安装时强制任务失败
    - name: install vsftpd
      dnf:
        name: vsftpd
        state: present
    - name: restarted vsftpd
      service:
        name: vsftpd
        state: restarted
        enabled: yes

在这里插入图片描述

4.5 block

	block: 		##定义要运行的任务
	rescue:		##定义当block句子中出现失败任务后运行的任务
	always:	    ##定义最终独立运行的任务

练习题:

	建立大小为1500M名为/dev/vdb1的设备
	如果/dev/vdb不存在请输入:
	     /dev/vdb  is not exist
	如果/dev/vdb大小不足2G请输出:
	     /dev/vdb is less then 2G
	并建立800M大小的/dev/vdb1
	此设备挂载到/westos上
ansible list1 -m setup 

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

---
- name:
  hosts: list1
  tasks:
  - block:
    - name: create vdb 2G
      parted:
        device: /dev/vdb
        number: 1
        state: present
        part_end: 2GiB
    - name: delete vdb 2G
      parted:
        device: /dev/vdb
        number: 1
        state: absent
    - name: create vdb 1500MiB
      parted:
        device: /dev/vdb
        number: 1
        state: present
        part_end: 1500MiB
      when: ansible_facts['devices']['vdb'] is  defined
    rescue:
      - debug:
          msg: "vdb is less than 2G"
      - name: create vdb1 800MiB
        parted:
          device: /dev/vdb
          number: 1
          state: present
          part_end: 800MiB
    always:
      - name: Create filesystem on /dev/vdb1
        filesystem:
          fstype: xfs
          dev: /dev/vdb1
          force: yes
      - name: mount
        mount:
          path: /westos
          src: /dev/vdb1
          fstype: xfs
          opts: defaults
          state: present
     - name: vdb is not exit
       debug:
         msg: "vdb is not exit!!"
       when: ansible_facts['devices']['vdb'] is not defined

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值