我遇到了同样的问题。就我而言,我的部分变量在字典中,即with_dict变量(循环),我必须在每个item.key上运行3个命令。在必须使用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 }}"
角色/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
对于每个{{item}},上面的结果导致类似于以下错误(对于上述3个命令)。如您所见,tools_dir的值未填充(tools_dir是在常见角色的defaults / 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中的“ COMMAND”模块,而是使用了“ Shell”模块,并在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"
任务角色/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”,并且ansible输出回显了正确的值。这不需要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
模块。如果您阅读命令模块上的文档,您将了解为什么它不起作用。(不是完整的答案,因为我还没有测试过)