Ansible自定义嵌套循环

时间:2015-02-07 22:34:43

标签: loops nested ansible

我必须处理来自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来破解它将所有内容放在临时文件中然后循环遍历它;但是有更好的解决方案吗?

感谢您的任何建议。

2 个答案:

答案 0 :(得分:3)

我知道您希望答案适合非常具体的框架。在此范围内,自定义lookup_plugin是您最好的选择。否则它将是set_factadd_host的丑陋序列。复杂的控制结构是Ansible的对立面。

你没有明确地排除以下内容,所以即使它对你来说太开箱了,也要考虑它,因为我已经很长时间地协调了cfn和ansible:

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

我知道这样的含义,你不能在一本剧本中使用它,但如果这是最重要的,请使用group_by

希望这有帮助。

答案 1 :(得分:0)

对于那些没有先阅读文档而提出要求的人。 Ansible已更新为支持嵌套索引:

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

干杯!