了解AnsiblePlaybook中的权限提升
就像您在终端上执行的常规命令一样,某些任务需要特殊权限才能让 Ansible 在您的远程节点上成功执行它们。
了解权限提升在 Ansible 中的工作原理非常重要,这样您就可以使用适当的权限执行任务。 默认情况下,任务将以连接用户身份运行 - 这可能是 root 或任何具有 SSH 访问清单文件中远程节点的常规用户。
要运行具有扩展权限的命令,例如需要 sudo
的命令,您需要在游戏中包含设置为 yes
的 become
指令。 这可以作为对该剧中所有任务有效的全局设置来完成,也可以作为每个任务应用的单独指令来完成。 根据您的 sudo
用户在远程节点中的设置方式,您可能还需要提供用户的 sudo
密码。 以下示例更新 apt
缓存,这是一项需要 root 权限的任务。
在 ansible-practice
目录中创建一个名为 playbook-07.yml
的新文件:
nano ~/ansible-practice/playbook-07.yml
然后将以下行添加到新的剧本文件中:
~/ansible-practice/playbook-07.yml
--- - hosts: all become: yes tasks: - name: Update apt cache apt: update_cache: yes
完成后保存并关闭文件。
要运行此 playbook,您需要在 ansible-playbook
命令中包含 -K
选项。 这将使 Ansible 提示您输入指定用户的 sudo
密码。
ansible-playbook -i inventory playbook-07.yml -u sammy -K
您还可以在执行任务或播放时更改要切换到的用户。 为此,请将 become_user
指令设置为要切换到的远程用户的名称。 当您在 playbook 中有多个依赖于 sudo
的任务时,这很有用,而且还有一些任务应该以您的普通用户身份运行。
下面的例子定义了本次播放中的所有任务默认使用sudo
执行。 这是在播放级别设置的,就在 hosts
定义之后。 第一个任务使用 root
权限在 /tmp
上创建一个文件,因为这是默认的 became_user
值。 然而,最后一个任务定义了它自己的 become_user
。
在 ansible-practice
目录中创建一个名为 playbook-08.yml
的新文件:
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
事实包含连接用户的用户名,可以在使用 -u
选项运行 ansible-playbook
命令时在执行时定义。 在本指南中,我们连接为 sammy
:
ansible-playbook -i inventory playbook-08.yml -u sammy -K
OutputBECOME 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
当 playbook 运行完成后,您可以登录远程节点以验证是否在 /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 中提权的更多详细信息,请参考【X89X】官方文档【X115X】。