Есть ли способ отфильтровать ansible в зависимости от условий - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть эти переменные в плейбуке и несколько задач, я просто хочу отфильтровать элементы из списка переменных на основе ввода подсказок. Прямо сейчас я должен исключить этот элемент, используя когда из нескольких задач. Пожалуйста, смотрите следующий пример:

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 Ответ

1 голос
/ 23 апреля 2020

Я бы взял проблему в обратном порядке: вместо того, чтобы фильтровать мой список для каждой задачи, чтобы потенциально вынести элемент, я бы определил свой список с элементами по умолчанию и добавил дополнительный, если пользователь ответил да.

Примечание: ваши два списка идентичны, я сохранил только один в следующем примере:

---
- 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 для приведения значения к логическому
    • , и я использовал фильтр ternary , чтобы выбрать один список элементов, если он истинный (['etcd']), и пустой список, если ложь ([]) .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...