了解 Ansible Playbooks 中的权限提升


该系列的一部分:
如何编写 Ansible Playbooks

Ansible 是一种现代配置管理工具,不需要在远程节点上使用代理软件,仅使用 SSH 和 Python 在托管服务器上进行通信和执行命令。本系列将带您了解可用于编写服务器自动化剧本的主要 Ansible 功能。最后,我们将看到一个实际示例,说明如何创建剧本以自动设置远程 Nginx Web 服务器并向其部署静态 HTML 网站。

就像您在终端上执行的常规命令一样,某些任务需要特殊权限才能让 Ansible 在您的远程节点上成功执行它们。

了解权限提升在 Ansible 中的工作原理很重要,这样您就可以使用适当的权限执行任务。默认情况下,任务将作为连接用户运行 – 这可能是root或任何对清单文件中的远程节点具有 SSH 访问权限的普通用户。

要运行具有扩展权限的命令,例如需要 的命令sudo,您需要在您的游戏中包含become设置为指令yes这既可以作为对该剧中所有任务有效的全局设置,也可以作为每个任务应用的单独指令来完成。根据您的sudo用户在远程节点中的设置方式,您可能还需要提供用户的sudo密码。以下示例更新apt缓存,这是一项需要root权限的任务

playbook-07.yml在您的ansible-practice目录中创建一个名为的新文件

  • nano ~/ansible-practice/playbook-07.yml

然后将以下行添加到新的剧本文件中:

~/ansible-practice/playbook-07.yml
---
- hosts: all
  become: yes
  tasks:
    - name: Update apt cache
      apt:
        update_cache: yes

完成后保存并关闭文件。

要运行此剧本,您需要-Kansible-playbook命令中包含该选项这将使 Ansible 提示您sudo输入指定用户密码。

  • ansible-playbook -i inventory playbook-07.yml -u sammy -K

您还可以在执行任务或玩游戏时更改要切换到的用户。为此,请将become_user指令设置为要切换到的远程用户的名称。当剧本中有几个依赖于 的sudo任务,但也有一些应该作为普通用户运行的任务时,这很有用。

下面的例子定义了这个 play 中的所有任务都将sudo默认执行这是在hosts定义之后的播放级别设置的第一个任务创建一个/tmp使用root权限的文件,因为这是默认became_user值。然而,最后一个任务定义了它自己的become_user.

playbook-08.yml在您的ansible-practice目录中创建一个名为的新文件

  • nano ~/ansible-practice/playbook-08.yml

将以下内容添加到新的 playbook 文件中:

~/ansible-practice/playbook-08.yml
---
- hosts: all
  become: yes
  vars:
    user: "{{ ansible_env.USER }}"
  tasks:
    - name: Create root file
      file:
        path: /tmp/my_file_root
        state: touch

    - name: Create user file
      become_user: "{{ user }}"
      file:
        path: /tmp/my_file_{{ user }}
        state: touch

完成后保存并关闭文件。

ansible_env.USER事实包含连接的用户,这可以在执行时运行时被定义的用户名ansible-playbook与所述命令-u选项。在本指南中,我们连接为sammy

  • ansible-playbook -i inventory playbook-08.yml -u sammy -K
Output
BECOME password: PLAY [all] ********************************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [203.0.113.10] TASK [Create root file] ********************************************************************************* changed: [203.0.113.10] TASK [Create user file] ********************************************************************************* changed: [203.0.113.10] PLAY RECAP ********************************************************************************************** 203.0.113.10 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

当剧本完成运行时,您可以登录到远程节点以验证在 上创建了两个新文件/tmp,每个文件具有不同的所有权信息:

  • ssh sammy@203.0.113.10
  • ls -la /tmp/my_file*
Output
-rw-r--r-- 1 root root 0 Apr 14 13:19 /tmp/my_file_root -rw-r--r-- 1 sammy sudo 0 Apr 14 12:07 /tmp/my_file_sammy

关于 Ansible 中提权的更多详细信息,请参考官方文档

觉得文章有用?

点个广告表达一下你的爱意吧 !😁