配置 Ansible 项目与权限

AnsibleBeginner
立即练习

介绍

即使 Ansible 安装正确,也可能使用了错误的清单、解释器或权限。可靠的项目会明确这些选择,并在真实目标上确认其效果。

在本实验中,你将创建项目配置,检查实际加载的值,通过清单设置目标 Python,并在两个预先准备的 SSH 节点上比较普通执行与显式权限提升。此独立环境提供了 Ansible 和连接配置;无需安装软件包或修改 SSH 服务器。

创建并加载项目配置

本步骤将创建项目配置,并确认 Ansible 确实加载了它。

你已在上一实验中安装了 Ansible。此独立环境提供课程共享安装,以便你专注于配置。打开终端并进入工作区:

cd /home/labex/project

Ansible 使用一个配置文件,按 ANSIBLE_CONFIG、当前目录的 ansible.cfg、用户主目录配置和系统配置的顺序选择第一个可用文件。因此,更改目录可能改变加载的项目配置。即使项目文件存在,环境变量也可以选择另一个文件。

预先准备的 connection-reference.cfg 包含原始训练连接设置。使用 cat 显示它:

cat connection-reference.cfg

它选择项目清单和受信任的主机密钥文件。实验已创建密钥和节点;请勿更改平台登录或 SSH 服务器。

按以下内容创建 ansible.cfg。cat > 将标准输入写入文件,替换已有内容。<<'EOF' 开始一个 here-document:请粘贴所有行,直到最后的 EOF。给标记加引号使文本保持原样。方括号中的 INI 节名称对设置分组,每行 name = value 设置一个选项。

cat > ansible.cfg <<'EOF'
[defaults]
inventory = /home/labex/project/inventory.ini
host_key_checking = True
interpreter_python = /usr/bin/python3

[privilege_escalation]
become = False

[ssh_connection]
ssh_args = -o UserKnownHostsFile=/home/labex/.local/share/ansible-course/known_hosts -o StrictHostKeyChecking=yes -o ControlMaster=auto -o ControlPersist=30s
EOF

inventory 选择主机列表。host_key_checking 保持服务器身份检查启用。interpreter_python 设置默认的目标节点 Python,而非控制节点解释器。become = False 使普通任务不提升权限。预先准备的 ssh_args 使用训练 known_hosts 文件,要求密钥受信任,并复用短期 SSH 连接。

显示版本及配置信息:

ansible --version

查找 config file = /home/labex/project/ansible.cfg。本实验的模块路径属于课程共享安装;上一个安装练习使用的是学习者的独立环境。

ansible-config dump 显示生效的配置。--only-changed 将输出限制为非默认设置,并标明各设置的来源:

ansible-config dump --only-changed

查找 CONFIG_FILE() = /home/labex/project/ansible.cfg、指向项目的 DEFAULT_HOST_LIST,以及设置为 /usr/bin/python3 的 INTERPRETER_PYTHON。输出使用内部选项名称,可能与 INI 写法不同。仅读取文件不能证明 Ansible 已加载它。

使用你已了解的 Python ping 模块测试项目配置:

ansible all -m ansible.builtin.ping

web1 和 web2 都应返回 pong。请始终在此工作区中运行命令,以保持预期配置生效。

在清单中设置目标解释器

本步骤将为两台主机设置连接变量,并理解其与项目默认值的关系。

阅读预先准备的清单:

cat inventory.ini

其中包含两个不同的 ansible_host 目标地址,后跟 [all:vars]。此节之后的设置适用于两台主机,包括 ansible_user=automation 和训练私钥路径。它们描述受管节点上的 SSH 账户与身份验证。

名为 ansible_python_interpreter 的连接变量会为其主机覆盖 interpreter_python 配置默认值。当清单需要特定目标解释器时,请使用此变量。如果清单变量指向不存在的可执行文件,正确的默认值也无法补救。

printf 打印文本;\n 表示换行。>> 追加内容,不替换现有清单。在已有的 [all:vars] 节下追加解释器变量:

printf '\nansible_python_interpreter=/usr/bin/python3\n' >> inventory.ini

再次显示清单,在 [all:vars] 下找到新设置:

cat inventory.ini

控制节点的 Python 安装保持不变。此路径将在各个受管节点内分别执行。测试两个目标:

ansible all -m ansible.builtin.ping

每个目标仍应返回 pong 和 changed: false。现在你既有可用的清单级解释器设置,也有项目默认值。配置输出描述默认值;执行过程中,连接变量可能覆盖它们。

比较普通执行与权限提升后的执行

本步骤将观察显式权限提升前后的实际远程用户。

command 模块在目标上运行程序。-a 提供模块参数;给 id -un 加引号,让 shell 将程序及其选项作为一个参数字符串传递。id -un 打印有效用户的名称:

ansible all -m ansible.builtin.command -a 'id -un'

两台主机都应报告 automation。这是清单选择的受管节点账户,而非控制节点上的 labex 用户。

--become 为本次调用请求权限提升。训练节点允许 automation 账户使用 sudo 而无需密码;项目默认设置仍为普通运行关闭权限提升:

ansible all -m ansible.builtin.command -a 'id -un' --become

两台主机都应报告 root。Ansible 的 command 模块运行命令时通常报告 CHANGED,即使是此类只读身份查询也如此。仅此标签不能证明系统配置已更改;请结合实际 stdout 和返回状态理解结果。

不加 --become 再次运行:

ansible all -m ansible.builtin.command -a 'id -un'

输出恢复为 automation。权限提升只针对一次调用显式请求,并未永久更改登录账户。请保持全局权限提升关闭,并保持平台账户配置不变。

总结

你创建并加载了项目配置,检查了生效的默认值,并通过清单提供了优先级更高的目标解释器。真实的 SSH 模块执行确认了两个目标节点均可用,身份查询则展示了普通 automation 访问与显式 become 的区别。这些检查为在不更改平台访问设置的前提下诊断连接配置打下了基础。