Я зіткнувся з тим же питанням. У моєму випадку частина моїх змінних знаходилась у словнику, тобто with_dict змінної (цикл), і мені доводилося запускати по 3 команди на кожному item.key. Це рішення є більш доречним, коли вам доводиться використовувати словник with_dict із запуском декількох команд ( не вимагаючи with_items )
Використання with_dict та with_items в одному завданні не допомогло, оскільки воно не вирішувало змінні.
Моє завдання було таким:
- name: Make install git source
command: "{{ item }}"
with_items:
- cd {{ tools_dir }}/{{ item.value.artifact_dir }}
- make prefix={{ tools_dir }}/{{ item.value.artifact_dir }} all
- make prefix={{ tools_dir }}/{{ item.value.artifact_dir }} install
with_dict: "{{ git_versions }}"
role / git / за замовчуванням / main.yml було:
---
tool: git
default_git: git_2_6_3
git_versions:
git_2_6_3:
git_tar_name: git-2.6.3.tar.gz
git_tar_dir: git-2.6.3
git_tar_url: https://www.kernel.org/pub/software/scm/git/git-2.6.3.tar.gz
Вищезазначене призвело до помилки, подібної до наведеної нижче, для кожного {{item}} (для 3 команд, як зазначено вище). Як бачите, значення tools_dir не заповнюються (tools_dir - це змінна, яка визначена за замовчуванням загальної ролі / main.yml, а також значення item.value.git_tar_dir не заповнено / вирішено).
failed: [server01.poc.jenkins] => (item=cd {# tools_dir #}/{# item.value.git_tar_dir #}) => {"cmd": "cd '{#' tools_dir '#}/{#' item.value.git_tar_dir '#}'", "failed": true, "item": "cd {# tools_dir #}/{# item.value.git_tar_dir #}", "rc": 2}
msg: [Errno 2] No such file or directory
Рішення було простим. Замість того, щоб використовувати модуль "КОМАНДА" в Ansible, я використав модуль "Оболонка" і створив змінну в role / git / defaults / main.yml
Отже, тепер role / git / defaults / main.yml виглядає так:
---
tool: git
default_git: git_2_6_3
git_versions:
git_2_6_3:
git_tar_name: git-2.6.3.tar.gz
git_tar_dir: git-2.6.3
git_tar_url: https://www.kernel.org/pub/software/scm/git/git-2.6.3.tar.gz
#git_pre_requisites_install_cmds: "cd {{ tools_dir }}/{{ item.value.git_tar_dir }} && make prefix={{ tools_dir }}/{{ item.value.git_tar_dir }} all && make prefix={{ tools_dir }}/{{ item.value.git_tar_dir }} install"
#or use this if you want git installation to work in ~/tools/git-x.x.x
git_pre_requisites_install_cmds: "cd {{ tools_dir }}/{{ item.value.git_tar_dir }} && make prefix=`pwd` all && make prefix=`pwd` install"
#or use this if you want git installation to use the default prefix during make
#git_pre_requisites_install_cmds: "cd {{ tools_dir }}/{{ item.value.git_tar_dir }} && make all && make install"
а завдання task / git / tasks / main.yml виглядає так:
- name: Make install from git source
shell: "{{ git_pre_requisites_install_cmds }}"
become_user: "{{ build_user }}"
with_dict: "{{ git_versions }}"
tags:
- koba
Цього разу значення були успішно замінені, оскільки модуль мав значення "SHELL", а відповідні результати відображали правильні значення. Для цього не потрібен цикл with_items:.
"cmd": "cd ~/tools/git-2.6.3 && make prefix=/home/giga/tools/git-2.6.3 all && make prefix=/home/giga/tools/git-2.6.3 install",
shell
модулем. Якщо ви прочитаєте документи в командному модулі, то побачите, чому це не працює. (не повна відповідь до н.е., я не тестував)