检查ansible playbook中数字的第一位数字

问题描述 投票:0回答:1

我有一个 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)

对于这两个条件是否有更好的方法?

ansible
1个回答
2
投票

几个问题。

首先,你没有比较任何东西。在表达式

'{{ 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
© www.soinside.com 2019 - 2024. All rights reserved.