为什么include_role一次要处理一个主机?

时间:2018-08-15 00:21:15

标签: ansible ansible-2.x

我已经创建了一个辅助角色,可以从源代码构建软件包。但是,当我尝试将其包含在循环中时–遍历描述软件包的字典。它可以工作,但是当我将其包含在另一个角色的任务中时:

- 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的引用触发的。确实,如果删除其中提到主机名的部分(从而使所有主机的条目都相同?),则包含的角色将按我期望的那样执行。这似乎是一个错误,我将尝试提出一个...

1 个答案:

答案 0 :(得分:0)

好吧,这至少是Ansible-2.4以来的known problem

当字典循环或迭代的任何其他方面是 host-specific 时,它就会发出警告。例如,当它包含对inventory_hostname的引用时。