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

Joe*_*e J 18 unix ansible

我正在使用Ansible将用户添加到各种服务器.某些服务器定义了不同的UNIX组.我想为Ansible找到一种方法来检查我指定的组是否存在,如果该组存在,则将其添加到用户的辅助组列表中(但如果该组不存在则忽略该语句).

有关如何使用Ansible进行此操作的任何想法?

这是我的出发点.

命令

ansible-playbook -i 'localhost,' -c local ansible_user.yml
Run Code Online (Sandbox Code Playgroud)

ansible_user.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"
Run Code Online (Sandbox Code Playgroud)

更新:根据@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
Run Code Online (Sandbox Code Playgroud)

udo*_*dan 11

你有什么东西可以识别那些不同的宿主类型吗?

如果没有,您首先需要检查该主机上存在哪些组.您可以使用groups | tr -s " " "\012"将每行输出一个组的命令来执行此操作.

您可以将此作为单独的任务使用,如下所示:

- shell: groups | tr -s " " "\012"
  register: unix_groups
Run Code Online (Sandbox Code Playgroud)

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

- user: ...
  when: "some_group" in unix_groups.stdout_lines
Run Code Online (Sandbox Code Playgroud)

  • > = 7.0上的groups命令Red Hat和朋友不会打印/ etc/groups中的所有组.它仅打印当前用户所在的组. (4认同)
  • `getent group` 将是在系统上获取组的标准命令。(`getent group | cut -d: -f1` 仅用于组名) (3认同)
  • 在 Ubuntu 16.04 上,“groups ...”命令仅打印当前用户所属的组 (2认同)

Fra*_*ank 10

所述getent模块可用于读取/ etc /组

- 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
Run Code Online (Sandbox Code Playgroud)

  • 除非您使用“database: group”运行 getent 模块,否则“ansible_facts.getent_group”将不存在。 (3认同)