我有一个 ansible 剧本,可以读取包含用户名和 uids 的 vars_file
users:
- name: josh
uid: 1201
- name: peter
uid: 1202
- name: paul
uid: 2101
- name: ryan
uid: 2102
我的清单文件中有两个主机组:db 和 web。如果用户的 uid 以 1 开头,我希望在 db 中创建用户;如果用户的 uid 以 2 开头,则在 web 中创建。
到目前为止我的剧本看起来像这样
---
- name: users playbook
hosts: all
become: yes
vars_files:
- vars/user_list.yml
tasks:
- name: test debug
debug:
msg: "{{ item.username }}, {{ item.uid }}"
loop: "{{ users }}"
when: '{{ item.uid[0] }} == 1'
但是我的条件抛出错误 错误是:评估条件时出错 ({{ item.uid[0] }} == 1)
对于这两个条件是否有更好的方法?
几个问题。
首先,你没有比较任何东西。在表达式
'{{ item.uid[0] }} == 1'
中,最后一部分(即 == 1
)将被逐字地视为字符串并写入为输出。如果在完整的 jinja2 表达式中使用,则比较必须在标记内:{{ item.uid[0] == 1 }}
其次,
when
子句不应包含任何 jinja2 标记来扩展变量。 failed_when
和changed_when
也是如此。请参阅条件文档
最后,仅当输入是字符串而不是整数时,通过索引获取字符才有效。因此,您首先需要通过使用
string
过滤器 正确投射来确保这一点。然后您将得到的字符本身就是一个字符串。将其与整数进行比较将始终返回 false
。因此,您要么必须将比较值写为字符串(即 '1'
),要么使用 int
过滤器将提取的字符转换为整数。
这就是我解决你的任务的方法:
- name: test debug
debug:
msg: "{{ item.username }}, {{ item.uid }}"
loop: "{{ users }}"
when: (item.uid | string)[0] | int == 1