金鱼哥RHCA回忆录:DO447管理任务执行--控制提权

举报
金鱼哥 发表于 2022/06/10 18:40:16 2022/06/10
【摘要】 第三章 管理任务执行--控制提权

🎹 个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家,阿里云社区·专家博主
📚个人资质:CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL😜
💬格言:努力不一定成功,但要想成功就必须努力🔥


📜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时覆盖配置文件并指定特权升级设置。下表比较了配置指令和命令行选项:

特权升级指令和选项

image-20220408224522831

重要:如果Ansible配置文件指定为:false,但命令行包含 -b选项,那么Ansible将忽略配置文件并默认使用权限升级。


📑剧本的特权升级

在编写剧本时,可能需要对某些剧本进行特权升级,但不是对所有剧本。您可以显式地指定每个剧本是否应该使用特权升级。如果play没有指定是否使用特权升级,则使用配置文件或命令行中的默认设置。

下面是一个包含三个剧本的剧本示例。第一个play使用become: true来使用特权升级,而不管配置文件或命令行选项指定什么。第二个play使用become: false表示不使用特权升级,即使配置文件或命令行选项指定这样做。第三个play没有一个become指令,将使用基于Ansible配置文件或命令行的默认设置的特权升级。变量ansible_user_id显示运行当前play的托管主机上用户的用户名。

image-20220408224617004

要确保剧本使用或不使用特权升级,请在剧本中显式地指定设置。根据play或所涉及的主机,可能需要在配置设置或清单变量中指定升级方法或特权用户。


📑任务中的特权升级

可以为剧本中的一个任务开启(或关闭)特权升级。为此,向任务添加适当的become指令。

image-20220408224651433

在前面的示例中,play的权限升级默认关闭,但第一个任务使用权限升级。


📑block的特权升级

如果有一个子集的任务在你的发挥,要求(或不要求)特权升级,你可以设置成为一个块。块中的所有任务都共享相同的特权升级设置,并且这个设置覆盖了在play中所做的设置。

下面的例子展示了可以用这种机制做的事情:

  • 为剧本中的任务子集打开特权升级。

  • 为剧本中的任务子集关闭特权升级。

  • 与become_user一起使用,可以使用特权升级来执行应用程序使用的其他普通用户(如数据库用户)而不是root用户的任务子集。

image-20220408224742103


📑角色的特权升级

角色有两种基本方法来执行特权升级。

  • 让角色本身在其内部或其任务上设置特权升级变量。该角色的文档可能会指定是否必须设置其他变量,如become_method来使用该角色。

  • 在Ansible配置或playbook中自己指定此信息。

或者,可以像前面讨论的那样,在调用该角色的角色上设置特权升级设置。或者,可以在单个角色上调整这些设置,就像可以在单个任务或块上一样:

image-20220408224815816


📑连接变量的特权升级

可以使用连接变量来配置特权升级。这些连接变量可以作为组或单个主机上的清单变量应用。

下表比较了playbook和配置指令与连接变量名的关系:

image-20220408224841333

重要:连接变量覆盖配置文件中的become设置,以及剧本、任务、块和角色中的设置。在使用这些变量配置特权升级时要小心,因为它们的优先级高于configuration和playbook指令。使用configuration或playbook指令通常会给你更多的灵活性和控制权,来决定是否使用特权升级。

下面的示例演示了在一个组的YAML清单中使用权限升级变量:

image-20220408224906639

可以设置连接变量,以便在主机级升级特权。在每台主机上执行此操作很繁琐,但在较大组中的一台主机需要特定连接选项的情况下会很有帮助。

以下示例演示在主机级使用连接变量配置特权升级:

image-20220408225006916

还可以在剧本中设置连接变量,例如在剧本本身上设置连接变量。这样做将覆盖清单变量以及任何become指令的设置。

image-20220408225021713


📜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门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。

以上就是【金鱼哥】对 第三章 管理任务执行–控制提权 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。

💾红帽认证专栏系列:
RHCSA专栏:戏说 RHCSA 认证
RHCE专栏:戏说 RHCE 认证
此文章收录在RHCA专栏:RHCA 回忆录

如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。

如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。