Ansible 软件管理与用户管理实战
1. 软件管理相关操作
1.1 获取新安装包信息
可以使用 debug 模块结合包事实来获取新安装包的信息,示例代码如下:
- name: show package facts for {{ my_package }}
debug:
var: ansible_facts.packages[my_package]
when: my_package in ansible_facts.packages
在执行时,可使用命令
ansible-playbook exercise122-client.yaml -e my_package=redis
来覆盖 playbook 中设置的
my_package
变量。
1.2 配置新的 RHEL 托管节点
创建一个 playbook 来完全自动化新 RHEL 主机的设置,具体要求及步骤如下:
1.
安装 sshpass 包
:在控制主机上,使用
sudo yum install sshpass
安装该包,以实现非交互式使用 SSH 密码。
2.
设置控制主机信息
:创建
exercise123.yaml
文件,代码如下:
- name: add host to inventory
hosts: localhost
tasks:
- fail:
msg: "add the options -e newhost=hostname -e newhostip=ip.ad.dr.ess and try again"
when: (newhost is undefined) or (newhostip is undefined)
- 修改本地库存文件和 /etc/hosts 文件 :
- name: add new host to inventory
lineinfile:
path: inventory
state: present
line: "{{ newhost }}"
- name: add new host to /etc/hosts
lineinfile:
path: /etc/hosts
state: present
line: "{{ newhostip }} {{ newhost}}"
tags: addhost
-
测试 playbook
:
-
使用
ansible-playbook -C exercise123.yaml测试,由于未提供命令行参数,应会失败。 -
使用
ansible-playbook -C exercise123.yaml -e newhost=ansible5 -e newhostip=192.168.4.205再次测试。
-
使用
- 配置第二个 play :在新主机上执行,play 头如下:
- name: configure a new RHEL host
hosts: "{{ newhost }}"
remote_user: root
become: false
tasks:
- 添加任务和标签 :
- name: configure user ansible
user:
name: ansible
groups: wheel
append: yes
state: present
- name: set a password for this user
shell: ’echo password | passwd --stdin ansible’
- name: enable sudo without passwords
lineinfile:
path: /etc/sudoers
regexp: ’^%wheel’
line: ’%wheel ALL=(ALL) NOPASSWD: ALL’
validate: /usr/sbin/visudo -cf %s
- 设置 SSH 相关 :
- name: create SSH directory in user ansible home
file:
path: /home/ansible/.ssh
state: directory
owner: ansible
group: ansible
- name: copy SSH public key to remote host
copy:
src: /home/ansible/.ssh/id_rsa.pub
dest: /home/ansible/.ssh/authorized_keys
tags: setuphost
-
测试第二个 play
:使用
ansible-playbook -C -k exercise123.yaml -e newhost=ansible5 -e newhostip=192.168.4.205进行测试。 -
创建 Vault 文件
:使用
ansible-vault create exercise123-vault.yaml创建文件,并输入以下内容(使用真实的用户名和密码):
rhsm_user: XXXXXXXXXXX
rhsm_password: XXXXXXXXXXX
- 编写第三个 play 的头 :
- name: use subscription manager to register and set up repos
hosts: "{{ newhost }}"
vars_files:
- exercise123-vault.yaml
tasks:
- 完成 playbook 并添加剩余任务 :
- name: register and subscribe {{ newhost }}
redhat_subscription:
username: "{{ rhsm_user }}"
password: "{{ rhsm_password }}"
state: present
- name: configure additional repo access
rhsm_repository:
name:
- rh-gluster-3-client-for-rhel-8-x86_64-rpms
- rhel-8-for-x86_64-appstream-debug-rpms
state: present
tags: registerhost
-
执行 playbook
:使用
ansible-playbook -k --ask-vault-pass exercise123.yaml -e newhost=ansible5 -e newhostip=192.168.4.205执行。若出现错误,可使用标签单独运行某个 play,如ansible-playbook --tags=registerhost exercise123.yaml -e newhost=ansible5。
1.3 相关表格
| 操作 | 命令或代码 |
|---|---|
| 安装 sshpass 包 |
sudo yum install sshpass
|
| 测试 playbook(无参数) |
ansible-playbook -C exercise123.yaml
|
| 测试 playbook(带参数) |
ansible-playbook -C exercise123.yaml -e newhost=ansible5 -e newhostip=192.168.4.205
|
| 执行 playbook |
ansible-playbook -k --ask-vault-pass exercise123.yaml -e newhost=ansible5 -e newhostip=192.168.4.205
|
| 单独运行某个 play |
ansible-playbook --tags=registerhost exercise123.yaml -e newhost=ansible5
|
1.4 流程图
graph TD;
A[安装 sshpass 包] --> B[设置控制主机信息];
B --> C[修改本地库存和 /etc/hosts 文件];
C --> D[测试 playbook];
D --> E[配置第二个 play];
E --> F[添加任务和标签];
F --> G[设置 SSH 相关];
G --> H[测试第二个 play];
H --> I[创建 Vault 文件];
I --> J[编写第三个 play 的头];
J --> K[完成 playbook 并添加剩余任务];
K --> L[执行 playbook];
2. 用户管理相关操作
2.1 “Do I Know This Already?” 测验
| 问题 | 选项 | 答案 |
|---|---|---|
| 管理现有或新用户的 SSH 已知主机文件应使用哪个 Ansible 模块? |
a. lineinfile
b. ssh_key c. ssh_config d. known_hosts | d |
| 要使现有用户成为额外组的成员而不覆盖任何当前组分配,应使用 user 模块的哪些参数?(选两个) |
a. group
b. groups c. append d. newgroups | b、c |
| 可以使用哪些 Ansible 模块来管理 sudoers 配置文件?(选两个) |
a. lineinfile
b. template c. sudoers d. sudo | a、b |
| 管理服务器的 SSH 公钥应使用哪个模块? |
a. authorized_key
b. authorized_hosts c. known_keys d. known_hosts | a |
| 查找特定文件并将其复制到托管主机应使用什么? |
a. The copy module
b. The lookup module c. The copy plug - in d. The lookup plug - in | b |
| authorized_keys 模块有以下哪个限制? |
a. 它不能从隐藏目录读取文件。
b. 它仅适用于默认 Ansible 用户。 c. 它需要将目标文件的权限模式设置为 644。 d. 它不能在 sudo shell 中工作。 | c |
| 存储在 /etc/shadow 中的加密密码由不同部分组成,以下哪个不是其中之一? |
a. 使用的哈希算法
b. 用于加密密码的随机盐 c. 用户名 d. 用户密码的加密哈希 | c |
| 可以使用不同的解决方案为 Ansible 用户模块生成加密密码,以下哪个不是其中之一? |
a. 使用 shell 模块和
passwd --stdin
命令将加密密码存储在变量中。
b. 使用 command 模块和
passwd --stdin
命令将加密密码存储在变量中。
c. 使用带有 debug 模块的临时命令生成加密密码字符串。 d. 创建一个使用 debug 模块生成加密密码字符串的任务。 | a |
| 在 playbook 中使用加密密码时,以下哪种解决方案最能确保安全性? |
a. 将密码存储在 Vault 文件中。
b. 让 playbook 提示输入要使用的密码。 c. 将密码存储在仅 root 用户可访问的文件中。 d. 使用库存变量文件读取密码。 | a |
| 创建多个用户账户的最佳方法是什么? |
a. 使用 loop 迭代用户列表。
b. 在变量中定义用户并使用 loop 迭代该变量。 c. 定义一个变量文件,其中用户定义为列表,并从 playbook 中使用 loop 迭代该列表。 d. 使用 vars_prompt 让 playbook 提示输入要使用的变量名。 | c |
2.2 管理用户和组的模块概述
不同模块用于管理用户、组及其重要属性,具体如下表所示:
| 操作 | 模块 |
| ---- | ---- |
| 管理用户 | user |
| 管理组 | group |
| 管理 sudo 配置(推荐) | template |
| 管理 sudo 配置(替代) | lineinfile |
2.3 管理用户和组示例
---
- name: creating a user and group
hosts: ansible2
tasks:
- name: setup the group account
group:
name: students
state: present
- name: setup the user account
user:
name: anna
create_home: yes
groups: wheel,students
append: yes
generate_ssh_key: yes
ssh_key_bits: 2048
ssh_key_file: .ssh/id_rsa
在使用
user
模块时,
group
参数用于指定用户的主组,
groups
参数用于使用户成为额外组的成员,对于现有用户使用
groups
参数时,需同时包含
append
参数,以避免覆盖当前的次要组分配。
2.4 管理 sudo
可使用
template
模块在
/etc/sudoers.d
目录中创建 sudo 配置文件,或使用
lineinfile
模块直接管理
/etc/sudoers
主配置文件。示例代码如下:
变量文件 vars/sudo
sudo_groups:
- name: developers
groupid: 5000
sudo: false
- name: admins
groupid: 5001
sudo: true
- name: dbas
groupid: 5002
sudo: false
- name: sales
groupid: 5003
sudo: true
- name: account
groupid: 5004
sudo: false
变量文件 vars/users
users:
- username: linda
groups: sales
- username: lori
groups: sales
- username: lisa
groups: account
- username: lucy
groups: account
模板文件 listing133.j2
{% for item in sudo_groups %}
{% if item.sudo %}
%{{ item.name}} ALL=(ALL:ALL) NOPASSWD:ALL
{% endif %}
{% endfor %}
playbook exercise131.yaml
---
- name: configure sudo
hosts: ansible2
vars_files:
- vars/sudo
- vars/users
tasks:
- name: add groups
group:
name: "{{ item.name }}"
loop: "{{ sudo_groups }}"
- name: add users
user:
name: "{{ item.username }}"
groups: "{{ item.groups }}"
loop: "{{ users }}"
- name: allow group members in sudo
template:
src: listing133.j2
dest: /etc/sudoers.d/sudogroups
validate: ‘visudo -cf %s’
mode: 0440
2.5 练习 13 - 1 管理用户和组
-
使用
mkdir host_vars创建host_vars目录。 -
创建
host_vars/ansible1文件,内容如下:
users:
- username: zeina
groups: admins
- username: marlet
groups: admins
- username: victoria
groups: students
- username: emma
groups: students
-
创建
exercise131.yaml文件,编写 play 头:
---
- name: create user accounts
hosts: ansible1
tasks:
- 添加创建所需组的任务:
- name: create groups
group:
name: "{{ item.groups }}"
state: present
loop: "{{ users }}"
- 添加创建用户账户的任务:
- name: create users
user:
name: "{{ item.username }}"
2.6 流程图
graph TD;
A[创建 host_vars 目录] --> B[创建 host_vars/ansible1 文件];
B --> C[创建 exercise131.yaml 文件并编写 play 头];
C --> D[添加创建组的任务];
D --> E[添加创建用户账户的任务];
2.7 相关总结
在用户管理方面,我们了解了多个重要的知识点:
-
模块使用
:
user
模块和
group
模块是管理用户和组的基础,通过合理设置参数可以满足不同的需求。例如
user
模块中的
group
和
groups
参数,以及
append
参数的使用。
-
sudo 管理
:可以使用
template
模块或
lineinfile
模块来管理 sudo 配置,前者通过模板文件生成 sudo 配置文件,后者直接修改主配置文件。
-
加密密码
:在使用加密密码时,将密码存储在 Vault 文件中是最安全的做法。
-
多用户创建
:定义变量文件并结合
loop
迭代是创建多个用户账户的最佳方法。
2.8 知识对比表格
| 管理内容 | 模块 | 优点 | 缺点 |
|---|---|---|---|
| 用户 | user | 功能丰富,可设置多种属性,如生成 SSH 密钥 |
部分参数使用需注意,如
groups
和
append
配合
|
| 组 | group | 简单直接,用于创建和管理组 | 功能相对单一 |
| sudo 配置(template) | template | 独立管理,避免被 RPM 更新覆盖 | 需要编写模板文件 |
| sudo 配置(lineinfile) | lineinfile | 直接修改主配置文件,操作简单 | 有被 RPM 更新覆盖的风险 |
2.9 流程图
graph LR;
A[用户管理] --> B[用户和组管理];
A --> C[sudo 管理];
A --> D[加密密码管理];
A --> E[多用户创建];
B --> B1[user 模块];
B --> B2[group 模块];
C --> C1[template 模块];
C --> C2[lineinfile 模块];
D --> D1[Vault 文件存储];
E --> E1[变量文件 + loop 迭代];
3. 总结与回顾
3.1 软件管理总结
在软件管理部分,我们学习了如何使用 Ansible 进行软件包的信息获取、新 RHEL 托管节点的配置等操作。通过一系列的步骤,包括安装必要的包、设置控制主机信息、修改配置文件、测试 playbook 等,我们可以实现软件管理的自动化。同时,使用标签可以方便地单独运行 playbook 的某个部分,提高了操作的灵活性。
3.2 用户管理总结
用户管理方面,我们了解了不同的 Ansible 模块在用户和组管理、sudo 配置、SSH 管理以及加密密码管理等方面的应用。通过测验和示例代码,我们对各个模块的使用有了更深入的理解,并且掌握了创建多个用户账户的最佳实践。
3.3 关键知识点回顾表格
| 管理领域 | 关键知识点 |
|---|---|
| 软件管理 | debug 模块获取包信息、lineinfile 模块修改配置文件、Red Hat 订阅管理、Ansible Vault 存储敏感信息 |
| 用户管理 | user 和 group 模块管理用户和组、template 和 lineinfile 模块管理 sudo 配置、authorized_key 模块管理 SSH 公钥、Vault 文件存储加密密码 |
3.4 整体流程图
graph LR;
A[Ansible 管理] --> B[软件管理];
A --> C[用户管理];
B --> B1[获取包信息];
B --> B2[配置新 RHEL 节点];
B --> B3[订阅管理];
C --> C1[用户和组管理];
C --> C2[sudo 管理];
C --> C3[SSH 管理];
C --> C4[加密密码管理];
通过以上的学习和实践,我们可以更好地利用 Ansible 进行软件和用户的管理,提高工作效率和系统的安全性。在实际应用中,我们可以根据具体的需求选择合适的模块和方法,灵活运用这些知识来解决各种问题。
超级会员免费看
40

被折叠的 条评论
为什么被折叠?



