如何通过Ansible实现经远程服务器二次SSH到VNF实例执行Linux命令?
解决Ansible通过跳板机二次SSH访问VNF实例的问题
1. 利用Ansible原生跳板机参数实现自动化(推荐)
Ansible支持直接配置跳板机参数,无需手动在跳板机执行二次SSH命令,既符合自动化逻辑,也能避免手动SSH导致的无交互卡住问题。
方式一:使用ProxyJump(OpenSSH 7.4+版本适用)
在inventory文件中直接定义VNF实例的跳板机信息,让Ansible自动完成两次SSH跳转:
示例hosts.ini配置:
[remote_server1] server1 ansible_host=跳板机公网IP ansible_user=跳板机用户名 ansible_ssh_private_key_file=/本地路径/跳板机私钥 [vnf_instances] vnf1 ansible_host=VNF内部IP1 ansible_user=VNF用户名 ansible_ssh_private_key_file=/本地路径/VNF私钥 vnf2 ansible_host=VNF内部IP2 ansible_user=VNF用户名 ansible_ssh_private_key_file=/本地路径/VNF私钥 [vnf_instances:vars] # 指定通过跳板机跳转 ansible_ssh_common_args='-o ProxyJump=跳板机用户名@跳板机公网IP -i /本地路径/跳板机私钥'
对应的Playbook示例:
- name: 在VNF实例执行指定命令 hosts: vnf_instances gather_facts: false tasks: - name: 运行目标Linux命令 ansible.builtin.command: 你的目标命令 register: cmd_result - name: 输出命令执行结果 ansible.builtin.debug: var: cmd_result.stdout_lines
方式二:使用ProxyCommand(兼容低版本OpenSSH)
若跳板机OpenSSH版本低于7.4,不支持ProxyJump,可改用ProxyCommand:
将vnf_instances:vars部分替换为:
ansible_ssh_proxy_command='ssh -W %h:%p 跳板机用户名@跳板机公网IP -i /本地路径/跳板机私钥'
2. 排查"卡住无日志"问题的方法
- 开启详细日志:运行Playbook时添加
-vvvv参数,例如ansible-playbook -i hosts.yml playbook.yml -vvvv,可查看SSH连接全流程细节,定位是跳板机连接失败还是VNF实例验证问题。 - 手动验证跳转链路:先登录跳板机,手动执行
ssh VNF用户名@VNF内部IP,确认:- 是否需要输入密码(若用密码登录,需在inventory中添加
ansible_password=VNF密码,推荐优先用密钥登录) - 是否存在主机密钥验证弹窗(首次连接需手动接受,或在跳板机
~/.ssh/known_hosts中提前添加VNF的主机密钥,生产环境不建议用StrictHostKeyChecking=no跳过验证)
- 是否需要输入密码(若用密码登录,需在inventory中添加
3. 特殊场景替代方案:在跳板机执行二次SSH命令
若因VNF IP需动态获取等特殊原因无法使用原生跳板参数,可在跳板机上直接执行SSH命令:
Playbook示例:
- name: 通过跳板机间接执行VNF命令 hosts: remote_server1 gather_facts: false tasks: - name: 远程执行VNF命令 ansible.builtin.shell: | ssh -i /跳板机路径/VNF私钥 VNF用户名@VNF内部IP "你的目标命令" register: vnf_cmd_result - name: 输出VNF命令结果 ansible.builtin.debug: var: vnf_cmd_result.stdout_lines
注:此方式需确保跳板机到VNF的SSH能无交互完成登录(密钥配置、主机密钥信任已完成),否则会因等待输入而卡住。
内容的提问来源于stack exchange,提问作者amitk
相关产品推荐
相关产品推荐

