Ansible:将列表限制为唯一元素

Ansible: restrict list to unique elements

我正在编写一个剧本来管理我们在 users.yml 中定义的服务器上的用户:

---
users:
- login: ab
  full_login: abcdef
  name: Aaaa Bbbb,,,
  admin_on: server1, server2
  regular_on: server3
  active: yes

我想加入一些保护措施,防止出现两个不同的用户定义了相同的登录名的情况。剧本如下所示:

---
- name: Provision users on servers
  hosts: all
  remote_user: morty
  become: yes
  vars_files: 
    - users.yml

  tasks:
  - name: Create users
    user:
      name: "{{ item.login }}"
      comment: "{{ item.name }}"
      update_password: on_create
    with_items:
      - "{{ users }}"
    when: ???

推荐的操作步骤是什么?我应该创建另一个列表来跟踪已处理的登录还是有更好的方法?

使用 assertion 任务在您的剧本的最开始进行预检:

  - name: Safety check
    assert:
      that: >
            users | map(attribute='login') | list | count
            ==
            users | map(attribute='login') | list | unique | count

在这种情况下,我们检查原始登录列表的长度是否与唯一登录列表的长度相同。