Loops Ansible自定义嵌套循环
我必须处理CloudFormationLoops 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
输出的输出,即:
生成此输出的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()