Ansible: 使 with_ 循环可配置

创建于 2015-08-25  ·  90评论  ·  资料来源: ansible/ansible

问题类型

特色理念

组件名称

ANSIBLE 版本

2.1

配置
操作系统/环境
概括
how: 
    forks: 1
    pause: 0
    squash: name
    label: "{{item.name}}"
    end: on_fail
with_items: ...
  • forks:循环内的 fork 并行执行项目,默认 1,这需要警告
  • pause:在循环执行之间,在节流 api 场景中很有用_Done in 2.2_
  • squash:将所有项目加入列表并传递给提供的选项,就像当前硬编码的 apt、yum 等选项一样,默认情况下应该是 None _abandon_:相反的意见,我们应该删除此功能
  • end: 何时中断循环,默认为'last item',选项? on_fail, on_success(第一个)?
  • label: (#13710) 输出项目循环时显示的内容_Done in 2.2_

文档到当前状态:

http://docs.ansible.com/ansible/playbooks_loops.html#loop -control

重现步骤
预期成绩
实际结果
affects_2.1 affects_2.3 feature core

最有用的评论

+1 叉子

我在等待 openstack 模块在 100 多个项目上迭代with_循环......
image

所有90条评论

请不要称它为how 。 这比become: true更难读。 但是它下面的功能看起来很棒。

包括修复 #10695

优秀。 为了自行车脱落,也许称它为looping:

:+1:

+1

+1 特别适用于主机内并行化!

:+1:

:+1:
但我们不要称之为“如何”

所以这是第一次失败后中断循环任务的解决方法

- hosts: localhost
  vars:
    myvar:
        - 1
        - 2
        - 3
        - 4
        - 5
  tasks:
    - name: break loop after 3
      debug: msg={{item}}
      failed_when: item == 3
      register: myresults
      when: not (myresults|default({}))|failed
      with_items: "{{myvar}}"

@bcoca不能从头开始工作(ansible 1.9.3 ubuntu)

任务:[3 后中断循环] * * * * * * * * * * * * * * * ** *
好的:[本地主机] =>(项目=1)=> {
“失败”:错误,
“failed_when_result”:假,
“项目”:1,
“味精”:“1”
}
好的:[本地主机] =>(项目=2)=> {
“失败”:错误,
“failed_when_result”:假,
“项目”:2,
“味精”:“2”
}
失败:[localhost] => (item=3) => {"failed": true, "failed_when_result": true, "item": 3, "verbose_always": true}
味精:3
好的:[本地主机] =>(项目=4)=> {
“失败”:错误,
“failed_when_result”:假,
“项目”:4,
“味精”:“4”
}
好的:[本地主机] =>(项目=5)=> {
“失败”:错误,
“failed_when_result”:假,
“项目”:5,
“味精”:“5”
}

啊,是的,它将在 2.0 和 1.9 中一样工作,直到循环完成后才会发生注册。

+1 在叉子上

+1
也许而不是“如何”,loop_details 或选项?

+1

+1,使用 $# localhost中的wait_for等待 100 台 EC2 主机出现正在杀死我......

+1 出于与 senderista 类似的原因

+1

:+1:

squashforks都是很棒的功能,可以极大地加快 Ansible 的执行速度。

我也会将how替换为loop_detailsloop_settingsloop_options或类似的东西。

loop_control ,已经在 2.1 中实现了label部分。

squash 可能会消失,因为很容易将列表传递给支持它的模块:

apt: name={{listofpackages}}

并完全避免循环

+1 叉子

+1 叉子

我有一个用于条件中断break_when的新配置的用例

+1 分叉,我希望它也可以用于并行运行任务序列,如下所示:
- include: service.yml
with_items: "{{services|default([])}}"

否则,已经有async/async_status

+1 叉子

我在等待 openstack 模块在 100 多个项目上迭代with_循环......
image

+1 在叉子上。 可以使用它来将 AMI 复制到所有 AWS 区域。

+1 在叉子上。 请! 使其成为 loop_control 的一部分

+1 在叉子上

+1 在叉子上

+1,也需要叉子:-)

