题目描述
- 从
http://materials/user_list.yml下载要创建的用户的列表,并将它保存到/home/greg/ansible. - 在本次考试中使用在其他位置创建的密码库
/home/greg/ansible/locker.yml. 创建名为/home/greg/ansible/users.yml的 playbook ,从而按以下所述创建用户帐户:
2.1. 职位描述为 developer 的用户应当:
- 在
dev和test主机组中的受管节点上创建; - 从
pw_developer变量分配密码; - 是补充组
devops的成员。
2.2. 职位描述为 manager 的用户应当:
- 在
prod主机组中的受管节点上创建; - 从
pw_manager变量分配密码; - 是补充组
opsmgr的成员。
- 密码采用
SHA512哈希格式。 - 您的 playbook 应能够在本次考试中使用在其他位置创建的库密码文件
/home/greg/ansible/secret.txt正常运行。
详细解析
首先,进入到 /home/greg/ansible 目录,然后下载用户列表文件 user_list.yml:
wget http://materials/user_list.yml
使用 cat 命令查看一下 user_list.yml 文件可以看到如下内容:
users:
- name: bob
job: developer
- name: sally
job: manager
- name: fred
job: developer
本题和前面一题(红帽 RHCE8 认证考试:创建密码库)是相关联的,我们在做本题的时候需要用到前面做的这一题的文件,因此需要使用 Ansible 的 vars_files 关键字以列表的形式,引用前面一题创建的包含变量的文件。
由于我们还需要为用户设置组,因此,在设置之前,我们需要使用 Ansible 的 group 模块确保在目标主机上存在我们需要使用的组(可以使用 ansible-doc group 命令查看该模块的帮助信息)。
当然,既然涉及对用户的操作,那么一定会用到 Ansible 的 user 模块(可以使用 ansible-doc user 命令查看该模块的帮助信息)。
接着,根据题目要求创建并编辑如下 playbook:
vim /home/greg/ansible/users.yml
之后,在该 playbook 中写入如下内容:
---
- name:
hosts: dev,test
vars_files:
- locker.yml
- user_list.yml
tasks:
- name:
group:
name: devops
state: present
- name:
user:
name: "{{ item.name }}"
password: "{{ pw_developer | password_hash('sha512') }}"
groups: devops
loop:
"{{ users }}"
when: item.job == 'developer'
- name:
hosts: prod
vars_files:
- locker.yml
- user_list.yml
tasks:
- name:
group:
name: opsmgr
state: present
- name:
user:
name: "{{ item.name }}"
password: "{{ pw_manager | password_hash('sha512') }}"
groups: opsmgr
loop:
"{{ users }}"
when: item.job == 'manager'
由于上面的 playbook 调用了被加密的外部文件,因此在使用 ansible-play 命令执行该 playbook 时需要指定解密用的密码文件:
ansible-playbook --vault-password-file=/home/greg/ansible/secret.txt /home/greg/ansible/users.yml
根据前面一题(红帽 RHCE8 认证考试:创建密码库)中在 locker.yml 文件中写入的信息可知,执行完上面的 playbook 后,在正确的情况下,属于 developer 组的用户(即 bob 和 fred)的密码是 Imadev, 而属于 manager 组的用户(即 sally)的密码是 Imamgr.
确定了上面这些信息之后,为了验证本题中 playbook 的运行结果是否符合预期,我们就可以使用 SSH 登录到这些用户所在的主机上(我们可以从第一题创建的主机静态清单文件 inventory 中获知主机组和用户之间的对应关系。),之后,可以使用 groups 命令查看当前用户的所属组是否正确。