Ansible将变量传递给角色

时间:2016-11-03 15:00:41

标签: ansible role

我想根据环境和主机名创建文件夹,用户和组。

我的playbook将环境和主机名传递给角色,该角色应该从defaults / main.yml文件中选择正确的数据。

剧本:

roles:
- { role: myrole, environment: 'xxx', hostname: 'yyy' }

myrole /任务/ main.yml

- name: add the group
  group: name={{ item }} state=present
  with_items: "{{ environment }}_{{ hostname }}_groups"

myrole /默认/ main.yml

xxx_yyy_groups: [ '1', '2', '3', ]

然而,当我将变量传递给我的角色时,它无法使用defaults / main.yml文件,我收到以下错误:

  

TASK [internal / groups_users_folders:添加组] ******************************

     

失败! => {“failed”:true,“msg”:“环境必须是字典,   收到xxx()“}

为什么Ansible不能再访问defaults文件夹中的变量了? 还是有更优雅的方式?

编辑:

显然Ansible不喜欢将变量称为“环境”,我不能像这样将with_items变量粘在一起。

- name: set groups variable
  set_fact:
    groups: "{{ env }}_{{ hostname }}_groups" 

- name: add groups
  group: name={{ item }} state=present
  with_items: "{{ groups }}"

似乎使用数组,如果我使用哈希并想要使用item.xxx访问变量,则此错误返回:

  

失败! => {“failed”:true,“msg”:“字段'args'无效   value,似乎包含未定义的变量。该   错误是:'unicode对象'没有属性'name'\ n \ n错误   好像一直在   '... /任务/ main.yml':   第25行,第3列,但可能在文件的其他位置,具体取决于   确切的语法问题。\ n \ n违规行似乎是:\ n \ n \ n-   name:添加用户\ n ^ here \ n“}

2 个答案:

答案 0 :(得分:2)

您使用with_items与with_items: "{{ env }}_{{ hostname }}_groups"有点错误。 实际上你传递字符串“xxx_yyy_groups”,但你需要将它作为变量名传递。

我做了一些研究,看起来不可能这样做。你要么像你一样使用事实,要么用变量加载文件(例如。 {{ env }}_{{ hostname }}.yml)。 实际上,人们通常如何处理环境和默认OS系列的不同任务和变量。

我希望这有帮助!

UPD 您还可以查看以下答案:Ansible: how to construct a variable from another variable and then fetch it's value 得到一些细节/想法

答案 1 :(得分:0)

当你写:

{{1}}

它实际上构建了一个名为 groups 的字符串。所以问题是现在群组是一个变量,指的是字符串文字“{{env}} _ {{hostname}} _ groups”(值将被替换)因为它是一个值而不是引用,所以它不会引用default.yml中定义的列表。

<强>替代:

  1. 按照 @Andrey Rusanov
  2. 提供的建议
  3. 由于您只有每个(env,host)对的列表,因此在单独的文件中定义它们看起来不是一个好选择,因为每个文件都有一个列表变量。我建议您在字典中定义所有这些列表,并将该字典放在 default.yml 中以维护您的约束。以下应该是字典的结构:
  4. {{1}}