Ansible 用户管理与服务、启动流程管理全解析
1. 用户管理基础操作
在进行 Ansible 相关操作时,首先要确保一些基本操作的顺利执行。例如,运行
ansible-playbook exercise134.yaml
时应不会遇到错误。之后,为验证一切正常,可在控制主机上按以下步骤操作:
1. 输入
sudo su - ahmed
切换到用户
ahmed
。
2. 以用户
ahmed
身份进入 shell 后,输入
ssh ansible2
,此时 Ansible 应允许用户无需输入密码即可登录。
2. 用户管理技能总结
通过一系列操作,我们掌握了用户管理的多种技能,包括:
- 创建用户和组账户。
- 管理 SSH 授权密钥。
- 处理加密密码。
- 管理相关的 sudo 配置。
3. 考试准备建议
为了更好地备考,有以下几种选择:
- 完成此处的练习。
- 参考相关的最终准备内容。
- 利用配套网站上的考试模拟问题。
4. 关键知识点复习
复习本章的关键知识点,可参考以下表格:
| 关键主题 | 页码 |
| — | — |
| 待补充 | 待补充 |
5. 记忆表格练习
可打印配套网站上的“记忆表格”(附录 D),至少完成本章部分的表格和列表填空,然后用附录 E 中的答案进行核对。
6. 关键术语定义
需要定义以下关键术语,并在词汇表中核对答案:
- authorized_keys
- hash
- hashing algorithm
- PAM
- plug - in
- public key fingerprint
- random salt
7. 复习问题思考
以下是一些复习问题,帮助巩固知识:
1. 哪个模块可用于修改 sudo 配置?
2. 哪个模块可用于扩展标准 Linux 认证程序?
3. 哪个模块可用于管理 SSH 已知主机?
4. 在用户模块中,用哪个参数指定主组 membership?
5. 在用户模块中,用哪个参数管理次要组 membership?
6. 与 authorized_keys 模块常用的用于查找特定文件名的插件名称是什么?
7. 使用 ansible 用户模块创建用户并同时创建 SSH 密钥对时,为确保公钥文件中包含用户名,必须使用哪个额外参数?
8. authorized_keys 模块的主要限制是什么?
9. 有哪两种方法可生成加密密码哈希?
10. 使用 passwd –stdin 方法生成加密密码时,必须使用哪个 Ansible 模块?
8. 实验练习 - 创建用户
在本章的实验中,需要编写一个 playbook 来创建用户,具体要求如下:
- 创建用户
kim
、
christina
、
kelly
和
bill
。
- 用户
kim
和
kelly
必须是
profs
组的成员;用户
christina
和
bill
是
students
组的成员。
- 创建用户时,将加密密码设置为 “password”。
- 确保
profs
组的成员具有 sudo 权限。
以下是可能的 playbook 示例:
---
- name: Create users
hosts: all
tasks:
- name: Create users
user:
name: "{{ item.name }}"
password: "{{ 'password' | password_hash('sha512') }}"
groups: "{{ item.groups }}"
append: yes
loop:
- { name: 'kim', groups: 'profs' }
- { name: 'christina', groups: 'students' }
- { name: 'kelly', groups: 'profs' }
- { name: 'bill', groups: 'students' }
- name: Add sudo privileges to profs group
lineinfile:
path: /etc/sudoers
line: '%profs ALL=(ALL) ALL'
validate: 'visudo -cf %s'
9. 服务管理概述
服务管理是 Ansible 的重要应用场景,可通过多种方式进行管理,包括:
- 管理 systemd 服务。
- 使用 Linux cron 和 at 管理任务。
- 管理托管系统应启动的所需 systemd 目标。
- 重启运行中的机器。
以下是相关模块的概述表格:
| 模块 | 功能 |
| — | — |
| service | 可管理服务,适用于多种 init 系统(System - V init、Upstart、systemd) |
| systemd | 处理 systemd 特定功能,如 daemon_reload 和 mask |
| cron | 管理 cron 作业 |
| at | 管理一次性任务 |
10. systemd 服务管理
-
通用服务管理
:
service模块可用于管理各种 init 系统下的服务,很多服务相关任务都可使用该模块。 -
systemd 特定管理
:当需要处理 systemd 特定功能时,需使用
systemd模块。例如,daemon_reload功能可强制 systemd 守护进程重新读取其配置文件,mask功能可标记 systemd 服务,使其无法启动。以下是使用systemd模块管理服务的示例:
---
- name: using systemd module to manage services
hosts: ansible2
tasks:
- name: enable service httpd and ensure it is not masked
systemd:
name: httpd
enabled: yes
masked: no
daemon_reload: yes
11. cron 作业管理
cron
模块可用于管理 cron 作业,它可以通过以下几种方式管理作业:
- 直接将作业写入用户的 crontab。
- 将作业写入
/etc/crontab
或
/etc/cron.d
目录下。
- 将作业传递给 anacron,使其按小时、天、周、月或年运行,而无需具体指定时间。
以下是一个运行
fstrim
命令的 cron 作业示例:
---
- name: run a cron job
hosts: ansible2
tasks:
- name: run a periodic job
cron:
name: "run fstrim"
minute: "5"
hour: "4,19"
job: "fstrim"
若要删除 cron 作业,可使用以下示例:
---
- name: run a cron job
hosts: ansible2
tasks:
- name: run a periodic job
cron:
name: "run fstrim"
state: absent
12. at 作业管理
at
模块用于管理一次性任务。使用时,需理解通过
count
和
units
定义任务从现在起多久后执行。例如,若要在 5 分钟后运行任务,可按以下示例操作:
---
- name: run an at task
hosts: ansible2
tasks:
- name: run command and write output to file
at:
command: "date > /tmp/my-at-file"
count: 5
units: minutes
unique: yes
state: present
13. cron 作业管理练习
以下是一个 cron 作业管理的练习流程:
1. 创建
exercise141 - 1.yaml
并添加以下内容:
---
- name: run a cron job
hosts: ansible2
tasks:
- name: run a periodic job
cron:
name: "run logger"
minute: "0"
hour: "5"
job: "logger IT IS 5 AM"
-
运行
ansible-playbook exercise141 - 1.yaml。 -
使用
ansible ansible2 -a “crontab -l”验证 cron 作业是否添加成功。 -
创建
exercise141 - 2.yaml运行新的 cron 作业,但使用相同的名称:
---
- name: run a cron job
hosts: ansible2
tasks:
- name: run a periodic job
cron:
name: "run logger"
minute: "0"
hour: "6"
job: "logger IT IS 6 AM"
-
运行
ansible-playbook exercise141 - 2.yaml,注意作业状态会改变。 -
再次使用
ansible ansible2 -a “crontab -l”验证新作业是否覆盖了旧作业。 -
编写
exercise141 - 3.yaml删除刚创建的 cron 作业:
---
- name: run a cron job
hosts: ansible2
tasks:
- name: run logger
cron:
name: "run logger"
state: absent
-
运行
ansible-playbook exercise141 - 3.yaml,然后使用ansible ansible2 -a “crontab -l”验证作业是否已删除。
14. 启动流程管理概述
Ansible 在启动流程管理方面没有特定模块,需使用通用模块,如
file
模块管理 systemd 启动目标,
lineinfile
模块管理 GRUB 配置。不过,Ansible 提供了
reboot
模块,可重启主机并在重启后继续执行任务。
15. systemd 目标管理
管理主机应启动的默认目标是常见任务,但
systemd
模块没有管理此设置的选项,需使用通用模块。若要管理默认 systemd 目标,
/etc/systemd/system/default.target
文件必须是指向所需默认目标的符号链接。以下是管理默认启动目标的示例:
---
- name: set default boot target
hosts: ansible2
tasks:
- name: set boot target to graphical
file:
src: /usr/lib/systemd/system/graphical.target
dest: /etc/systemd/system/default.target
state: link
16. 托管主机重启管理
当需要在运行 playbook 时重启托管主机,可使用
reboot
模块。该模块使用多个参数重启托管节点,为验证主机重启后是否可用,需指定
test_command
参数。同时,还有四个与超时相关的参数:
-
connect_timeout
:成功连接前的最大等待秒数。
-
post_reboot_delay
:重启命令发出后等待验证主机可用的秒数。
-
pre_reboot_delay
:实际发出重启命令前的等待秒数。
-
reboot_timeout
:等待重启机器响应测试命令的最大秒数。
以下是重启托管主机的示例:
---
- name: reboot all hosts
hosts: all
gather_facts: no
tasks:
- name: reboot hosts
reboot:
msg: reboot initiated by Ansible
test_command: whoami
- name: print message to show host is back
debug:
msg: successfully rebooted
17. 启动状态管理练习
以下是启动状态管理的练习步骤:
1. 准备工作:使用
ansible ansible2 -m file -a “state=link src=/usr/lib/systemd/system/graphical.target dest=/etc/systemd/system/default.target”
更改托管主机的默认启动目标。
2. 创建
exercise142.yaml
并编写以下 playbook 头:
---
- name: set default boot target and reboot
hosts: ansible2
tasks:
-
设置默认启动目标为
multi - user.target:
- name: set default boot target
file:
src: /usr/lib/systemd/system/multi - user.target
dest: /etc/systemd/system/default.target
state: link
- 完成 playbook 以重启托管主机:
- name: reboot hosts
reboot:
msg: reboot initiated by Ansible
test_command: whoami
- name: print message to show host is back
debug:
msg: successfully rebooted
-
运行
ansible-playbook exercise142.yaml。 -
使用
ansible ansible2 -a “systemctl get - default”测试重启是否成功。
18. 启动流程和服务高级练习
本次高级练习相对简单,将引导创建一个 playbook,在重启前运行命令,在下次重启时安排 cron 作业,并确保重启后使用特定命令。以下是具体步骤:
1. 创建
exercise143.yaml
并编写 playbook 头:
---
- name: exercise143
hosts: ansible2
tasks:
-
编写第一个任务,使用
lineinfile模块在/tmp/rebooted文件末尾添加一行:
- name: add a line to file before rebooting
lineinfile:
create: true
state: present
path: /tmp/rebooted
insertafter: EOF
line: rebooted at {{ ansible_facts['date_time']['time'] }}:{{ ansible_facts['date_time']['second'] }}
- 添加一个在重启时运行的 cron 作业:
- name: add cron job at reboot
cron:
name: "add message after reboot"
special_time: reboot
job: "echo $(date) >> /tmp/rebooted"
通过以上内容,我们全面了解了 Ansible 在用户管理、服务管理以及启动流程管理方面的操作和应用,希望这些内容能帮助你更好地掌握 Ansible 的相关技能。
Ansible 用户管理与服务、启动流程管理全解析
19. 服务管理模块对比
为了更清晰地了解不同服务管理模块的特点,我们对
service
模块和
systemd
模块进行详细对比,如下表所示:
| 功能 | service 模块 | systemd 模块 |
| — | — | — |
| 适用 init 系统 | System - V init、Upstart、systemd | 仅针对 systemd |
| 服务启用/禁用 | 支持 | 支持 |
| 服务启动/停止 | 支持 | 支持 |
| daemon_reload 功能 | 不支持 | 支持 |
| mask 功能 | 不支持 | 支持 |
从表格中可以看出,
service
模块通用性强,适用于多种 init 系统;而
systemd
模块则专注于 systemd 特定功能。
20. 作业管理模块总结
对于作业管理,
cron
模块和
at
模块各有其适用场景,我们可以通过以下 mermaid 流程图来直观展示:
graph LR
A[需要管理作业] --> B{作业类型}
B -->|周期性作业| C[cron 模块]
B -->|一次性作业| D[at 模块]
C --> E[写入用户 crontab]
C --> F[写入 /etc/crontab 或 /etc/cron.d]
C --> G[传递给 anacron]
D --> H[通过 count 和 units 定义执行时间]
从流程图可以清晰地看到,根据作业是周期性还是一次性的,我们可以选择合适的模块进行管理。
21. 启动流程管理模块依赖
在启动流程管理中,不同模块之间存在一定的依赖关系,我们可以通过以下表格来梳理:
| 管理任务 | 依赖模块 |
| — | — |
| 管理 systemd 启动目标 | file 模块 |
| 管理 GRUB 配置 | lineinfile 模块 |
| 重启主机并继续任务 | reboot 模块 |
这表明在启动流程管理中,我们需要根据不同的任务选择合适的通用模块。
22. 综合案例分析
假设我们需要完成一个综合任务:创建用户、管理服务、设置启动目标并重启主机。以下是一个完整的 playbook 示例:
---
- name: Comprehensive task
hosts: ansible2
tasks:
- name: Create users
user:
name: "{{ item.name }}"
password: "{{ 'password' | password_hash('sha512') }}"
groups: "{{ item.groups }}"
append: yes
loop:
- { name: 'kim', groups: 'profs' }
- { name: 'christina', groups: 'students' }
- { name: 'kelly', groups: 'profs' }
- { name: 'bill', groups: 'students' }
- name: Add sudo privileges to profs group
lineinfile:
path: /etc/sudoers
line: '%profs ALL=(ALL) ALL'
validate: 'visudo -cf %s'
- name: Enable service httpd and ensure it is not masked
systemd:
name: httpd
enabled: yes
masked: no
daemon_reload: yes
- name: Set default boot target to multi - user.target
file:
src: /usr/lib/systemd/system/multi - user.target
dest: /etc/systemd/system/default.target
state: link
- name: Reboot hosts
reboot:
msg: reboot initiated by Ansible
test_command: whoami
- name: Print message to show host is back
debug:
msg: successfully rebooted
这个 playbook 涵盖了用户创建、sudo 权限设置、服务管理、启动目标设置和主机重启等多个任务,展示了 Ansible 的强大功能。
23. 常见问题及解决方法
在使用 Ansible 进行用户管理、服务管理和启动流程管理过程中,可能会遇到一些常见问题,以下是一些问题及解决方法:
1.
问题
:运行
ansible-playbook
时出现错误。
-
解决方法
:检查 playbook 文件的语法是否正确,可使用
ansible-playbook --syntax-check
进行语法检查。
2.
问题
:使用
systemd
模块的
daemon_reload
功能后服务未重新加载配置。
-
解决方法
:确保服务文件目录的权限和配置正确,可手动使用
systemctl daemon-reload
进行验证。
3.
问题
:使用
cron
模块添加的作业未按预期执行。
-
解决方法
:检查作业的时间设置是否正确,以及作业命令是否可正常执行。
24. 最佳实践建议
为了更高效地使用 Ansible 进行管理,以下是一些最佳实践建议:
-
模块化设计
:将不同功能的任务封装成独立的模块,提高 playbook 的可维护性和复用性。
-
错误处理
:在 playbook 中添加错误处理机制,如使用
ignore_errors
或
failed_when
等参数,确保任务在出现错误时能有合适的处理方式。
-
日志记录
:在关键任务中添加日志记录,方便后续排查问题和监控任务执行情况。
25. 未来拓展方向
随着技术的不断发展,Ansible 在用户管理、服务管理和启动流程管理方面还有很多可以拓展的方向:
-
自动化部署
:结合容器技术,实现应用的自动化部署和管理。
-
与云平台集成
:与各大云平台集成,实现云资源的自动化管理。
-
智能监控
:结合监控工具,实现对系统状态的实时监控和自动调整。
通过以上内容,我们对 Ansible 在用户管理、服务管理和启动流程管理方面有了更深入的理解和掌握。希望这些知识能帮助你在实际工作中更好地运用 Ansible 进行系统管理。
超级会员免费看
78

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



