如何通过独立YAML文件为多组Ansible主机配置堡垒机连接参数
问题:为多组Ansible主机配置独立堡垒机连接参数并通过
--extra-vars加载 现有环境
Inventory文件(inventory-otc-50160)
[eu-de_eos] eos-apps-45180 ansible_host=10.20.0.21 eos-apps-45181 ansible_host=10.20.0.22 [eu-de_ora] ora-apps-45184 ansible_host=10.20.0.23 ora-apps-45185 ansible_host=10.20.0.24 [all_servers:children] eu-de_eos eu-de_ora
Playbook(manage_users.yml)
- name: 查看/etc/hosts内容 hosts: "{{ variable_host | default('all') }}" remote_user: "{{ variable_user | default('ansible') }}" roles: - cat-hosts
单组配置可行方案
针对eu-de_ora组的参数文件(oravars.yaml):
ansible_port: 22 ansible_user: linux ansible_ssh_private_key_file: ~/.ssh/ora.pem ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o ProxyCommand=\"ssh -q ansible@10.20.30.40 -o Port=65222 -W %h:%p\""
执行命令:
ansible-playbook -i inventory/inventory-otc-50160 manage_users.yml --extra-vars "@inventory/oravars.yaml" --extra-vars "variable_host=eu-de_ora"
多组配置尝试失败的写法
直接将组名作为顶层键的YAML无法生效:
# 此配置无效 :( eu-de_ora: ansible_port: 22 ansible_user: linux ansible_ssh_private_key_file: ~/.ssh/ora.pem ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o ProxyCommand=\"ssh -q ansible@10.20.30.40 -o Port=65222 -W %h:%p\"" eu-de_eos: ansible_port: 22 ansible_user: linux ansible_ssh_private_key_file: ~/.ssh/eos.pem ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o ProxyCommand=\"ssh -q ansible@30.40.50.60 -o Port=65222 -W %h:%p\""
需求
通过独立YAML文件为eu-de_eos和eu-de_ora两组主机配置各自的堡垒机连接参数,并通过--extra-vars加载执行Playbook。
可行解决方案
方案一:单YAML文件+Playbook动态映射参数
适合统一管理多组参数,无需维护多个文件。
- 编写包含所有组SSH配置的YAML文件(group_ssh_vars.yaml):
group_ssh_configs: eu-de_ora: ansible_port: 22 ansible_user: linux ansible_ssh_private_key_file: ~/.ssh/ora.pem ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o ProxyCommand=\"ssh -q ansible@10.20.30.40 -o Port=65222 -W %h:%p\"" eu-de_eos: ansible_port: 22 ansible_user: linux ansible_ssh_private_key_file: ~/.ssh/eos.pem ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o ProxyCommand=\"ssh -q ansible@30.40.50.60 -o Port=65222 -W %h:%p\""
- 修改Playbook,添加预任务动态提取对应组的参数:
- name: 查看/etc/hosts内容 hosts: "{{ variable_host | default('all') }}" remote_user: "{{ variable_user | default('ansible') }}" vars: # 提取当前主机所属第一个组的配置(适用于单组主机) current_group_config: "{{ group_ssh_configs[group_names[0]] }}" pre_tasks: - name: 为当前主机组设置SSH连接参数 set_fact: ansible_port: "{{ current_group_config.ansible_port }}" ansible_user: "{{ current_group_config.ansible_user }}" ansible_ssh_private_key_file: "{{ current_group_config.ansible_ssh_private_key_file }}" ansible_ssh_common_args: "{{ current_group_config.ansible_ssh_common_args }}" roles: - cat-hosts
- 执行命令:
- 针对单组执行:
# 执行eu-de_ora组 ansible-playbook -i inventory/inventory-otc-50160 manage_users.yml --extra-vars "@inventory/group_ssh_vars.yaml" --extra-vars "variable_host=eu-de_ora" # 执行eu-de_eos组 ansible-playbook -i inventory/inventory-otc-50160 manage_users.yml --extra-vars "@inventory/group_ssh_vars.yaml" --extra-vars "variable_host=eu-de_eos"
- 执行所有组(自动匹配对应配置):
ansible-playbook -i inventory/inventory-otc-50160 manage_users.yml --extra-vars "@inventory/group_ssh_vars.yaml"
方案二:多YAML文件+按组加载
逻辑简单,适合组配置差异较大的场景。
为每个组单独创建参数文件:
oravars.yaml(同单组配置文件)eosvars.yaml:ansible_port: 22 ansible_user: linux ansible_ssh_private_key_file: ~/.ssh/eos.pem ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o ProxyCommand=\"ssh -q ansible@30.40.50.60 -o Port=65222 -W %h:%p\""
执行时选择对应组的参数文件:
# 执行eu-de_eos组 ansible-playbook -i inventory/inventory-otc-50160 manage_users.yml --extra-vars "@inventory/eosvars.yaml" --extra-vars "variable_host=eu-de_eos" # 执行eu-de_ora组 ansible-playbook -i inventory/inventory-otc-50160 manage_users.yml --extra-vars "@inventory/oravars.yaml" --extra-vars "variable_host=eu-de_ora"
如果需要批量执行所有组,可以编写简单的Shell脚本循环处理。
为什么原多组配置无效?
Ansible通过--extra-vars传入的顶层变量是全局生效的,直接将组名作为顶层键时,Ansible不会自动将这些参数绑定到对应的主机组,必须通过Playbook内的逻辑手动映射或赋值才能生效。
内容的提问来源于stack exchange,提问作者Marian Nișcov
相关产品推荐
相关产品推荐

