По мере добавления новых узлов (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), чем то, как это делаю я.
См. Пользователь и группа. Код ниже, вероятно, то, что вы ищете.
- 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 — определить состояние системы. Неважно, существовали пользователь или группа раньше или нет. После успешного запуска кода они будут существовать (определение состояния), а повторный запуск кода гарантирует, что они все еще существуют (аудит).