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

时间:2019-05-29 22:04:16

标签: ansible

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

当前,我正在为组/用户进行测试,但始终会打印“致命”字样,而我的条件条件似乎无效。

roles / 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]

做条件式(如果不是那么做的话)要比我做的更好。

1 个答案:

答案 0 :(得分:1)

请参见usergroup。下面的代码可能就是您想要的。

- 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-elseternary过滤器(有关其他选项,请参见jinja)。与其他过程语言相比,Ansible的控制流程相当差。这是因为代码而不是先定义了系统状态,然后才定义了过程。

回答您的问题:

  

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

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