DO447管理任务执行–控制提权
RHCSA专栏:戏说 RHCSA 认证
RHCE专栏:戏说 RHCE 认证
此文章(第三章 管理任务执行–控制提权 )收录在RHCA专栏:RHCA 回忆录
📜1.1 特权升级策略
Ansible剧本可以在许多不同的级别实现特权升级。Ansible使用指令或连接变量,这取决于打算控制权限升级的级别。对于剧本、角色、块和任务,需要使用权限升级指令:become、become_user、become_method和become_flags。
📑配置特权升级
如果将Ansible配置文件的privilege_escalation部分中的become布尔值设置为yes(或true),那么剧本中的所有剧本将默认使用privileqe_escalation。当运行在被管理的主机上时,这些play将使用当前的become_method方法切换到当前的become_user。
还可以在使用命令行选项启动playbook时覆盖配置文件并指定特权升级设置。下表比较了配置指令和命令行选项:
特权升级指令和选项
重要:如果Ansible配置文件指定为:false,但命令行包含 -b选项,那么Ansible将忽略配置文件并默认使用权限升级。
📑剧本的特权升级
在编写剧本时,可能需要对某些剧本进行特权升级,但不是对所有剧本。您可以显式地指定每个剧本是否应该使用特权升级。如果play没有指定是否使用特权升级,则使用配置文件或命令行中的默认设置。
下面是一个包含三个剧本的剧本示例。第一个play使用become: true来使用特权升级,而不管配置文件或命令行选项指定什么。第二个play使用become: false表示不使用特权升级,即使配置文件或命令行选项指定这样做。第三个play没有一个become指令,将使用基于Ansible配置文件或命令行的默认设置的特权升级。变量ansible_user_id显示运行当前play的托管主机上用户的用户名。
要确保剧本使用或不使用特权升级,请在剧本中显式地指定设置。根据play或所涉及的主机,可能需要在配置设置或清单变量中指定升级方法或特权用户。
📑任务中的特权升级
可以为剧本中的一个任务开启(或关闭)特权升级。为此,向任务添加适当的become指令。
在前面的示例中,play的权限升级默认关闭,但第一个任务使用权限升级。
📑block的特权升级
如果有一个子集的任务在你的发挥,要求(或不要求)特权升级,你可以设置成为一个块。块中的所有任务都共享相同的特权升级设置,并且这个设置覆盖了在play中所做的设置。
下面的例子展示了可以用这种机制做的事情:
-
为剧本中的任务子集打开特权升级。
-
为剧本中的任务子集关闭特权升级。
-
与become_user一起使用,可以使用特权升级来执行应用程序使用的其他普通用户(如数据库用户)而不是root用户的任务子集。
📑角色的特权升级
角色有两种基本方法来执行特权升级。
-
让角色本身在其内部或其任务上设置特权升级变量。该角色的文档可能会指定是否必须设置其他变量,如become_method来使用该角色。
-
在Ansible配置或playbook中自己指定此信息。
或者,可以像前面讨论的那样,在调用该角色的角色上设置特权升级设置。或者,可以在单个角色上调整这些设置,就像可以在单个任务或块上一样:
📑连接变量的特权升级
可以使用连接变量来配置特权升级。这些连接变量可以作为组或单个主机上的清单变量应用。
下表比较了playbook和配置指令与连接变量名的关系:
重要:连接变量覆盖配置文件中的become设置,以及剧本、任务、块和角色中的设置。在使用这些变量配置特权升级时要小心,因为它们的优先级高于configuration和playbook指令。使用configuration或playbook指令通常会给你更多的灵活性和控制权,来决定是否使用特权升级。
下面的示例演示了在一个组的YAML清单中使用权限升级变量:
可以设置连接变量,以便在主机级升级特权。在每台主机上执行此操作很繁琐,但在较大组中的一台主机需要特定连接选项的情况下会很有帮助。
以下示例演示在主机级使用连接变量配置特权升级:
还可以在剧本中设置连接变量,例如在剧本本身上设置连接变量。这样做将覆盖清单变量以及任何become指令的设置。
📜1.2 选择特权升级方法
如您所见,有许多方法可以控制特权升级。那么,您应该如何选择使用哪种方法呢?在选择如何控制特权升级时,请考虑以下竞争需求:
-
让你的剧本保持简单(Ansible最佳实践的关键原则)是首要的考虑。
-
其次要考虑的是,在可能的情况下以最小权限运行任务(以避免由于playbook错误而导致托管主机的意外损害)。
许多刚使用Ansible的人总是用特权升级来运行他们的剧本。这种方法很简单,而且在许多情况下,正在执行的任务必须作为根用户运行。但是,不需要作为根运行的任务仍然使用更高的特权运行,这可能增加风险。
一些用户直接连接到根帐户,以避免权限升级。这通常不是一个好的实践,因为运行playbook的任何人都必须在管理主机。这也会使评估哪个管理员执行哪个剧本运行变得困难。
因此,一个好的实践是有选择地控制哪些play或任务需要特权升级。例如,如果apache用户可以启动httpd服务器,则不需要以root用户运行该任务。
理想情况下,应该以尽可能简单的方式配置特权升级,并且应该清楚地知道它是否用于某个任务。例如,你可以使用become: true为某个剧本打开特权升级开关的剧本,然后有选择地禁用不需要升级的任务,在该任务上使用become: false。或者,如果与工作流兼容,您可以将需要升级权限的任务分组到一个play中,将不需要升级权限的任务分组到另一个play中。
如果剧本需要特权升级,但由于某些原因您无法编辑它,那么可能需要在配置文件中设置特权升级。通常,如果剧本需要特权升级,那么剧本可能更有意义地指出该需求。最大的挑战是,使用剧本的不同主机需要不同的权限升级方法才能正常工作。在这种情况下,可以为这些主机或它们的组设置清单变量,如ansible_become_method,同时启用是否通过剧本中的become使用特权升级。
📜1.3 课本练习
[student@workstation ~]$ lab task-escalation start
📑拉取实验代码
[student@workstation ~]$ mkdir -p /home/student/git-repos/
[student@workstation ~]$ cd git-repos/
[student@workstation git-repos]$ git clone http://git.lab.example.com:8081/git/task-escalation.git
[student@workstation git-repos]$ cd task-escalation
📑删除提权配置文件
[student@workstation task-escalation]$ vim ansible.cfg
[defaults]
inventory=inventory.yml
remote_user=devops
📑对主要剧本进行提权
[student@workstation task-escalation]$ vim roles/firewall/tasks/main.yml
---
# tasks file for firewall
- name: Ensure Firewall Sources Configuration
firewalld:
source: "{
{ item.source if item.source is defined else omit }}"
zone: "{
{ item.zone if item.zone is defined else omit }}"
permanent: true
state: "{
{ item.state | default('enabled') }}"
service: "{
{ item.service if item.service is defined else omit }}"
immediate: true
port: "{
{ item.port if item.port is defined else omit }}"
loop: "{
{ firewall_rules }}"
notify: reload firewalld
become: yes
[student@workstation task-escalation]$ vim roles/firewall/handlers/main.yml
---
# handlers file for firewall
- name: reload firewalld
service:
name: firewalld
state: reloaded
become: yes
[student@workstation task-escalation]$ vim roles/haproxy/tasks/main.yml
---
# tasks file for haproxy
- block:
- name: Ensure haproxy packages are present
yum:
name:
- haproxy
- socat
state: present
- name: Ensure haproxy is started and enabled
service:
name: haproxy
state: started
enabled: true
- name: Ensure haproxy configuration is set
template:
src: haproxy.cfg.j2
dest: /etc/haproxy/haproxy.cfg
#validate: haproxy -f %s -c -q
notify: reload haproxy
become: yes
[student@workstation task-escalation]$ vim roles/haproxy/handlers/main.yml
---
# handlers file for haproxy
- block:
- name: restart haproxy
service:
name: haproxy
state: restarted
- name: reload haproxy
service:
name: haproxy
state: reloaded
become: yes
[student@workstation task-escalation]$ vim roles/apache/tasks/main.yml
---
# tasks file for apache
- block:
- name: Ensure httpd packages are installed
yum:
name:
- httpd
- php
- git
- php-mysqlnd
state: present
- name: Ensure SELinux allows httpd connections to a remote database
seboolean:
name: httpd_can_network_connect_db
state: true
persistent: true
- name: Ensure httpd service is started and enabled
service:
name: httpd
state: started
enabled: true
become: yes
[student@workstation task-escalation]$ vim roles/webapp/tasks/main.yml
- name: Ensure stub web content is deployed
copy:
content: "{
{ webapp_message }}. (version {
{ webapp_version}})\n"
dest: /var/www/html/index.html
become: yes
📑运行剧本并检测
[student@workstation task-escalation]$ ansible-playbook site.yml
[student@workstation task-escalation]$ curl servera.lab.example.com
Hello from serverb.lab.example.com. (version v1.0)
[student@workstation task-escalation]$ curl servera.lab.example.com
Hello from serverc.lab.example.com. (version v1.0)
📑清除实验
[student@workstation task-escalation]$ lab task-escalation finish
💡总结
RHCA认证需要经历5门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。
以上就是【金鱼哥】对 第三章 管理任务执行–控制提权 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。
如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!