如何让Ansible将变量传入包含input函数的Python脚本?
解决Ansible运行带
input()的Python脚本时的EOFError及传参问题 问题原因
用Ansible script模块运行Python脚本时,脚本处于无交互式输入的环境,标准输入(stdin)被关闭,导致脚本里的input()函数无法读取内容,触发EOFError: EOF when reading a line。
解决方案
方案1:修改Python脚本,通过命令行参数接收变量(推荐)
这种方式更适配自动化场景,彻底避免交互式依赖:
- 修改Python脚本,替换
input()为读取命令行参数:
from netmiko import ConnectHandler import sys # 校验参数是否存在 if len(sys.argv) < 2: print("错误:请传入revisionamount参数") sys.exit(1) # 从命令行获取参数并转换为整数 revisionamount = int(sys.argv[1]) DR_01 = { 'device_type': 'cisco_ios', 'ip': '192.168.1.200', 'username': 'cisco', 'password': 'cisco123' } all_devices = [DR_01] n = 999 for devices in all_devices: net_connect = ConnectHandler(**devices) for count in range(revisionamount): print("Creating VLAN 999") config_commands = [f'vlan {n}', f'name Ansible_{n}'] output = net_connect.send_config_set(config_commands) print(output) print("Deleting VLAN 999") config_commands = [f'no vlan {n}'] output = net_connect.send_config_set(config_commands) print(output)
- 修改Ansible Playbook,传递参数给脚本:
--- - hosts: CML_DR_01 gather_facts: no connection: network_cli tasks: - name: Run Python Script to Increase Revision Number script: ./Scripts/DR_VTP_Revision_Ver_2.py {{ revision_amount }} args: executable: python3 vars: revision_amount: 2 # 可直接指定,或通过命令行传入:ansible-playbook xxx.yml --extra-vars "revision_amount=3"
方案2:通过Ansible的stdin传递输入(无需修改脚本)
如果不想改动脚本,可利用Ansible的stdin参数,将需要输入的内容直接传给脚本的标准输入:
--- - hosts: CML_DR_01 gather_facts: no connection: network_cli tasks: - name: Run Python Script to Increase Revision Number script: ./Scripts/DR_VTP_Revision_Ver_2.py args: executable: python3 stdin: "{{ revision_amount }}" vars: revision_amount: 2
注意:如果脚本有多个input(),需要将输入内容按顺序用换行符拼接后传入stdin,比如stdin: "2\nabc\n"。
注意事项
- 自动化场景下优先选择方案1,因为命令行参数的方式更清晰、更易维护,也符合Ansible的自动化设计理念。
- 避免在自动化脚本中使用交互式输入,这会破坏自动化流程的连续性。
内容的提问来源于stack exchange,提问作者Dakenrick
相关产品推荐
相关产品推荐