+1 在叉子上

+1 在叉子上

叉子会很棒,+1

我总是默默地坐着不想为垃圾邮件做出贡献,因为很难在项目之间衡量它是否受到欢迎,但看起来 fork +1 火车已经离开了车站!

+1 在叉子上

+1 在叉子上

+1 在叉子上

:+1: 在叉子上

@bcoca问候! 感谢您花时间打开这个问题。 为了让社区有效地处理您的问题,我们需要更多信息。

以下是我们在您的描述中找不到的项目:

  • 问题类型
  • 版本
  • 组件名称

请使用此模板设置此问题的描述:
https://raw.githubusercontent.com/ansible/ansible/devel/.github/ISSUE_TEMPLATE.md

单击此处获取机器人帮助

+1 在叉子上

+1 在叉子上!

福克斯+1!

+1 在叉子上!

+1 在叉子上!

fork 有更新吗? 什么时候应该准备好?
我的用例是使用with_sequence在服务器上实例化大约 20 个容器。 现在它需要太多的年龄:(
我很乐意提供帮助,但我需要一些关于把手放在哪里的提示

@bitliner没有人为它创建公关,如果这是您所要求的,实际上很难正确地做到这一点。

至于您的问题,只需在清单中声明 X 主机并循环hosts:而不是with_以并行创建它们。

存货:

[containers]
container[000:020]
hosts: containers
gather_facts: false
tasks:
   - container: state=present name={{inventory_hostname}}

即容器是一个“组成”的模块。

@bcoca你的解决方案我不清楚。 可以肯定的是,这就是你的意思吗?

主机文件

[containers]
192.168.1.100
192.168.1.100
192.168.1.100
192.168.1.100
... and so on based on the degree of parallelism I want to get ...

main.yml文件

hosts: containers
gather_facts: false
tasks:
   - container: state=present name={{inventory_hostname}}

基于我应该实现的容器模块,对吗? 在这种情况下,我将拥有所有具有相同名称的容器,这是不可接受的,对吗?

此外,正确并行实现循环的挑战是什么?

我的用例需要加快这项任务:

- name: "Start clients"
  docker_container:
    name: "mycontainer-{{ item }}"
    image: myimage
    links: 
      - server-{{item}}:server-{{item}}
  with_sequence: count={{ scale }}

我不能使用 docker-compose scale因为我需要以特定方式在容器之间路由流量(这就是我使用with_sequence生成不同 docker 容器名称的原因)。

我可以构建一个模块,该模块接受容器的声明,并基于比例参数远程并行实例化多个容器。 是否有意义? 您对了解如何在 myModule 中调用/重用 docker_container 模块以及 Ansible 提供的用于并行运行某些东西的 API 有什么帮助吗?

@bitliner ,您没有按照我的指示进行操作,我在库存中有唯一名称(使用范围就像序列一样工作)。 由于名称在清单中是唯一的,因此您刚刚声明了 N 次相同的名称,但仍然有一个主机,这不会导致您在容器的重复名称上出现第二个问题,因为您只循环了 1 个主机。

无论如何,如果您想跟进您的问题,请使用 ML 或 IRC,因为这对于这张票来说有点离题。

@bcoca如果您声明了 20 台主机,我如何才能拥有一台主机?

[containers]
container[000:020]

将连接到container001container002等。

它适用于拥有唯一名称,但我不清楚为什么你说我仍然有一个主机(而不是 20 个)。
hosts:containers对我来说意味着 20 台主机,而不仅仅是一台。 我在这个解决方案中忽略了什么?

@bitliner导致这个:

[containers]
192.168.1.100
192.168.1.100
192.168.1.100
192.168.1.100

不是 4 个主机,而是 1 个

同样在这一点上,这几乎是题外话,如果您想继续获得这方面的帮助,请转到 IRC 或 ML

我已经解决了

[containers]
ip[000:020] ansible_host=192.168.1.100

- name: "Start containers"
  docker_container:
    name: "my-container-{{ inventory_hostname }}"

一个问题:成像以添加fork语句,更改是否包括重写方法run_loop以使其管理并行度和异步性?

然后它开始变得“​​有趣”……:

  • 循环分叉是否计入全局--forks ,每个遥控器都算吗?
  • 当项目依赖于以前的项目(不仅仅是任务执行,还有条件等)时,如何处理循环?
  • 当多个分叉在同一主机上执行时如何处理并发问题? 即他们更新相同的文件
  • 我们如何处理清理工作? 现在他们可以重用 tmp dirs .. 但每次执行都会自行清理,现在这可能会导致问题。

还有一些我知道的其他问题......当然,在有人尝试实施之前,我不会意识到很多问题。 我有一些解决方案,但它很快就开始失控了。

@bcoca循环分叉默认情况下不应启用。 我希望看到默认设置为 1 并将其作为参数引入forksserial ,但包含警告。 它可能会破坏一些现有的代码。 话虽如此,我非常期待这个功能(尤其是对于需要delegate_to的任务)

+1 用于分叉(默认为 false)

+1 叉子

+1 叉子

+1 叉子

+1 叉子

+1 叉子

对于 fork 也 +1,但与此同时,还有一个新的 Ansible 策略插件,总体上可以大大提高性能,也适用于with_items循环。 也许对于那些出于性能原因想要分叉的人来说,值得一看:

https://github.com/dw/mitogen
https://mitogen.readthedocs.io/en/latest/ansible.html

我看不出这将如何改善 with_items 循环。 这个插件
改进了使用 ssh 作为连接方法引起的性能问题。
特别是在长距离和潜在网络以及大量
服务器。

这对执行的 AWS 或 Azure 云功能没有帮助
发生在 ansible 控制器上,只在其中的一组项目上执行
那个云系统,根本不连接到主机,这是
with_items 速度慢的主要问题。 它与大集合无关
机器或延迟或与 ssh 相关的任何内容。 这只是事实
它在 with_items 循环中以串行方式执行云功能,什么也没有
可以加快速度,除非云提供商提高其速度或
ansible 并行执行这些云功能。

它也根本没有在文章中提到 with_items 所以我看不到如何
即使是最微小的一点,这也会有所帮助。 你能再解释一下吗
这有什么帮助? 如果我错过了,我想知道我错过了什么
这里有东西。

2018 年 3 月 10 日星期六 21:58,NielsH [email protected]写道:

+1 forks 也是如此,但同时也有一个新的 Ansible
总体上可以大大提高性能的策略插件,并且
对于 with_items 循环。 也许对于那些想要分叉的人来说
值得一看的原因:

https://github.com/dw/mitogen
https://mitogen.readthedocs.io/en/latest/ansible.html


您收到此消息是因为您发表了评论。
直接回复此邮件,在 GitHub 上查看
https://github.com/ansible/ansible/issues/12086#issuecomment-372070418
或使线程静音
https://github.com/notifications/unsubscribe-auth/AJd59qWI9n_DNmUqpmZYiIOMZAyjJy3uks5tdEyQgaJpZM4Fx8zF
.

事实上,它不会在所有情况下都有帮助。 然而,我在 with_items 中寻找分叉的原因是因为单独处理每个项目的速度很慢(即使使用流水线)。 有时我必须基于 host_vars 创建大量(几百个)目录,或者模板化几百个文件。 所以我主要在filetemplate模块上循环。

我曾经测试过通过 with_items 将 100 个文件模板化到 100 个单独的文件中,而不是循环遍历 jinja 模板本身中的项目并将模板合并到一个大文件中。 单个文件中的所有内容都需要 5 秒,但创建 100 个单独的配置文件需要 30 分钟。

我提到的插件给了我很大的改进,我认为值得在这里提一下。

由于循环每个项目只执行一次相同的任务,因此任务执行速度的任何改进都应该转化为更快的循环。 这只会影响“远程任务”,因此本地的任何东西都不会看到收益。

同意。 我正在使用 ansible 仅运行本地任务。 特别是要构建十几个 docker 镜像。 目前,ansible 串行构建它们,因此需要大量时间并且未充分利用多核 CPU。 我想并行构建多个 docker 镜像。

@gjcarneiro然后不要将它们定义为数据,将它们定义为主机并定位它们,然后delegate_to: localhost以并行执行操作

哈,谢谢你的巧妙技巧:) 但是,即使它有效(我还没有测试过),它也是并行运行任务的一种相当复杂的方式。

