Ansible 2.9.8无法传递变量至ansible.cfg问题求助
解决Ansible 2.9.8中extra-vars无法在ansible.cfg的ssh_args中生效的问题
这个问题我之前也碰到过,Ansible 2.9.8确实对配置文件的变量解析逻辑做了调整,导致你原来通过extra-vars传递的env变量无法在ansible.cfg的ssh_args中生效。核心原因是ansible.cfg的解析时机早于extra-vars的加载——当Ansible读取配置文件时,extra-vars里的变量还没被注入,所以各种引号写法都没用。下面给你几个可行的解决思路:
方案一:用环境变量替代extra-vars传递env
环境变量是在Ansible进程启动时就存在的,能被ansible.cfg正常解析。具体操作如下:
- 修改
ansible.cfg中的ssh_args配置,把模板变量换成环境变量语法:[ssh_connection] pipelining = True ssh_args = -o ControlMaster=auto -o ControlPersist=30m -F ./ssh-${env}.cfg control_path = /tmp/ansible-%%r@%%h:%%p - 执行playbook时,通过环境变量传递
env值:- 临时设置环境变量再执行:
export env=apac ansible-playbook -b -u test-user -e 'ansible_ssh_pass=****' -i inventory.yml provisioning/packages-playbook.yml - 或者一次性在命令行中指定:
env=apac ansible-playbook -b -u test-user -e 'ansible_ssh_pass=****' -i inventory.yml provisioning/packages-playbook.yml
- 临时设置环境变量再执行:
方案二:为不同环境准备独立的ansible配置文件
这种方法更清晰,完全避免变量解析问题,适合多环境场景:
- 为每个环境创建独立的配置文件,比如
ansible-apac.cfg、ansible-emea.cfg,每个文件里的ssh_args直接写死对应环境的ssh配置:# ansible-apac.cfg [defaults] host_key_checking = no record_host_keys = no timeout = 10 remote_tmp = /tmp/.ansible-${USER}/tmp local_tmp = /tmp/.ansible-${USER}/tmp [ssh_connection] pipelining = True ssh_args = -o ControlMaster=auto -o ControlPersist=30m -F ./ssh-apac.cfg control_path = /tmp/ansible-%%r@%%h:%%p - 执行playbook时,通过
ANSIBLE_CONFIG环境变量指定对应配置文件:ANSIBLE_CONFIG=ansible-apac.cfg ansible-playbook -b -u test-user -e 'ansible_ssh_pass=****' -i inventory.yml provisioning/packages-playbook.yml
方案三:在playbook中动态设置ssh连接参数
把ssh配置的逻辑移到playbook层面,利用playbook的变量解析能力:
- 先修改
ansible.cfg,去掉ssh_args中的-F配置,避免冲突:[ssh_connection] pipelining = True ssh_args = -o ControlMaster=auto -o ControlPersist=30m control_path = /tmp/ansible-%%r@%%h:%%p - 在playbook中动态设置
ansible_ssh_common_args变量:- hosts: all vars: ansible_ssh_common_args: "-F ./ssh-{{ env }}.cfg" tasks: # 你的任务内容 - name: 示例任务 debug: msg: "当前环境: {{ env }}" - 执行playbook时依然通过extra-vars传递
env:ansible-playbook -b -u test-user -e 'ansible_ssh_pass=****' -e 'env=apac' -i inventory.yml provisioning/packages-playbook.yml
验证建议
可以先执行简单的debug命令验证变量是否正确传递:
ansible all -i inventory.yml -m debug -a "msg='当前环境: {{ env }}'" -e 'env=apac'
确认变量生效后,再测试ssh连接是否正常加载对应的ssh-apac.cfg配置。
内容的提问来源于stack exchange,提问作者Gowthamakanthan Gopal
相关产品推荐
相关产品推荐

