Как зациклить несколько зависимых задач в Ansible

Я пытаюсь иметь 2 задачи, используя одни и те же переменные, но вторая задача зависит от результата первой задачи. Если я использую регистр, чтобы отметить результат первой задачи, я в конечном итоге создаю список, который вторая задача не может эффективно использовать, поскольку он создает отношение цикла «многие ко многим», когда я просто хочу, чтобы элемент сначала запускался в обеих задачах, а затем второй элемент для запуска в обеих задачах, затем 3-й и т.д..

Например, выполните поиск, если каталог существует, и если он существует, измените его разрешения. У меня есть список каталогов, которые нужно просмотреть, чтобы проверить, существуют ли они, а затем изменить эти разрешения. Как мне зациклить его в Ansible, чтобы он проходил только по каждому из них в списке в каждой задаче? Ниже моя последняя попытка.

- hosts: localhost
  vars:
    folders_to_change:
      - /Users/Documents/test_folder1
      - /Users/Documents/test_folder2
  tasks:
  - name: Ansible check file exists example.
    stat:
      path: "{{ item }}"
    register: file_details
    loop:
      "{{ folders_to_change }}"

  - name: Change permissions of folder
      file:
        path: "{{ folders_to_change[{{ item }}] }}"
        owner: root
        group: root
        mode: 777
        state: directory
    when: file_details.stat.exists.isdir["{{ item }}"]
    loop:
      "{{ range(0 - folders_to_change|len }}"

у меня проблемы с пониманием задачи file, которую вы придумали. Ваша цель — выяснить, существуют ли 2 папки в folders_to_change, и если да, запустить для них задачу file?

ilias-sp 16.12.2020 16:04

Да, это правильно

fmakawa 17.12.2020 11:34
Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
1
2
1 099
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы близки, но у вас есть несколько неуместных вещей.

["{{ item }}"] расположен не в том конце выражения, так как isdir — это просто атрибут, а не список, а file_details.results — это list

    when: file_details.results[item].stat.isdir

Также нет необходимости задействовать усы jinja2, так как when: уже является выражением jinja2, и уж точно не нужно заключать в кавычки int при испускании range.

Что подводит нас к следующему пункту: диапазон требует два аргумента, но вы указали выражение 0 - len, которое будет находиться в диапазоне от отрицательного числа. Начальный 0 подразумевается, так что просто опустите его:

    when: file_details.results[item].stat.isdir
    loop:
      "{{ range(folders_to_change|length) }}"

Наконец, если вы предпочитаете этот стиль постоянного использования range и более простого обращения к глобальной переменной, у вас больше возможностей, но список results отслеживает исходный ключ item в своих dict записях, таким образом:

  - name: Change permissions of folder
    file:
        path: "{{ item.item }}"
        owner: root
        group: root
        mode: 777
        state: directory
    when: item.stat.isdir
    loop: "{{ file_details.results }}"

Вы действительно выиграете от некоторого использования debug: var=file_details (или чего-то еще) в будущем, чтобы посмотреть на форму доступных вам данных.

быстрое исправление-> когда: item.stat.exists.isdir не работает, так как он логический и не имеет атрибута isdir. удалить это, и это работает. В интересах сделать код максимально пригодным для повторного использования - как бы я добавил владельца и группу как часть подсписка файлов, т.е. ["/Users/Documents/test_folder1","root","root"] таким образом, я может иметь разные разрешения для каждого файла. Я пытался использовать «item.item.1» и «item.item.2», но это дало мне только «/» и «U».

fmakawa 17.12.2020 20:14

Да, извините за это - слишком много копи-пасты из исходного вопроса, недостаточно размышлений :-) что касается вашего последующего вопроса, это будет сделка типа vars: { folders_to_change: [ { path: /Users/Documents/test_folder1, user: root, group: root } ] }, а затем соответствующим образом обновите ссылки на атрибуты.

mdaniel 18.12.2020 08:02

Другие вопросы по теме