了解Ansible Playbooks中的特权升级

314 阅读3分钟

就像你在终端上执行的常规命令一样,有些任务需要特殊的权限,以便Ansible在你的远程节点上成功执行。

了解权限升级在Ansible中的作用是很重要的,这样你就能以适当的权限执行你的任务。默认情况下,任务会以连接用户的身份运行--这可能是root或任何有SSH权限的普通用户,可以访问清单文件中的远程节点。

要运行具有扩展权限的命令,例如需要sudo 的命令,你需要在你的游戏中包含一个become 指令,设置为yes 。这可以作为一个全局设置,对该剧中的所有任务有效,或者作为一个单独的指令应用于每个任务。根据你的sudo 用户在远程节点中的设置情况,你可能还需要提供用户的sudo 密码。下面的例子是更新apt 缓存,这个任务需要root权限。

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

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

然后在新的playbook文件中添加以下几行。

~/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 指令设置为你想切换到的远程用户的名字。当你在一个游戏手册中有几个任务依赖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   

当游戏手册运行完毕后,你可以登录到远程节点上,以验证在/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中权限升级的更多详细信息,请参考官方文档