尝试创建一个 Ansible 剧本来创建用户(用户模块) 在 RH/Cent 系统上(例如 useradd)。
每当我添加组参数时,剧本都会失败,尽管将组值设置为与新用户的“名称”参数值匹配。如果我省略组参数/值,剧本就会正常工作。
在创建具有与其用户名(相同值)匹配的主组的用户时,是否永远不应该使用组参数?
如果是这样,并且 group 参数在这种用例中被设计为省略,为什么这么多 Ansible Galaxy 示例在用户之前构建组并在那里添加组用户?换句话说,除了分配不同的主组之外,为什么在这些情况下在用户帐户之前添加用户组名称?
- name: "Adding testuser_01 user"
user:
append: yes
# authorization:
comment: "testuser_01"
create_home: yes
expires: -1
# Starting at Ansible 2.6, modify user, remove expiry time
# Had a bug until 2.6.4 but now fixed.
# Currently supported on GNU/Linux and FreeBSD.
# CentOS /etc/default/useradd is empty string by default.
force: no
generate_ssh_key: no
group: 'testuser_01' # Optionally sets the user's primary group (takes a group name).
groups: nixadm
# hidden: no
# MacOS only - optionally hide the user from the login window and system preferences. Defaults yes
home: /home/testuser_01
# local: no # Read docs and check support
# login_class: # Optionally sets the user's login class, a feature of most BSD OSs.
move_home: no
name: testuser_01
non_unique: no
password: "{{ mypw }}"
password_lock: no
# profile: # Sets the profile of the user. Currently supported on Illumos/Solaris.
remove: no
# role: # Currently supported on Illumos/Solaris.
# seuser: # Optionally sets the seuser type (user_u) on selinux enabled systems.
shell: /bin/bash
# skeleton:
# ssh_key_bits:
# ssh_key_comment:
# ssh_key_file:
# ssh_key_passphrase:
# ssh_key_type:
state: present
system: no
uid: 1001
update_password: on_create
register: testuser_01_added
答案1
阅读模块的源代码后,在CentOS环境中,您的问题的答案是:
- 如果指定主要组(无论它是什么),则该组必须在运行模块之前存在
- 如果您未指定主要组,模块将依靠 useradd 自动将用户添加到同名组。如果该组已存在,模块将负责添加标志
-N
以绕过任何潜在错误。
话虽如此,我不会依赖任何这些机制,并且会在模块中明确使用它们之前系统地创建所需的组,user
因为:
- 就你的整个剧本的运行时间而言,它不会产生太大的影响。
- 几个月后,其他人(包括你)会更容易阅读和理解你的代码。
- 它更加不可知,并且可以在需要时在各种各样的操作系统上运行(macOS,*BSD,...),重现相同的结果(幂等性),其中默认值可能不同(例如,将新用户添加到系统
users
组...)