再说一次,我可能将 ansible 用于与预期完全不同的目的,所以在某种程度上这是我自己的错:(

并不是很复杂,这就是 Ansible 使用并行化的方式,按主机,而不是按变量。

是的,我明白,这不是 Ansible 的错,这是有道理的。 但是我使用 Ansible 作为构建系统(而不是例如 make),因为 Ansible 在大多数方面都可以作为构建系统。 但是,在我看来,作为一个构建系统,“主机”是没有意义的。 像“make”这样的构建系统不关心“主机”,它只关心文件和任务。 我强迫 Ansible 用作构建系统,这会导致一些认知失调,仅此而已。

Ansible 只关心主机和任务,考虑一下您正在构建“主机”的图像,突然间它适合两种范式。

Ansible 是用于许多其他事物的配置管理工具,网络
用于大量云服务的真实和虚拟设备,例如
数据库、Web 服务,例如 elelastic beanstalk、lambda 和所有
适用于它的组件,例如 IAM 安全组件,而 Ansible 是
如果您仍然主要运行虚拟机/主机,则擅长主机
2000 年代初期的 IT。 在这里不冒犯任何人有时很重要
运行虚拟机甚至 docker 容器的原因,但它们都可以追溯到
遗留原因。 事实上,越来越多的主机将变得越来越少
它自动化了什么。 IMO 如果我们没有与_items 平行,我们可能会
很好地将ansible全部废弃。

话虽如此,我会在这里积极思考并尝试使用
对于一些云服务,我的意思是我从未尝试在 200+ 上执行 delegate_to
我想以这种方式需要的云组件只是查询列表
并使用ansible将其转储到主机格式的主机文件中,然后尝试
delegate_to: localhost 我会在这里反馈我的结果。 如果它确实在
至少我们可以就如何解决问题进行文档拉取请求
with_item 循环串行问题以这种方式。 我们可以确保有一个链接
它们位于云模块部分和 docker 部分。

2018 年 3 月 12 日星期一 18:49,Brian Coca [email protected]写道:

Ansible 只关心主机和任务,考虑你的镜像
建立“主机”,突然间它适合两种范式。


您收到此消息是因为您发表了评论。
直接回复此邮件,在 GitHub 上查看
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169
或使线程静音
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF
.

@gjcarneiro然后不要将它们定义为数据,将它们定义为主机并定位它们,然后 delegate_to: localhost 以并行执行操作

这是一个非常好的方法,但它似乎不适用于使用serial=1模拟 (#12170) 滚动重启的解决方法。 因此,并行化选项将增加更多的灵活性。

毫无疑问,但它也增加了巨大的复杂性,并且需要在单个主机上处理并发操作 ala hosts:all + lineinfile + delegate_to: localhost

到目前为止,我已经为 delegate_to: 127.0.0.1 创建了一个小测试
删除任务,因为这也是大规模的痛苦。

我的剧本如下所示:

  • 主机:“{{部署组}}”

    任务:

    • 名称:删除 vm 和所有相关资源
      azure_rm_virtualmachine:
      resource_group: "{{ host_vars[item]['resource_group'] }}"
      名称:“{{库存主机名}}”
      状态:缺席

    委托人:127.0.0.1


不幸的是,它仍然尝试连接到主机中列出的机器以
执行天蓝色任务 azure_rm_virtualmachine。
我这样做正确吗? 似乎我错过了一些东西,但我确实尝试过这个
以前以许多不同的方式,所以只想知道你能做到
这。

这真的有效吗? 希望这只是一些语法问题。

2018 年 3 月 12 日星期一晚上 7:55,Isaac Egglestone < [email protected]

写道:

Ansible 是用于许多其他事情的配置管理工具,
用于大量云的真实和虚拟网络设备
服务,例如数据库,Web 服务,例如 elelastic beanstalk、lambda
以及适用于它的所有组件,例如 IAM 安全组件,而
如果您仍然主要运行虚拟机/主机,Ansible 擅长主机
基本上在 2000 年代初期的 IT 中。 在这里不冒犯任何人有时
运行虚拟机甚至 docker 容器的重要原因,但它们都是
回到遗留的原因。 事实上,越来越多的主机将
变得更少自动化。 IMO 如果我们不平行
with_items 我们不妨一起废弃 ansible。

话虽如此,我会在这里积极思考并尝试使用
对于一些云服务,我的意思是我从未尝试在 200+ 上执行 delegate_to
我想以这种方式需要的云组件只是查询列表
并使用ansible将其转储到主机格式的主机文件中,然后尝试
delegate_to: localhost 我会在这里反馈我的结果。 如果它确实在
至少我们可以就如何解决问题进行文档拉取请求
with_item 循环串行问题以这种方式。 我们可以确保有一个链接
它们位于云模块部分和 docker 部分。

2018 年 3 月 12 日星期一 18:49,Brian Coca [email protected]写道:

Ansible 只关心主机和任务,考虑你的镜像
建立“主机”,突然间它适合两种范式。


您收到此消息是因为您发表了评论。
直接回复此邮件,在 GitHub 上查看
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169
或使线程静音
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF
.

好的,因此禁用事实收集可以解决此问题,但是它会导致
另一个,host_vars 不再包含来自的 azure 动态清单
标准在。

所以 resource_group: "{{ host_vars[item]['resource_group'] }}" 没有
在上面工作,需要硬编码为资源组名称。

2018 年 3 月 18 日星期日上午 11:14,艾萨克·埃格尔斯通 <
[email protected]> 写道:

到目前为止,我已经为 delegate_to: 127.0.0.1 创建了一个小测试
删除任务,因为这也是大规模的痛苦。

我的剧本如下所示:

  • 主机:“{{部署组}}”

    任务:

    • 名称:删除 vm 和所有相关资源
      azure_rm_virtualmachine:
      resource_group: "{{ host_vars[item]['resource_group'] }}"
      名称:“{{库存主机名}}”
      状态:缺席

    委托人:127.0.0.1


不幸的是,它仍然尝试连接到主机中列出的机器以
执行天蓝色任务 azure_rm_virtualmachine。
我这样做正确吗? 似乎我错过了一些东西,但我确实尝试过这个
以前以许多不同的方式,所以只想知道你能做到
这。

这真的有效吗? 希望这只是一些语法问题。

2018 年 3 月 12 日星期一晚上 7:55,艾萨克·埃格尔斯通 <
[email protected]> 写道:

Ansible 是用于许多其他事情的配置管理工具,
用于大量云的真实和虚拟网络设备
服务,例如数据库,Web 服务,例如 elelastic beanstalk、lambda
以及适用于它的所有组件,例如 IAM 安全组件,而
如果您仍然主要运行虚拟机/主机,Ansible 擅长主机
基本上在 2000 年代初期的 IT 中。 在这里不冒犯任何人有时
运行虚拟机甚至 docker 容器的重要原因,但它们都是
回到遗留的原因。 事实上,越来越多的主机将
变得更少自动化。 IMO 如果我们不平行
with_items 我们不妨一起废弃 ansible。

话虽如此,我会在这里积极思考并尝试使用
对于一些云服务,我的意思是我从未尝试在 200+ 上执行 delegate_to
我想以这种方式需要的云组件只是查询列表
并使用ansible将其转储到主机格式的主机文件中,然后尝试
delegate_to: localhost 我会在这里反馈我的结果。 如果它确实在
至少我们可以就如何解决问题进行文档拉取请求
with_item 循环串行问题以这种方式。 我们可以确保有一个链接
它们位于云模块部分和 docker 部分。

2018 年 3 月 12 日星期一 18:49,Brian Coca通知@github.com
写道:

Ansible 只关心主机和任务,考虑你的镜像
建立“主机”,突然间它适合两种范式。


您收到此消息是因为您发表了评论。
直接回复此邮件,在 GitHub 上查看
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169
或使线程静音
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF
.

好的,所以我修改了下面的剧本来尝试一些事情。

第一次我尝试设置 delegate_facts: True 以防万一这有帮助,但当然
即使基于文档,我也没想到它会起作用。
第二,我设置了 gather_facts: no 并尝试运行 setup 以减少事实
一无所获,希望它会选择根本不连接,但是
当然,正如预期的那样,它仍然试图连接到机器。
第三次尝试设置连接:本地主机但奇怪的是它仍然想要
远程连接到机器以收集事实,即使它知道
将在本地执行播放,那里有点烦人,但我的逻辑是
否则它如何不做就知道有问题的主机的详细信息
这..

我可能可以使用剧本先打开机器,然后再让
ansible 登录到他们并收集不需要的事实。 这将是这样的
我可以让 host_vars 工作,然后删除机器。 我想知道
如果有人在这里有更好的解决方案,因为这也很耗时
当我有一百台或更多机器并且必须为它们供电时,我会努力
一切都只是为了然后删除它们。

到目前为止,我看到将其用作解决方案而不是 with_items 并行
解决方案具有潜力,但有问题的机器仍然需要
如果您需要 azure_rm.py 中的任何类型的事实,而您可以访问
这样做至少有一个警告。 那是除非有人知道
如何从通过标准传递的 azure 访问 host_vars
当收集事实:没有

实际上,当我使用
with_items 列表,但是如果我是
将再次使用主机。 解决方法是将 azure_rm.py 转储到
json 文件在命令行上,然后加载到变量中以获取
再次访问它们。

如果我期待我的最终目标在这里修改数百甚至数千
并行的无服务器组件,也许我可以这样
使用 azure_rm_functionapp_facts 之类的东西
http://docs.ansible.com/ansible/latest/azure_rm_functionapp_facts_module.html

收集有关它们的事实并在理论上在戏剧中使用它们,尽管这
尚未经过测试。

我仍然没有任何关于如何正确执行此操作以创建一个
关于它的文档拉取请求,因为该方法似乎到目前为止主要是
取决于你在做什么,我不确定我是否建议使用
文档中的 json 转储 hack。

我将等待碰巧关心此问题的任何人的反馈
这个问题列表来决定我的下一步。 同时,我将使用我的技巧来获得
我的直接工作完成了。


  • 主机:“{{部署组}}”
    收集事实:没有
    任务:

    • 设置:

      gather_subset=!all,!min

    • 名称:删除 vm 和所有相关资源

      azure_rm_virtualmachine:

      resource_group: "{{ host_vars[inventory_hostname]['resource_group']

      }}”

      名称:“{{库存主机名}}”

      状态:缺席

      委托人:本地主机

      委托事实:真


