Я пытаюсь иметь 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 }}"
Да, это правильно
Вы близки, но у вас есть несколько неуместных вещей.
["{{ 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».
Да, извините за это - слишком много копи-пасты из исходного вопроса, недостаточно размышлений :-) что касается вашего последующего вопроса, это будет сделка типа vars: { folders_to_change: [ { path: /Users/Documents/test_folder1, user: root, group: root } ] }
, а затем соответствующим образом обновите ссылки на атрибуты.
у меня проблемы с пониманием задачи
file
, которую вы придумали. Ваша цель — выяснить, существуют ли 2 папки вfolders_to_change
, и если да, запустить для них задачуfile
?