【问题标题】:Ansible custom nested loopingAnsible 自定义嵌套循环
【发布时间】:2015-02-07 22:34:43
【问题描述】:

我必须处理来自 CloudFormation Outputs 的输出,即:

产生此输出的 Ansible 代码:

- debug: 
  var: stack.stack_outputs

输出:

ok: [localhost] => {
  "stack.stack_outputs": {
    "Roles": "webserver balancer dbserver",
    "dbserver": "54.0.1.1 54.0.1.2",
    "balancer": "54.0.2.3",
    "webserver": "54.0.2.5 54.0.2.7 54.0.3.1"
}}

有了这个,我想创建 3 个(动态编号!)组,相应地命名并填充适当的 IP。

我想帮助的 Ansible 代码:

- name: fill roles with proper hosts
  local_action: add_host hostname={{item}} groupname={{role}}
  with_whatever: ?...?

在伪 ansible python 中它看起来像这样:

for role in stack.stack_outputs.Roles.split():                           # Python
  for ip in stack.stack_outputs[role].split():                           # Python
    local_action: add_host hostname={{ip}} groupname={{role}}            # Ansible

注意:

这三个角色静态的做法显然是:

- name: fill role WEBSERVER
  local_action: add_host hostname={{item}} groupname=webserver
  with_items: stack.stack_outputs.webserver.split()
- name: fill role DBSERVER
  local_action: add_host hostname={{item}} groupname=dbserver
  with_items: stack.stack_outputs.dbserver.split()
- name: fill role BALANCER
  local_action: add_host hostname={{item}} groupname=balancer
  with_items: stack.stack_outputs.balancer.split()

我想动态地,在 Ansible 中甚至可以吗?
是的,我可以使用shell module 破解它,将所有内容放在临时文件中,然后循环遍历它;但是有更好的解决方案吗?

感谢您的任何建议。

【问题讨论】:

  • 我为此写了lookup_plugin。现有的能解决吗?

标签: loops nested ansible


【解决方案1】:

我了解您希望答案适合一个非常具体的框架。其中,自定义lookup_plugin 是您最好的选择。否则,这将是set_factadd_host 的丑陋序列。复杂的控制结构是 Ansible 的对立面。

您没有明确排除以下内容,因此即使它对您来说太开箱即用,也请考虑一下,因为我已经调和 cfn 和 ansible 很长时间了:

不要使用堆栈输出来填充您的库存。为此使用动态清单脚本(例如,遍历堆栈输出或模板中设置的标签的脚本)。

我知道其中的含义,例如,您不能在单个剧本中包含此内容,但如果这是最重要的,请使用 group_by

希望这会有所帮助。

【讨论】:

  • 动态库存 + group_by 将是更好的解决方案。谢谢
  • 有没有办法在 playbook 运行期间重新触发 动态库存 扫描?因为当我更新 CF 模板时,然后 0) DI 运行,1) CF 运行,例如添加一些主机 2) 我使用非最新版本的库存,并且必须解析 输出 CF 来解决它。 你是如何解决这个问题的?
  • @DinGODzilla,不...无法自动获取由您的剧本生成的 afaik 动态库存更新。 stackoverflow.com/a/29008654/1527814 最好的办法是注册生成新库存物品的任何任务的输出,并将其用于您的剧本。
  • @DinGodZilla 您使用的是带有动态库存的 ansible 控制台还是 Ansible 塔?顺便说一句,您发表的评论应该是另一个问题。
  • @einarc - 你是对的,Ansible 2 中的解决方案是- meta: refresh_inventory。 v1.9 中没有解决方案。
【解决方案2】:

适用于没有先阅读文档就提出问题的任何人。 Ansible 已更新以支持嵌套索引:

http://docs.ansible.com/ansible/playbooks_loops.html#nested-loops

干杯!

【讨论】:

  • 确定 with_nested: [ '{{ stack.stack_outputs.Roles.split() }}', '{{ stack.stack_outputs[item[0]].split() }}' ] 吗?特别是 [item[0]] 在第 2 行/第 2 项中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多