2018 年 3 月 18 日星期日下午 12:04,艾萨克·埃格尔斯通 <
[email protected]> 写道:

好的,因此禁用事实收集可以解决此问题,但是它会导致
另一个,host_vars 不再包含来自的 azure 动态清单
标准在。

所以 resource_group: "{{ host_vars[item]['resource_group'] }}"
在上述情况下不起作用,需要硬编码到资源组
姓名。

2018 年 3 月 18 日星期日上午 11:14,艾萨克·埃格尔斯通 <
[email protected]> 写道:

到目前为止,我已经为 delegate_to: 127.0.0.1 创建了一个小测试
删除任务,因为这也是大规模的痛苦。

我的剧本如下所示:

  • 主机:“{{部署组}}”

    任务:

    • 名称:删除 vm 和所有相关资源
      azure_rm_virtualmachine:
      resource_group: "{{ host_vars[item]['resource_group'] }}"
      名称:“{{库存主机名}}”
      状态:缺席

    委托人:127.0.0.1


不幸的是,它仍然尝试连接到主机中列出的机器
执行天蓝色任务 azure_rm_virtualmachine。
我这样做正确吗? 似乎我错过了一些东西,但我确实尝试过
这以前以许多不同的方式,所以只是想知道你能够
做这个。

这真的有效吗? 希望这只是一些语法问题。

