You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过独立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动态映射参数

适合统一管理多组参数,无需维护多个文件。

  1. 编写包含所有组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\""
  1. 修改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
  1. 执行命令:
  • 针对单组执行:
# 执行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文件+按组加载

逻辑简单,适合组配置差异较大的场景。

  1. 为每个组单独创建参数文件:

    • 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\""
      
  2. 执行时选择对应组的参数文件:

# 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:05:00