我想根据环境和主机名创建文件夹,用户和组。
我的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“}
答案 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}}