2018 年 3 月 12 日星期一晚上 7:55,艾萨克·埃格尔斯通 <
[email protected]> 写道:

Ansible 是用于许多其他事情的配置管理工具,
用于大量云的真实和虚拟网络设备
服务,例如数据库,Web 服务,例如 elelastic beanstalk、lambda
以及适用于它的所有组件,例如 IAM 安全组件,而
如果您仍然主要运行虚拟机/主机,Ansible 擅长主机
基本上在 2000 年代初期的 IT 中。 在这里不冒犯任何人有时
运行虚拟机甚至 docker 容器的重要原因,但它们都是
回到遗留的原因。 事实上,越来越多的主机将
变得更少自动化。 IMO 如果我们不平行
with_items 我们不妨一起废弃 ansible。

话虽如此,我会在这里积极思考并尝试使用
对于一些云服务,我的意思是我从未尝试在 200+ 上执行 delegate_to
我想以这种方式需要的云组件只是查询列表
并使用ansible将其转储到主机格式的主机文件中,然后尝试
delegate_to: localhost 我会在这里反馈我的结果。 如果它确实在
至少我们可以就如何解决问题进行文档拉取请求
with_item 循环串行问题以这种方式。 我们可以确保有一个链接
它们位于云模块部分和 docker 部分。

