loops - Ansible 自定义嵌套循环

标签 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 模块 破解它,将所有内容放入临时文件,然后循环遍历它;但是有更好的解决方案吗?

感谢您的任何建议。

最佳答案

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

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

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

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

希望这对您有所帮助。

关于loops - Ansible 自定义嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28388264/

相关文章:

python - 在 Python 2.x 中打印嵌套字典中的值

python - 用 python 中的数字替换嵌套列表中的唯一值

c# - 为跨多个程序集的特定类型的实例实现中央 'manager' 类

ansible - 我可以在没有 vCenter 的情况下使用 Ansible 免费管理 vSphere 中的 guest 虚拟机吗?

ansible - 在 Ansible 中从 S3 存储桶复制文件

ansible - 如何将循环内的字典值更新为字典列表

sql - Offset 和 Fetch Next 可以在循环中使用吗?

java - 增强的 for 循环何时实际修改底层数组?

c++ - 仅限十进制数的无限循环

loops - 在外部for循环中引用 “it”