Ansible 自定义嵌套循环
Ansible custom nested looping
我必须处理 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
是您最好的选择。否则它将是一个丑陋的 set_fact
和 add_host
序列。复杂的控制结构是 Ansible 的对立面。
您没有明确排除以下情况,所以即使它对您来说太过开箱即用,请考虑一下,因为我已经协调 cfn 和 ansible 很长时间了:
不要使用堆栈输出来填充您的库存。为此使用动态清单脚本(例如,遍历堆栈输出或模板中设置的标签的脚本)。
我知道这样的含义,你不能在一个单独的剧本中使用它,但如果这是最重要的,请使用 group_by
。
希望这对您有所帮助。
对于没有先阅读文档就提出问题的任何人。 Ansible 已更新以支持嵌套索引:
http://docs.ansible.com/ansible/playbooks_loops.html#nested-loops
干杯!
我必须处理 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
是您最好的选择。否则它将是一个丑陋的 set_fact
和 add_host
序列。复杂的控制结构是 Ansible 的对立面。
您没有明确排除以下情况,所以即使它对您来说太过开箱即用,请考虑一下,因为我已经协调 cfn 和 ansible 很长时间了:
不要使用堆栈输出来填充您的库存。为此使用动态清单脚本(例如,遍历堆栈输出或模板中设置的标签的脚本)。
我知道这样的含义,你不能在一个单独的剧本中使用它,但如果这是最重要的,请使用 group_by
。
希望这对您有所帮助。
对于没有先阅读文档就提出问题的任何人。 Ansible 已更新以支持嵌套索引:
http://docs.ansible.com/ansible/playbooks_loops.html#nested-loops
干杯!