Ansible:仅当Unix组存在时才将其添加到用户

um6iljoc  于 2022-11-23  发布在  Unix
关注(0)|答案(4)|浏览(154)

我正在使用Ansible将用户添加到各种服务器中。有些服务器定义了不同的UNIX组。我希望找到一种方法,让Ansible检查我指定的组是否存在,如果该组存在,则将其添加到用户的辅助组列表中(但如果该组不存在,则忽略语句it)。
有什么想法我可以做这个与Ansible?
这是我的出发点。

命令

ansible-playbook -i 'localhost,' -c local ansible_user.yml

ansible_用户.yml

---

- hosts: all
  user: root
  become: yes
  vars:
    password: "!"
    user: testa
  tasks:
    - name: add user
      user: name="{{user}}"
            state=present
            password="{{password}}"
            shell=/bin/bash
            append=yes
            comment="test User"

**更新:**基于@udondan建议的解决方案,我能够通过以下附加任务来实现此功能。

- name: Check if user exists
      shell: /usr/bin/getent group | awk -F":" '{print $1}'
      register: etc_groups

    - name: Add secondary Groups to user
      user: name="{{user}}" groups="{{item}}" append=yes
      when: '"{{item}}" in etc_groups.stdout_lines'
      with_items: 
          - sudo
          - wheel
q0qdq0h2

q0qdq0h21#

getent模块可用于读取/etc/group

- name: Determine available groups
  getent:
    database: group

- name: Add additional groups to user
  user: name="{{user}}" groups="{{item}}" append=yes
  when: item in ansible_facts.getent_group
  with_items: 
      - sudo
      - wheel
llew8vvj

llew8vvj2#

你有什么东西可以识别这些不同的主机类型吗?
如果没有,你首先需要检查主机上存在哪些组,你可以用命令getent group | cut -d: -f1来完成,它将每行输出一个组。
您可以将其作为单独的任务使用,如下所示:

- shell: getent group | cut -d: -f1
  register: unix_groups

之后,当您要添加用户组时,可以使用注册的结果

- user: ...
  when: "'some_group' in unix_groups.stdout_lines"
fkaflof6

fkaflof63#

这就是我在剧本中处理这个问题的方法。想法很简单--取一个现有组的列表,找到用户希望加入的组与现有组之间的交集:

- name: Get Existing Groups
  getent:
    database: group

- name: Configure Users
  user:
    name: username
    groups: "{{ ['wheel', 'docker', 'video'] | intersect(ansible_facts['getent_group'] | list) }}"

getent模块输出'getent_group' Ansible事实,其中包含所有现有组及其详细信息。通过将其传送到| list过滤器,我得到了组名的普通列表。intersect过滤器找到了两个列表之间的共同点。
这个解决方案的优点之一是我不需要使用user模块的 append 参数。这样就可以正确地将用户从我不想让其成为成员的组中删除。

7vhp5slm

7vhp5slm4#

我也有类似的要求,然后我做了以下工作,
可靠性[核心2.12.2]

---
- hosts: all
  become: yes
  become_user: root
  tasks:
     - ansible.builtin.user:
         name: test1
         password: "&&**%%^^"
         uid: 1234
         shell: /bin/bash

     - ansible.builtin.shell:
         "cat /etc/group| grep -o sysadmin"
       register: output

#you can omit the debug part
     - debug:
         var: output

     - name: assign user the group
       ansible.builtin.shell:
          "usermod -G sysadmin test1"
       when: "'sysadmin' in output.stdout_lines"

更新:谢谢你的建议@Jeter-work

- hosts: localhost
  tasks: 
     - name: Get all groups
       ansible.builtin.getent:
         database: group
         split: ':'
     - debug:
         var: ansible_facts.getent_group

相关问题