Ansible中nsupdate模块执行报错问题求助
问题场景
你在CentOS7系统上运行Bind服务时遇到了棘手的问题:手动执行nsupdate命令或者通过Ansible主控端执行都能正常更新DNS记录,但使用Ansible的community.general.nsupdate模块时却直接报错。
你的任务代码(tasks/main.yml)如下:
- name: Add or modify ansible.example.org A to 192.168.1.1 community.general.nsupdate: server: "10.0.0.40" zone: "ben.com." record: "ansible" value: "192.168.1.1" when: ansible_eth1.ipv4.address == '10.0.0.40'
报错信息里的关键回溯内容:
File "build/bdist.linux-x86_64/egg/dns/update.py", line 21, in
File "/usr/lib/python2.7/site-packages/dnspython-2.1.1.dev77+gf61a939-py2.7.egg/dns/message.py", line 201
s.write(f';{name}\n')
^
SyntaxError: invalid syntax
问题根源
这个错误其实很好定位:你目标节点上安装的dnspython版本和CentOS7默认的Python2.7不兼容。
CentOS7自带的是Python2.7,而代码里的f-string(就是f';{name}\n'这种写法)是Python3.6及以上版本才支持的语法。你现在装的dnspython 2.x系列已经彻底放弃了对Python2.7的支持,所以运行时直接抛出了语法错误。
至于手动执行nsupdate命令没问题,是因为系统自带的nsupdate工具和这个Python库完全独立,二者没有依赖关系。
解决方案
这里有两个靠谱的解决办法,你可以根据自己的环境选:
方法1:降级dnspython到支持Python2.7的版本
dnspython 1.x系列是完全支持Python2.7的,你可以在目标节点(10.0.0.40)上执行以下命令安装兼容版本:
# 如果没有pip先安装 yum install python-pip -y # 安装兼容的dnspython版本 pip install dnspython==1.16.0
安装完成后重新运行Ansible任务,应该就能正常执行了。
方法2:让Ansible使用Python3执行该任务
如果你的目标节点已经安装了Python3(可以用yum install python3 -y快速安装),可以直接让Ansible切换到Python3解释器,这样就能兼容dnspython 2.x版本:
修改你的任务代码,添加Python3解释器变量:
- name: Add or modify ansible.example.org A to 192.168.1.1 community.general.nsupdate: server: "10.0.0.40" zone: "ben.com." record: "ansible" value: "192.168.1.1" when: ansible_eth1.ipv4.address == '10.0.0.40' vars: ansible_python_interpreter: /usr/bin/python3
或者你也可以在inventory文件中直接给该主机指定Python3解释器:
[dns_servers] 10.0.0.40 ansible_python_interpreter=/usr/bin/python3
内容的提问来源于stack exchange,提问作者ben shalev

