Ansible中的任务执行控制

本文介绍了Ansible配置管理中使用循环、条件判断(如when、equals、in等)、处理任务失败(ignore_errors、force_handlers、changed_when、failed_when)以及block结构的应用实例。
摘要由CSDN通过智能技术生成

目录

循环

简单循环

循环散列或字典列表

条件

触发器

处理失败任务

ignore_errors

force_handlers

 changed_when

failed_when

block


循环

简单循环

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


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

循环散列或字典列表

- name: create file
  hosts: host1
  tasks:
  - name: file moudle
    service:
      name: "{{ item.name }}"
      state: "{{ item.state }}"
    loop:
    - name: httpd
      state: started
    - name: vsftpd
      state: stopped
~

条件

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

 多条条件组合

when:
 条件1 and 条件2
 - 条件1
 - 条件2            //当条件1和条件2都为真

when:
 条件1 or 条件2        //满足其中一个

when: >
 条件1
 or
 条件2                //满足其中一个

 创建两个用户 user1 和 user2, user1 的 UID 是 6666,注释是 user1 commentuser2 的 UID 是 7777,没有注释。

vim userlist.yml
userlist:
  - name: user1
    id: 6666
    comment: user1 comment
  - name: user2
    id: 7777

vim usercreate.yml
- name: create user
  hosts: all
  vars_files: ./userlist.yml
  tasks:
    - name: create user with comment
      user:
        name: "{{item.name}}"
        uid: "{{item.id}}"
        comment: "{{item.comment}}"
        state: present
      when: item.comment is defined
      loop:
        "{{userlist}}"

    - name: create user without comment
      user:
        name: "{{item.name}}"
        uid: "{{item.id}}"
        state: present
      when: item.comment is not defined
      loop:
        "{{userlist}}"

触发器

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

 在指定的服务器上部署网站,并创建一个简单的主页

vim webs.yml
webs:
  - name: bbs.westos.org
    doc: /var/www/virtual/westos.org/bbs/html
    index: "bbs.westos.org's page"

  - name: login.westos.org
    doc: /var/www/virtual/westos.org/login/html
    index: "login.westos.org's page"

  - name: www.westos.org
    doc: /var/www/html
    index: "www.westos.org's page"

vim html.j2
{% for web in webs %}
{% if web.name is not defined %}
<VirtualHost _default_:80>
{% elif web.name is defined %}
<VirtualHost *:80>
        ServerName {{web.name}}
{% endif %}
        DocumentRoot {{web.doc}}
</VirtualHost>
{% endfor %}

vim web.yml
- name: Create website index page
  hosts: all
  vars_files: ./webs.yml

  tasks:
    - name: install httpd
      yum:
        name: httpd
        state: present

    - name: service
      service:
        name: httpd
        state: started
        enabled: no

    - name: Create index.html for each website
      template:
        src: ./html.j2
        dest: "/etc/httpd/conf.d/vhost.conf"
      notify: restart httpd

    - name: create directory
      lineinfile:
        path: "{{item.doc}}/index.html"
        line: "{{ item.index }}"
        create: yes
      loop: "{{webs}}"

  handlers:
    - name: restarted httpd
      service:
        name: httpd
        state: restarted

处理失败任务

ignore_errors

作用:当play遇到任务失败时会终止

ignore_errors:yes        //将会忽略任务失败使下面的任务运行
- name: ignore
  hosts: all
  tasks:
    - name: test file
      shell: test -e /mnt/test
      ignore_errors: no/yes
    - debug:
        msg: hello

force_handlers

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

- name: ignore
  hosts: all
  force_handlers: yes
  tasks:
    - name: test file
      shell: test -e /mnt/test
      notify: DEBUG
    - name: error
      yum:
        name: haha
  handlers:
    - name: DEBUG
      debug:
        msg: hello

 changed_when

作用:控制任务在何时报告它已进行更改,用于指定一个条件,当这个条件成立时,任务将被标记为已更改。

- name: ignore
  hosts: all
  force_handlers: yes
  tasks:
    - name: test file
      lineinfile:
        path: /mnt/test
        line: "hello    world"
      notify: DEBUG
      changed_when: false
  handlers:
    - name: DEBUG
      debug:
        msg: hello

failed_when

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

- name: ignore
  hosts: all
  force_handlers: yes
  tasks:
    - name: test file
      shell: echo hello
      register: HA
      failed_when: "'hello' in HA.stdout"

block

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

给/dev/sdb分区,如果/dev/sdb不存在请输入:/dev/sdb is not exist ,如果/dev/sdb不足1.5G请输出/dev/sdb is less than 1.5G

并建立800M大小的/dev/sdb1,挂载到/westos上

- name: fdisk
  hosts: all
  vars:
    mount_point: /westos
    device: /dev/sdb
  tasks:
    - name: Check if device exists
      stat:
        path: "{{ device }}"
      register: device_stat
      ignore_errors: yes

    - name: Fail if device does not exist
      debug:
        msg: "/dev/sdb is not exist"
      when: not device_stat.stat.exists

    - name: create /dev/sdb1
      block:
        - name: create 1500M
          parted:
            device: "{{device}}"
            number: 1
            state: present
            part_end: 1500GiB
          when: device_stat.stat.exists
        - debug:
            msg: /dev/sdb is lee than 1.5G
      rescue:
        - name: create 800M
          parted:
            device: "{{device}}"
            number: 1
            state: present
            part_end: 800MiB
          when: device_stat.stat.exists
          notify:
            - Format partition
            - Mount partition
  handlers:
    - name: Format partition
      filesystem:
        fstype: ext4
        dev: "{{device}}1"
    - name: Mount partition
      mount:
        path: "{{ mount_point }}"
        src: "{{ device}}1"
        fstype: ext4
        state: mounted

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ansible 是一个流行的 IT 自动化工具,它使用 Playbook(剧本)来定义和执行配置管理任务,其核心概念之一就是任务委派(Task Delegation)。在 Ansible 任务委派允许管理员将责任委派给更具针对性的“子任务”或“模块”,这些模块可以在远程服务器上运行,而无需明确地指定每一步的操作细节。 任务委派主要体现在以下几个方面: 1. **Role-based Execution**: Ansible 通过 Roles(角色)来组织任务。一个 Role 包含一组预定义的配置、任务和变量,可以根据需要轻松地在多个 Playbook 复用。这样,你可以把一些常见的操作,如软件安装、服务管理等,封装成角色,然后在其他 Playbook 调用。 2. **Inventory Management**: Ansible 可以管理和控制多个服务器(Inventory),每个服务器可能有不同的配置需求。任务可以通过 Inventory 的 Host Patterns 或 Group Names 进行委派,确保只对特定的机器执行相关操作。 3. **Conditional Tasks**: 使用条件语句(如 `when`),你可以根据服务器的状态或变量值来决定是否执行某些任务。这种灵活的委派机制使得任务执行更加智能和高效。 4. **Module-based Approach**: Ansible 提供大量的预定义模块(Modules),用于完成各种操作,如文件管理、网络配置、应用部署等。管理员只需要调用合适的模块并传递参数,就可以让 Ansible 执行相应的任务。 相关问题: 1. Ansible 如何通过 Roles 来组织任务? 2. Inventory 在 Ansible 起到什么作用? 3. 什么是 Ansible 的 Inventory Management 并举例说明? 4. 何时会使用 `when` 条件语句来委派任务

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值