Как выполнить проверку состояния Ansible для существования пользователя/группы?

По мере добавления новых узлов (CentOS 7.6) необходимо создавать основные группы и пользователей. Некоторые из узлов имеют некоторые группы и пользователей. Я хотел бы создавать группы и пользователей только на тех узлах, где они не существуют, с помощью моего файла базовой роли Ansible (версия 2.8.0).

В настоящее время я тестирую группу/пользователя, но всегда печатается «фатальный», и мои условия не работают.

роли/базовые/задачи/main.yml

- name: "Does k8s group exist?"
  shell: grep -q "^k8s" /etc/group
  register: gexist

- name: "Create k8s group"
  shell: groupadd -g 8000 k8s
  when: gexist.rc != 0    

- name: "Does k8s user exist?"
  shell: id -u k8s > /dev/null 2>&1
  register: uexist

- name: "Create k8s user"
  shell: useradd -g 8000 -d /home/k8s -s /bin/bash -u 8000 -m k8s
  when: uexist.rc != 0

который дает:

TASK [basic : Does k8s group exist?] *****************************************************************************************************************************
fatal: [master]: FAILED! => {"changed": true, "cmd": "grep -q \"^k8s:\" /etc/group", "delta": "0:00:00.009424", "end": "2019-05-29 14:42:17.947350", "msg": "non-zero return code", "rc": 1, "start": "2019-05-29 14:42:17.937926", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
fatal: [node3]: FAILED! => {"changed": true, "cmd": "grep -q \"^k8s:\" /etc/group", "delta": "0:00:00.012089", "end": "2019-05-29 06:41:36.661356", "msg": "non-zero return code", "rc": 1, "start": "2019-05-29 06:41:36.649267", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
fatal: [node1]: FAILED! => {"changed": true, "cmd": "grep -q \"^k8s:\" /etc/group", "delta": "0:00:00.010104", "end": "2019-05-29 14:42:17.990460", "msg": "non-zero return code", "rc": 1, "start": "2019-05-29 14:42:17.980356", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
changed: [node2]

Должно быть лучше делать условные выражения (if-then-else), чем то, как это делаю я.

Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
0
0
223
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

См. Пользователь и группа. Код ниже, вероятно, то, что вы ищете.

- name: "Create k8s group"
  group:
    gid: 8000
    name: k8s

- name: "Create k8s user"
  user:
    group: k8s
    home: /home/k8s
    shell: /bin/bash
    uid: 8000
    name: k8s

Единственный известный мне if-then-else в Ansible — это фильтр троичный (другие параметры см. в разделе Джиндзя). Поток управления в Ansible довольно плохой по сравнению с другими процедурными языками. Это потому, что код определяет скорее состояние системы, чем процедуру.

Чтобы ответить на ваш вопрос:

How to do an Ansible condition test of user/group existence?

Ваш код делает это правильно, но цель Ansible — определить состояние системы. Неважно, существовали пользователь или группа раньше или нет. После успешного запуска кода они будут существовать (определение состояния), а повторный запуск кода гарантирует, что они все еще существуют (аудит).

Другие вопросы по теме