Ansible预任务校验Python版本异常:为何先识别2.7后识别3.6?
问题分析与解决
咱们先把事儿掰扯清楚——这根本不是Ansible的Bug,是你对它的两个核心逻辑理解有点偏差:setup模块的facts来源,以及delegate_to参数的作用。
为什么加不加delegate_to: localhost会拿到不同的Python版本?
Ansible的setup模块是用来获取目标主机的系统信息(facts)的,其中ansible_python_version指的是Ansible在该主机上执行模块时使用的Python解释器版本。
- 当你不加
delegate_to: localhost时,setup模块会在你Playbook指定的目标主机上运行(如果没指定hosts,默认是inventory里的所有主机)。你看到的2.7.5,就是这个目标主机上Ansible默认调用的Python版本。 - 当你加上
delegate_to: localhost,模块会切换到**你的控制节点(运行Ansible的机器)**上执行,而你的Ansible本身就是基于Python3.6.8运行的,所以自然拿到的是这个版本。
这完全是Ansible的正常预期行为,一点问题都没有。
为什么版本校验的结果会不一样?
这和上面的原因直接相关:
- 当你没加
delegate_to时,校验的是目标主机的Python版本(2.7.5),所以>=3.6.0的条件不满足,任务失败;改成>=2.7.5就符合,自然成功。 - 当你加上
delegate_to: localhost,校验的是控制节点的Python版本(3.6.8),这时候>=3.6.0的条件就满足了。
怎么正确配置版本校验?
你得先明确自己的校验目标:是要确保控制节点的Python版本满足Ansible运行要求,还是目标主机的Python版本满足模块执行要求?
情况1:校验控制节点的版本(确保Ansible运行在符合要求的Python环境)
保留delegate_to: localhost,这样就能正确获取控制节点的版本信息,示例代码如下:
pre_tasks: - name: Validate controller's Ansible and Python versions register: version_check assert: that: - ansible_version is defined - ansible_version.full is version('2.8.0.0', '>=') - ansible_python_version is defined - ansible_python_version is version('3.6.0', '>=') fail_msg: "Minimal required versions: Ansible 2.8.0.0+, Python 3.6.0+ (on controller)" delegate_to: localhost run_once: true
情况2:校验目标主机的版本(确保模块能在目标主机正常运行)
去掉delegate_to: localhost,直接校验目标主机的Python版本:
pre_tasks: - name: Validate target hosts' Python version assert: that: - ansible_python_version is defined - ansible_python_version is version('2.7.5', '>=') fail_msg: "Minimal required Python version on target hosts: 2.7.5+"
内容的提问来源于stack exchange,提问作者Thanos
相关产品推荐
相关产品推荐

