该系列的一部分:
如何编写 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
然后将以下行添加到新的剧本文件中:
---
- hosts: all
become: yes
tasks:
- name: Update apt cache
apt:
update_cache: yes
完成后保存并关闭文件。
要运行此剧本,您需要-K
在ansible-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 文件中:
---
- 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
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 中提权的更多详细信息,请参考官方文档。