有没有一种方法可以根据条件过滤ansvar

时间:2020-04-22 20:11:15

标签: ansible

我在剧本中有这个var,并且有多个任务,我只想根据提示输入从vars列表中过滤项目。现在,我必须从多个任务中使用when排除该项目。请参见以下示例:

vars_prompt:
    - name: rmetcd
      prompt: "remove etcd: YES OR NO?"
      private: no

vars:
    containers:
      - "etcd"
      - "mysql"
      - "postgres"

    folders:
      - "etcd"
      - "mysql"
      - "postgres"
tasks:
    - name: remove container
         shell: "docker rm -f {{ item }}"
         with_items: "{{ containers }}"
         when: 
           - '"etcd" not in item' 

    - name: remove folder
         file:
           path: "{{ item }}"
           state: absent
         with_items: "{{ folders }}"
         when: 
           - '"etcd" not in item' 

 when: rmetcd == "NO"

1 个答案:

答案 0 :(得分:1)

我会以相反的顺序解决问题:我不会为每个任务过滤列表以潜在地取出一个元素,而是会使用默认元素定义列表,并在用户回答是的情况下添加其他元素。

注意:您的两个列表相同,在下面的示例中,我仅保留了一个列表:

---
- hosts: localhost
  gather_facts: false

  vars_prompt:
    - name: rmetcd
      prompt: "Remove etcd [yes/no]?"
      private: no

  vars:
    _default_services:
      - mysql
      - postgres

    services: "{{ _default_services + (rmetcd | bool | ternary(['etcd'], [])) }}"

  tasks:
    - name: task1
      debug:
        msg: "remove container {{ item }}"
      loop: "{{ services }}"

    - name: taks2
      debug:
        msg: "remove folder {{ item }}"
      loop: "{{ services }}"

要点:

  • 我定义了一个“私有”变量_default_services。这是将始终包含的服务列表。
  • 我计算了变量services,它是两个列表的加法:_default_services和根据用户输入要添加的附加值。对于这最后一个:
    • 我使用了rmetcd包含值(应为“是”或“否”)
    • 我应用了bool filter将值转换为布尔值
    • 然后我使用ternary filter选择单个元素列表(如果为true,则为['etcd']),如果是false,则使用空白列表([])。