2018 年 3 月 12 日星期一 18:49,Brian Coca通知@github.com
写道:

Ansible 只关心主机和任务,考虑你的镜像
建立“主机”,突然间它适合两种范式。


您收到此消息是因为您发表了评论。
直接回复此邮件,在 GitHub 上查看
https://github.com/ansible/ansible/issues/12086#issuecomment-372422169
或使线程静音
https://github.com/notifications/unsubscribe-auth/AJd59nhLIM3s3BL_xM_WwbJS6-uROzjSks5tdsNCgaJpZM4Fx8zF
.

我也有一个 fork 的用例,这会使这变得容易得多。 该剧本正在通过随机挑选的浮动ips通过terraform部署一堆openstack实例。 然后我遍历 ips 以检查每个创建的主机上的端口 22 是否打开。 当前执行此操作的方法是使用多人游戏手册:

- hosts: localhost
  connection: local
  gather_facts: no
  tasks:
...
  - name: Run terraform
    terraform:
      plan_file: '{{tf_plan | default(omit)}}'
      project_path: '{{terraform_path}}/{{infra}}'
      state: '{{state}}'
      state_file: '{{stat_tfstate.stat.exists | ternary(stat_tfstate.stat.path, omit)}}'
      variables: '{{terraform_vars | default(omit)}}'
    register: tf_output

  - name: Add new hosts
    with_items: '{{tf_output.outputs.ip.value}}' # configued this in terraform to output a list of assigned ips.
    add_host:
      name: '{{item}}'
      groups: new_hosts

