Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Ansible自定义嵌套循环_Loops_Nested_Ansible - Fatal编程技术网

Loops Ansible自定义嵌套循环

Loops Ansible自定义嵌套循环,loops,nested,ansible,Loops,Nested,Ansible,我必须处理CloudFormation输出的输出,即: 生成此输出的Ansible代码: 输出: 有了这些,我想创建3个(动态编号!)组,并相应地命名,并填充相应的IP 我想要帮助的Ansible代码: 在伪ansible python中,它将如下所示: 注: 显然,静态地为这三个角色执行此操作的方法是: - name: fill role WEBSERVER local_action: add_host hostname={{item}} groupname=webserver w

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

生成此输出的Ansible代码: 输出:
有了这些,我想创建3个(动态编号!)组,并相应地命名,并填充相应的IP

我想要帮助的Ansible代码: 在伪ansible python中,它将如下所示:
注:

显然,静态地为这三个角色执行此操作的方法是:

- 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模块
将所有内容放入临时文件,然后循环使用;但有更好的解决办法吗


谢谢你的建议。

我知道你希望答案符合一个非常具体的框架。其中,定制的
lookup\u插件是您的最佳选择。否则,它将是一个丑陋的
set\u-fact
add\u-host
序列。复杂的控制结构是Ansible的对立面

<>你没有明确地排除下面的情况,所以即使它对你来说太离题了,也要考虑一下,因为我已经很好地调和了CFN和AnEnter很久了:

不要使用堆栈输出来填充库存。为此使用动态清单脚本(例如,一个用于检查堆栈输出或模板中设置的标记的脚本)

我知道其中的含义,比如说,你不能在一本剧本中包含这一点,但如果这是最重要的,请使用
group\u by


希望这能有所帮助。

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


干杯

我为此编写了
lookup\u插件。可以用现有的方法解决吗?动态库存+成组将是更好的解决方案。谢谢,有没有办法在剧本运行期间重新触发动态库存扫描?因为当我更新CF模板时,0)DI运行,1)CF运行,例如添加一些主机2)我使用的是非最新版本的库存,必须解析CF的输出以纠正它。你是怎么解决这个问题的?@DinGODzilla,不。。。无法自动获取由您的playbook生成的afaik动态库存更新。您最好的办法是注册产生新库存项目的任何任务的输出,并将其用于您的剧本。@DinGodZilla您使用的是具有动态库存的ansible控制台还是ansible tower?你所做的评论应该是另一个问题。顺便说一句@einarc-你是对的,Ansible 2中的解决方案是
-meta:refresh\u inventory
。v1.9中没有解决方案。是否确实嵌套了以下内容的
:[{{stack.stack\u outputs.Roles.split()}}',{{stack.stack\u outputs[item[0]].split()}]
?第2行中的
[项目[0]]
特别说明。
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"
}}
- name: fill roles with proper hosts
  local_action: add_host hostname={{item}} groupname={{role}}
  with_whatever: ?...?
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()