介绍
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 能加载配置的清单,添加了共享变量,并运行了即席模块检查。后续实验将在此可重复的项目配置基础上进行构建。


