我已经创建了一个辅助角色,可以从源代码构建软件包。但是,当我尝试将其包含在循环中时–遍历描述软件包的字典。它可以工作,但是当我将其包含在另一个角色的任务中时:
- name: Build packages
include_role:
name: native-package
loop: "{{ srcpkgs | dict2items }}"
loop_control:
loop_var: package
label: "{{ package.key }}"
when: srcpkgs is defined
srcpkg
是描述软件包的哈希。打包输入的一个示例是:
srcpkgs:
python:
ver: "3.7.0"
sha: "0382996d1ee6aafe59763426cf0139ffebe36984474d0ec4126dd1c40a8b3549"
url: "https://www.python.org/ftp/python/%%ver%%/Python-%%ver%%.tar.xz"
confargs: >-
--without-pymalloc
--disable-ipv6
--with-system-expat
--enable-optimizations
--with-lto
--prefix={{ prefix }}
--with-openssl={{ prefix }}
--with-ssl-default-suites=openssl
alltarg: profile-opt
env:
- 'GITTAG="echo builtFor={{ inventory_hostname }}"'
我看到,它一次应用于一台计算机,而不是并行应用于所有计算机(forks
设置为11
),这导致它花费不必要的时间:
TASK [include_role : native-package]
TASK [native-package : Create tmpdir]
ok: [host1]
TASK [native-package : Download package]
ok: [host1]
TASK [native-package : Extract]
ok: [host1]
... more tasks on host1 ...
TASK [native-package : Create tmpdir]
ok: [host2]
....
我希望输出为:
TASK [include_role : native-package]
TASK [native-package : Create tmpdir]
ok: [host1]
ok: [host2]
... more hosts ...
ok: [hostN]
TASK [native-package : Download package]
ok: [host1]
ok: [host1]
... more hosts ...
ok: [hostN]
... more tasks ...
我指定的标签也不会出现在任何地方,我也不知道是在特定的迭代中构建了哪个程序包...
我如何改进以上内容?
(在此使用ansible-2.6.2和Python-3.6.6。)
更新:该问题似乎是由字典中对inventory_hostname
的引用触发的。确实,如果删除其中提到主机名的部分(从而使所有主机的条目都相同?),则包含的角色将按我期望的那样执行。这似乎是一个错误,我将尝试提出一个...
答案 0 :(得分:0)
好吧,这至少是Ansible-2.4以来的known problem。
当字典循环或迭代的任何其他方面是 host-specific 时,它就会发出警告。例如,当它包含对inventory_hostname
的引用时。