配置 ansible.cfg 与项目默认设置

AnsibleBeginner
立即练习

介绍

Ansible 会按照预定的顺序查找配置文件。项目级的 ansible.cfg 非常重要,因为它能确保无论在哪个 Shell 会话中运行,命令的行为都是一致且可重复的。

在本实验中,你将创建一个小型项目,编写 ansible.cfg,定义清单默认设置,添加共享变量,并从项目目录中运行你的首次 Ansible 检查。

创建最小化项目与清单

在此步骤中,你将创建项目级 Ansible 配置所需的目录和清单文件。本实验从全新的虚拟机开始,因此你只需构建此处所需的文件。

创建项目结构。

cd /home/labex/project
mkdir -p rhce-ansible/{inventory,group_vars,playbooks}

本实验特意保持项目规模精简。inventory 将存放受管主机列表,group_vars 将存放 Ansible 自动加载的变量,而 playbooks 则预留给后续的自动化文件。

进入项目目录。

cd rhce-ansible

创建一个包含一个本地受管主机的清单。

cat > inventory/hosts <<'EOF'
[managed]
node1 ansible_connection=local
EOF

主机名 node1 是一个清单别名,而非独立的虚拟机。ansible_connection=local 设置使得 Ansible 在此 RHEL 系统上运行模块,同时仍允许你练习组定位功能。

为项目编写 ansible.cfg

在此步骤中,你将创建 ansible.cfg。[defaults] 部分用于控制通用行为。设置 inventory 意味着你无需在每次执行命令时都输入 -i inventory/hosts。

在执行此步骤的命令前,请返回项目目录,以便相对路径能正确指向 Ansible 项目。

cd /home/labex/project/rhce-ansible

编写配置文件。

cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
remote_user = labex
host_key_checking = False
retry_files_enabled = False
interpreter_python = auto_silent
stdout_callback = default
EOF

每一项设置都省去了一个重复的命令行选项。inventory 指向静态清单文件,remote_user 设置默认登录用户,host_key_checking = False 可避免在实验环境中出现 SSH 主机密钥提示,而 interpreter_python = auto_silent 则让 Ansible 在不产生冗余发现警告的情况下自动选择 Python。

查询 Ansible 当前正在使用的配置文件。

ansible --version | sed -n '1,4p'

输出结果应包含 config file = /home/labex/project/rhce-ansible/ansible.cfg。

这是一个重要的习惯:如果 Ansible 读取的是其他配置文件,后续命令可能会使用与实验预期不同的清单、回调或连接行为。

通过项目默认设置检查清单

在此步骤中,你将测试 ansible.cfg 是否确实将 Ansible 指向了你的清单。由于清单路径已配置,此命令无需 -i 选项。

在执行此步骤的命令前,请返回项目目录,以便相对路径能正确指向 Ansible 项目。

cd /home/labex/project/rhce-ansible

显示清单图表。

ansible-inventory --graph

图表应显示 managed 组和 node1 主机。

在运行命令前查看图表非常有用,因为它展示了 Ansible 解析后的清单结构。如果此处缺少某个组或主机,Playbook 的目标也无法找到它。

列出 node1 的主机变量。

ansible-inventory --host node1

你应该能看到 ansible_connection 被设置为 local。

主机视图显示的是解析后的主机变量,而不仅仅是原始清单行。后续实验将使用相同的命令来排查变量究竟是来自清单、group_vars 还是 host_vars。

添加共享变量

在此步骤中,你将为所有受管主机添加变量。当 group_vars 下的文件名与清单组或 all 匹配时,它们会被自动加载。

在执行此步骤的命令前,请返回项目目录,以便相对路径能正确指向 Ansible 项目。

cd /home/labex/project/rhce-ansible

创建 group_vars/all.yml。YAML 使用 key: value 键值对。请确保冒号后留有一个空格。

cat > group_vars/all.yml <<'EOF'
project_owner: labex
baseline_message: Managed by the RHCE Ansible prep project
EOF

文件名 all.yml 具有特殊含义:Ansible 会将其应用于清单中的每一台主机。由于这是 YAML 格式,缩进和冒号后的空格是确保文件有效的必要组成部分。

使用 debug 模块打印受管主机中的一个变量。

ansible managed -m ansible.builtin.debug -a 'var=baseline_message'

输出结果应包含来自 group_vars/all.yml 的消息。

该即席命令包含三个部分:managed 是主机模式,-m 选择模块,-a 传递模块参数。成功的结果证明了配置的清单和变量加载功能正在协同工作。

运行连通性检查

在此步骤中,你将运行 ping 模块。这不是 ICMP ping,而是一个用于检查 Ansible 是否能在目标主机上执行 Python 的 Ansible 模块。

在执行此步骤的命令前,请返回项目目录,以便相对路径能正确指向 Ansible 项目。

cd /home/labex/project/rhce-ansible

针对 managed 组运行检查。

ansible managed -m ansible.builtin.ping

成功的结果应包含 pong。

Ansible 的 ping 模块是一个模块执行测试,而非网络 ICMP ping。它证明了 Ansible 可以连接到主机、启动 Python 并返回模块结果。

通过即席命令保存一个小型的证明文件。copy 模块会将内容写入目标路径。

ansible managed -m ansible.builtin.copy -a 'content=ansible_cfg_ready dest=/home/labex/project/rhce-ansible/config-check.txt mode=0644'

当此命令报告 changed 时,说明 Ansible 已经创建或更新了该文件。如果你再次使用相同的内容和模式运行它,结果应变为 ok,因为目标状态已经存在。

总结

你创建了项目级的 ansible.cfg,确认了 Ansible 能加载配置的清单,添加了共享变量,并运行了即席模块检查。后续实验将在此可重复的项目配置基础上进行构建。