- hosts: new_hosts
  gather_facts: no
  connection: local
  tasks:
   - name: Wait for port 22 to become available
     wait_for:
       host: '{{ansible_host}}'
       port: 22
       state: started
       timeout: 60

这是运行: ansible-playbook -i localhost, deploy-test-clients.yml --extra-vars="infra=terraform_os_instances state=present"
这当然是一个有限的解决方法,因为您并不总是有一个整洁的、可解析的 ips 列表来使用。

由于很多人似乎都在为本地模板文件的性能而苦苦挣扎,也许可以创建一个特定的 template_local 模块来解决这个特定问题。 至少这是一个开始……我自己会去,但在可预见的未来没有时间。

使用 jinja 可以在 5 秒内完成 100 个文件的模板化 30 多分钟是荒谬的。

@saplla模板总是在本地发生,唯一远程发生的是复制模板和设置权限。

澄清一下,我说的是那些想要将文件模板化为本地任务的用户,例如输入其他构建系统,或者就我而言,使用 kubectl 部署 k8s 资源。

我的意思是通过一个简单的包装器模块将循环和模板卸载到 jinja。 该模块可以获取一些上下文和循环定义(通常会放入with_nested和朋友中)并完全为这个任务剪掉 ansible(如果它加快速度,也许包装器可以并行运行 jinja) .

