Ansible 使用数组中的字典作为变量调用循环中的角色

Ansible 使用数组中的字典作为变量调用循环中的角色,ansible,roles,provisioning,ansible-role,Ansible,Roles,Provisioning,Ansible Role,我的问题在某种程度上与贴出的问题相似,但这并不能完全回答这个问题。 在我的例子中,我有一个数组,其中包含多个变量:条目,我在调用某个角色时循环这些条目。下面的例子说明了这一想法: 一些变量文件.yml: redis_config: - vars: redis_version: 6.0.6 redis_port: 6379 redis_bind: 127.0.0.1 redis_databases: 1 - vars: redis

我的问题在某种程度上与贴出的问题相似,但这并不能完全回答这个问题。 在我的例子中,我有一个数组,其中包含多个
变量:
条目,我在调用某个角色时循环这些条目。下面的例子说明了这一想法:

一些变量文件.yml:

redis_config:
  - vars:
      redis_version: 6.0.6
      redis_port: 6379
      redis_bind: 127.0.0.1
      redis_databases: 1
  - vars:
      redis_version: 6.0.6
      redis_port: 6380
      redis_bind: 127.0.0.1
      redis_databases: 1
playbook.yml:

...

- name: Install and setup redis
  include_role:
    name: davidwittman.redis
  with_dict: "{{ dictionary }}"
  loop: "{{ redis_config }}"
  loop_control:
    loop_var: dictionary

...
据我所知,这应该只是在每次迭代中设置从vars节点开始的字典,但不知何故它没有。有没有机会让这样的东西起作用,或者我真的必须在角色调用时重新定义所有属性,使用
和\u项填充它们

shell>cat角色/davidwittman_redis/tasks/main.yml
-调试:
字典
用命令删除
。剧本

shell>cat playbook.yml
-主机:本地主机
vars_文件:
-一些变量文件.yml
任务:
-名称:安装和安装redis
包括以下角色:
姓名:davidwittman_redis
循环:“{redis_config}}”
回路控制:
循环变量:字典
给予

shell>ansible playbook playbook.yml
播放[本地主机]**********************************************
任务[安装和设置redis]********************************
任务[davidwittman_redis:debug]*****************************
确定:[本地主机]=>
字典:
变量:
redis_bind:127.0.0.1
redis_数据库:1
redis_端口:6379
redis_版本:6.0.6
任务[davidwittman_redis:debug]******************************
确定:[本地主机]=>
字典:
变量:
redis_bind:127.0.0.1
redis_数据库:1
redis_端口:6380
redis_版本:6.0.6

问:“是否存在与角色调用中的可变总体相关的问题?”

A:是的。它可以。看<代码>变量文件
的优先级为14。任何更高的优先级都将覆盖它。决定如何构造数据并选择使用
includevars
(优先级18)。比如说

shell>cat playbook.yml
-主机:本地主机
任务:
-include_vars:some_vars_file.yml
-名称:安装和安装redis
包括以下角色:
姓名:davidwittman_redis
循环:“{redis_config}}”
回路控制:
循环变量:字典
最终,命令行——额外的变量将覆盖所有以前的设置

shell>ansible playbook playbook.yml--extra vars“@some_vars_file.yml”

问:“可能无法通过外部字典直接设置vars部分?”

当然有可能。这个答案中的例子清楚地证明了这一点。

给定角色

shell>cat角色/davidwittman_redis/tasks/main.yml
-调试:
字典
用命令删除
。剧本

shell>cat playbook.yml
-主机:本地主机
vars_文件:
-一些变量文件.yml
任务:
-名称:安装和安装redis
包括以下角色:
姓名:davidwittman_redis
循环:“{redis_config}}”
回路控制:
循环变量:字典
给予

shell>ansible playbook playbook.yml
播放[本地主机]**********************************************
任务[安装和设置redis]********************************
任务[davidwittman_redis:debug]*****************************
确定:[本地主机]=>
字典:
变量:
redis_bind:127.0.0.1
redis_数据库:1
redis_端口:6379
redis_版本:6.0.6
任务[davidwittman_redis:debug]******************************
确定:[本地主机]=>
字典:
变量:
redis_bind:127.0.0.1
redis_数据库:1
redis_端口:6380
redis_版本:6.0.6

问:“是否存在与角色调用中的可变总体相关的问题?”

A:是的。它可以。看<代码>变量文件
的优先级为14。任何更高的优先级都将覆盖它。决定如何构造数据并选择使用
includevars
(优先级18)。比如说

shell>cat playbook.yml
-主机:本地主机
任务:
-include_vars:some_vars_file.yml
-名称:安装和安装redis
包括以下角色:
姓名:davidwittman_redis
循环:“{redis_config}}”
回路控制:
循环变量:字典
最终,命令行——额外的变量将覆盖所有以前的设置

shell>ansible playbook playbook.yml--extra vars“@some_vars_file.yml”

问:“可能无法通过外部字典直接设置vars部分?”


当然有可能。这个答案中的例子清楚地证明了这一点。

虽然我可以确认,变量被添加了,但它似乎仍然忽略了它们。角色调用中可能存在与可变人口相关的问题?谢谢您的解释。只是为了澄清一下,我不是指变量的进位,而是指通过循环设置vars部分时(可能)的不匹配。可能无法通过外部字典直接设置vars部分?我尝试运行的任何符号变化都会导致角色使用其默认值,或者ansible抱怨语法误用。这里不可能以这种方式继续。打开一个新问题,请回答!我可能解释得有点不好。我想回答的总体问题仍然是您已经回答的问题。但是,尽管它看起来很有希望,但它并没有产生使用两组不同变量的角色。这就是为什么我会想到还有什么会导致这个问题。如果我们能为我在问题中给出的代码提供一个有效的示例,我还是会很高兴的。当然。这也是我的意图。打开一个新问题,使其成为
mcve
。我不会继续猜测。正确阅读
mcve
,1)将其最小化(例如,不需要复杂的Redis结构,简单的
key:val1
即可;创建新的空角色进行测试