Ansible 如何对用户/组的存在性进行可靠条件测试?

Ansible 如何对用户/组的存在性进行可靠条件测试?,ansible,Ansible,随着新节点(CentOS 7.6)的添加,需要创建一些基本组和用户。一些节点具有一些组和用户。我只想通过我的Ansible(2.8.0版)基本角色文件在不存在组和用户的节点上创建组和用户 目前,我正在为组/用户进行测试,但始终会打印一个“致命”的标签,并且我的条件似乎不起作用 角色/basic/tasks/main.yml - name: "Does k8s group exist?" shell: grep -q "^k8s" /etc/group register: gexist

随着新节点(CentOS 7.6)的添加,需要创建一些基本组和用户。一些节点具有一些组和用户。我只想通过我的Ansible(2.8.0版)基本角色文件在不存在组和用户的节点上创建组和用户

目前,我正在为组/用户进行测试,但始终会打印一个“致命”的标签,并且我的条件似乎不起作用

角色/basic/tasks/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
我知道Ansible中唯一的
if-then-else
是过滤器(有关其他选项,请参阅)。与其他过程语言相比,Ansible中的控制流相当差。这是因为代码定义了系统的状态,而不是过程

回答你的问题:

如何对用户/组的存在性进行可靠条件测试

您的代码做得很正确,但Ansible的目的是定义系统的状态。用户或组之前是否存在并不重要。成功运行代码后,它们将存在(状态定义),再次运行代码可确保它们仍然存在(审核)