可以像这样调用它:

    template_parallel:
      src: "{{ item[0] }}"
      dest: "{{ tempdir }}/{{ item[1] }}-{{ item[0] | basename }}"
      context: "{{ hostvars[inventory_hostname] }}"
      nested:
      - "{{ templates.stdout_lines }}"
      - "{{ namespaces.stdout_lines }}"

上面的例子把ansible定义的所有变量作为上下文,但是任何dict都可以传入。

正如我所说,我现在没有时间研究这个,但是这种方法听起来可行吗@bcoca

假设每个项目都是独立的,但并非总是如此,您可以使当前项目值取决于先前的项目值和/或先前迭代的结果,或者它们可以只是累积的。

模板化所花费的大部分时间都与变量有关,而不是模板本身,因为它们需要保持一致,除非您愿意更改会打破当前假设的行为,否则您不会在并行化中获得太多收益。

此外,模板已经是并行的,按主机,而不是按项目。

好的,谢谢你的想法。 对于我的用例来说,它实际上已经足够好了,听起来它也可能适用于这个线程中的其他人。 我只是在调用一些部署它们的二进制文件(kubectl、helm 等)之前使用 ansible 在本地加载分层配置和模板文件。 如果它的性能如此之高,可以将模板时间从几分钟缩短到几秒钟,我会对一个非常简单、轻量级的模板模块感到满意。

当它成为我们的问题时,我会尝试看看这个,除非有人打败了我。

我最初提交了 #10695,但看到这需要一段时间才能完成,我最终使用 shell 脚本解决了这些用例(例如,我必须在单个主机上对 50 个 Git 存储库做一些事情,我使用 Ansible运行单个脚本一次执行 50 次)。 不幸的是,这意味着放弃一些通过 Ansible 免费获得的东西,比如非常精细的变更报告,而且您还必须自己实现所有“仅当运行”逻辑,并非常小心错误处理,但它可能要快两个数量级。 因此,即使我们将来最终获得“并行”选项,它也可能不如我的自定义脚本那么快,而且我可能不会费心切换到它。

@wincent并行循环可能仍然总是比 shell 脚本/专用程序慢,因为 Ansible 不仅仅是“应用操作”。

@bcoca :是的,这证实了我的理解。

@saplla k8s_raw 比为此使用模板更好,如果需要,您可以在库存中内联 yaml :)(这不是本 PR 的主题)
目前情况如何? 我们可以期待 2.6 @bcoca中的一些东西吗?
我在我的数据库集群上管理数千个 postgresql 权限,25 分钟非常慢

@nerzhul谢谢,但这对我们来说并不好。 太魔幻了。 我们需要模板。

@sapila您始终可以为每个模板创建一个主机目标以尽可能地并行化模板,然后使用后续播放或委托来交付给正确的实际主机。

@bcoca有点 hacky :)

一点也不,它有很多hacky,但今天有效

此页面是否有帮助?
0 / 5 - 0 等级