实施任务控制

实施任务控制

1.编写循环和条件任务

1.1 利用循环迭代任务

通过利用循环,我们无需编写多个使用同一模块的任务。

Ansible支持使用loop关键字对一组项目迭代任务。可以配置循环以利用列表中的各个项目、列表中各个文件的内容、生成的数字序列或更为复杂的结构来重复任务。

1.2 简单循环

简单循环对一组项目迭代任务。loop关键字添加到任务中,将应对其迭代任务的项目列表取为值。循环变量item保存每个迭代过程中使用的值。

playbook中使用循环:

---
- name: loop
  hosts: all
  gather_facts: no
  tasks:
    - name: 启动服务
      service:
        name: "{{ item }}"
        state: started
        
      loop:
        - httpd
        - mariadb

使用变量方式编写:

---
- name: 构建lamp
  hosts: 192.168.237.168
  gather_facts: no
  vars_files:		//指定变量文件位置
    - /etc/ansible/playbook/vars/service_vars.yml
  tasks:
    - name: "{{ install_service }}"	//引用变量
      yum:
        name: "{{ item }}"		//循环
        state: present
      loop: "{{ install_service }}"

    - name: "{{ start_service }}"
      service:
        name: "{{ item }}"		//循环
        state: started
        enabled: yes
      loop: "{{ start_service }}"

1.3 循环散列或字典列表

loop列表不需要是简单值列表。在以下示例中,列表中的每个项实际上是散列或字典。示例中的每个散列或字典具有两个键,即name和groups,当前item循环变量中每个键的值可以分别通过item.name和item.groups变量来检索。

---
- name: loop
  hosts: all
  gather_facts: no
  tasks:
    - name: create user 
      user:
        name: "{{ item.name }}"
        state: present
        groups: "{{ item.groups }}"
        
      loop:
        - name: akl
          group: za
        - name: weien
          group: cx

[root@localhost ansible]# ansible-playbook playbook/loop.yml 

PLAY [loop] *********************************************************************************************

TASK [create user] **************************************************************************************
changed: [localhost] => (item={'name': 'akl', 'groups': 'za'})
changed: [localhost] => (item={'name': 'weien', 'groups': 'cx'})

PLAY RECAP **********************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

1.4 较早样式的循环关键字

在Ansible2.5之前,大多数playbook使用不同的循环语法。提供了多个循环关键字,前缀为whth_,后面跟Ansible查找插件的名称。

较早样式的Ansible循环

循环关键字 描述
with_items 行为与简单列表的loop关键字相同,例如字符串列表或散列/字典列表。
但与loop不同的是,如果为with_items提供了列表的列表,它们将被扁平化为单级列表。循环变量item保存每次迭代过程中使用的列表项。
with_file 此关键字需要控制节点文件名列表。循环变量item在每次迭代过程中保存文件列表中相应文件的内容。
with_sequence 此关键字不需要列表,而是需要参数来根据数字序列生成值列表。
循环变量item在每次迭代过程中保存生成的序列中的一个生成项的值。

示例:

vars:
  data:
    - user0
    - user1
    - user2
tasks:
  - name: "with_items"
    debug:
      msg: "{{ item }}"
    with_items: "{{ data }}"

1.5 将Register变量与Loop一起使用

register关键字也可以捕获循环任务的输出。以下代码片段显示了循环任务中register变量的结构:

---
- name: Loop Register Test
  gather_facts: no
  hosts: all
  tasks:
    - name: Looping Echo Task
      shell: "echo This is my item: {{ item }}"
      loop:
        - one
        - two
      register: echo_results    # 注册echo_results变量

    - name: Show echo_results variable		//显示变量echo_results
      debug:
        var: echo_results		# echo_results变量的内容显示在屏幕上

[root@localhost ansible]# ansible-playbook loop.yml 

PLAY [Loop Register Test] *******************************************************************************

TASK [Looping Echo Task] ********************************************************************************
changed: [localhost] => (item=one)
changed: [localhost] => (item=two)
......
                    }
                },
                "item": "one",
                "rc": 0,
                "start": "2021-07-27 08:40:00.624946",
                "stderr": "",
                "stderr_lines": [],
                "stdout": "This is my item: one",
                "stdout_lines": [
                    "This is my item: one"
......
                "item": "two",
                "rc": 0,
                "start": "2021-07-27 08:40:00.946702",
                "stderr": "",
                "stderr_lines": [],
                "stdout": "This is my item: two",
                "stdout_lines": [
                    "This is my item: two"
                ]
            }
        ]
    }
}

PLAY RECAP **********************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
上一篇:前端学习第十三天


下一篇:Loop Energy为中国南京市公交车队提供燃料电池,创下超过7.5万公里的运营里程记录