介绍
本教程将指导你设置 Ansible Python 解释器,以实现最佳配置。Ansible 使用 Python 在目标系统上执行其自动化任务,正确配置 Python 解释器对于顺利运行至关重要。通过本教程,你将了解如何正确设置和配置 Ansible Python 解释器,这将帮助你避免常见问题,并确保你的 Ansible playbook 高效运行。
安装 Ansible 并检查 Python 解释器
在第一步中,我们将安装 Ansible 并检查它使用的默认 Python 解释器。这将帮助我们了解基本配置,然后再进行任何更改。
安装 Ansible
让我们从在系统上安装 Ansible 开始:
sudo apt update
sudo apt install -y ansible
这会安装 Ubuntu 存储库中可用的最新版本的 Ansible。安装完成后,我们可以通过检查其版本来验证 Ansible 是否已正确安装:
ansible --version
你应该看到类似这样的输出:
ansible [core 2.12.0]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.10.x (default, Ubuntu 22.04) [GCC 11.2.0]
jinja version = 3.0.3
libyaml = True
请注意,输出包括正在使用的 Python 版本。这是一个重要信息,因为它告诉我们 Ansible 当前配置为使用哪个 Python 解释器。
创建一个简单的清单文件
为了使 Ansible 正常工作,我们需要一个清单文件,其中列出了我们要管理的宿主机。让我们创建一个简单的清单文件:
- 在 WebIDE 中,通过单击 Explorer 面板中的“New File”图标创建一个新文件
- 将文件命名为
inventory.ini - 将以下内容添加到文件中:
[local]
localhost ansible_connection=local
此清单文件定义了一个名为 local 的组,其中只有一个宿主机 - localhost - 并指定我们希望直接连接到它,而不是通过 SSH。
检查目标上的 Python 解释器
现在,让我们检查 Ansible 将在我们的目标宿主机上使用哪个 Python 解释器:
ansible -i inventory.ini local -m setup -a "filter=ansible_python*"
此命令运行 Ansible setup 模块,该模块收集有关宿主机的事实,并过滤与 Python 相关的信息。你应该看到包含有关正在使用的 Python 解释器的详细信息的输出:
localhost | SUCCESS => {
"ansible_facts": {
"ansible_python": {
"executable": "/usr/bin/python3",
"has_sslcontext": true,
"type": "cpython",
"version": {
"major": 3,
"micro": 10,
"minor": 10,
"releaselevel": "final",
"serial": 0
},
"version_info": [
3,
10,
10,
"final",
0
]
},
"ansible_python_version": "3.10.10"
},
"changed": false
}
这确认 Ansible 正在目标宿主机上使用 Python 3。默认情况下,Ansible 尝试使用目标系统上可用的最佳 Python 解释器。
创建一个简单的 Ansible Playbook 并配置 Python 解释器
现在我们了解了如何检查 Python 解释器,让我们创建一个简单的 playbook,并学习如何显式配置 Python 解释器。
创建一个基本的 Playbook
让我们创建一个简单的 Ansible playbook,我们将使用它来测试不同的 Python 解释器配置:
- 在 WebIDE 中,创建一个名为
test_playbook.yml的新文件 - 将以下内容添加到文件中:
---
- name: Test Python Interpreter
hosts: local
gather_facts: yes
tasks:
- name: Display Python version
debug:
msg: "Python interpreter is {{ ansible_python_interpreter | default('/usr/bin/python3') }} with version {{ ansible_python_version }}"
- name: Create a test file
file:
path: "~/python_info.txt"
state: touch
- name: Write Python info to file
lineinfile:
path: "~/python_info.txt"
line: "Ansible used Python interpreter: {{ ansible_python_interpreter | default('/usr/bin/python3') }} with version {{ ansible_python_version }}"
此 playbook 将:
- 显示正在使用的 Python 解释器路径和版本
- 在主目录中创建一个文本文件
- 将 Python 解释器信息写入该文件
使用默认设置运行 Playbook
让我们使用默认设置运行此 playbook:
ansible-playbook -i inventory.ini test_playbook.yml
你应该看到类似这样的输出:
PLAY [Test Python Interpreter] *****************************
TASK [Gathering Facts] *************************************
ok: [localhost]
TASK [Display Python version] ******************************
ok: [localhost] => {
"msg": "Python interpreter is /usr/bin/python3 with version 3.10.10"
}
TASK [Create a test file] **********************************
changed: [localhost]
TASK [Write Python info to file] ***************************
changed: [localhost]
PLAY RECAP ************************************************
localhost : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
这确认 Ansible 正在使用系统 Python 解释器,这通常对于本地操作来说是可以的。
显式设置 Python 解释器
现在让我们学习如何以不同的方式显式设置 Python 解释器。
方法 1:在清单文件中设置
- 通过添加 Python 解释器变量来更新你的
inventory.ini文件:
[local]
localhost ansible_connection=local ansible_python_interpreter=/usr/bin/python3
- 再次运行 playbook:
ansible-playbook -i inventory.ini test_playbook.yml
输出应该与之前类似,确认正在使用指定的 Python 解释器。
方法 2:在 Playbook 中设置
- 更新你的
test_playbook.yml以在 play 级别包含 Python 解释器变量:
---
- name: Test Python Interpreter
hosts: local
gather_facts: yes
vars:
ansible_python_interpreter: /usr/bin/python3
tasks:
- name: Display Python version
debug:
msg: "Python interpreter is {{ ansible_python_interpreter }} with version {{ ansible_python_version }}"
- name: Create a test file
file:
path: "~/python_info_2.txt"
state: touch
- name: Write Python info to file
lineinfile:
path: "~/python_info_2.txt"
line: "Ansible used Python interpreter: {{ ansible_python_interpreter }} with version {{ ansible_python_version }}"
- 运行更新后的 playbook:
ansible-playbook -i inventory.ini test_playbook.yml
检查输出,确认 Python 解释器已正确设置。
方法 3:通过命令行设置
你还可以在运行 playbook 时设置 Python 解释器:
ansible-playbook -i inventory.ini test_playbook.yml -e "ansible_python_interpreter=/usr/bin/python3"
这种方法对于临时覆盖单个运行的设置很有用。
验证结果
让我们检查我们创建的文件的内容,以确认使用了哪个 Python 解释器:
cat ~/python_info.txt
cat ~/python_info_2.txt
这两个文件都应该显示我们正在使用 Python 3 解释器。
创建全局 Ansible 配置
在这一步中,我们将创建一个全局 Ansible 配置文件,为所有 playbooks 设置 Python 解释器。当你需要在你的 Ansible 环境中保持一致的解释器设置时,这种方法非常有用。
了解 ansible.cfg 文件
Ansible 在几个位置查找配置,顺序如下:
- 环境变量
ANSIBLE_CONFIG - 当前目录中的
ansible.cfg ~/.ansible.cfg(用户的 home 目录)/etc/ansible/ansible.cfg(系统范围)
让我们在当前目录中创建一个配置文件,它将优先于系统范围的设置。
创建 ansible.cfg 文件
- 在 WebIDE 中,在项目目录中创建一个名为
ansible.cfg的新文件 - 将以下内容添加到文件中:
[defaults]
inventory = ./inventory.ini
ansible_python_interpreter = /usr/bin/python3
forks = 5
host_key_checking = False
[privilege_escalation]
become = False
此配置执行以下几项操作:
- 设置默认的清单文件位置
- 指定要使用的 Python 解释器
- 将并行进程(forks)的数量设置为 5
- 禁用 SSH 宿主机密钥检查
- 配置权限提升设置
测试配置
让我们验证我们的配置文件是否正在被使用:
ansible --version
输出现在应该显示你的新配置文件位置:
ansible [core 2.12.0]
config file = /home/labex/project/ansible.cfg
...
创建一个新的 Playbook 来测试配置
让我们创建一个新的 playbook 来测试我们的全局配置:
- 创建一个名为
config_test.yml的新文件 - 添加以下内容:
---
- name: Test Global Configuration
hosts: local
gather_facts: yes
tasks:
- name: Get Ansible configuration
command: ansible-config dump
register: config_output
- name: Display Python interpreter from config
debug:
msg: "{{ config_output.stdout_lines | select('search', 'python_interpreter') | list }}"
- name: Create config info file
file:
path: "~/config_info.txt"
state: touch
- name: Write config info to file
copy:
content: "{{ config_output.stdout }}"
dest: "~/config_info.txt"
此 playbook:
- 运行
ansible-config dump以获取当前配置 - 过滤并显示 Python 解释器设置
- 创建一个包含完整配置信息的文件
运行新的 Playbook
运行 playbook 以查看配置的实际效果:
ansible-playbook config_test.yml
你应该看到输出,其中包括来自我们的 ansible.cfg 文件的 Python 解释器设置。
检查配置详细信息
让我们检查我们创建的配置文件:
cat ~/config_info.txt | grep python
你应该看到 Python 解释器是根据我们的 ansible.cfg 文件设置的。
比较不同的配置方法
让我们创建一个不同设置 Python 解释器方法的摘要:
- 创建一个名为
interpreter_summary.yml的新文件 - 添加以下内容:
---
- name: Summarize Python Interpreter Configuration
hosts: local
gather_facts: yes
tasks:
- name: Create summary file
file:
path: "~/interpreter_summary.txt"
state: touch
- name: Write summary information
blockinfile:
path: "~/interpreter_summary.txt"
block: |
Ansible Python Interpreter Configuration Methods:
1. Global ansible.cfg: {{ ansible_python_interpreter }}
2. Inventory file: Can be set with 'ansible_python_interpreter=/path/to/python'
3. Playbook variables: Can be set with 'vars: ansible_python_interpreter=/path/to/python'
4. Command line: Can be set with '-e ansible_python_interpreter=/path/to/python'
Current Python version: {{ ansible_python_version }}
Python path: {{ ansible_python.executable }}
运行此 playbook:
ansible-playbook interpreter_summary.yml
现在查看摘要文件:
cat ~/interpreter_summary.txt
此文件提供了在 Ansible 中配置 Python 解释器的不同方法的便捷参考。
使用 Python 解释器设置优化 Ansible 性能
在最后一步中,我们将探讨如何通过微调 Python 解释器设置和相关配置来优化 Ansible 性能。
了解 Ansible 性能因素
有几个因素会影响 Ansible 性能:
- Python 解释器选择
- 并行设置(forks)
- Fact 缓存
- 模块优化
让我们更新我们的配置以优化性能。
优化 ansible.cfg 以获得性能
- 使用与性能相关的设置更新
ansible.cfg文件:
[defaults]
inventory = ./inventory.ini
ansible_python_interpreter = /usr/bin/python3
forks = 10
host_key_checking = False
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_facts
fact_caching_timeout = 3600
[privilege_escalation]
become = False
关键的性能优化:
- 使用
forks = 10增加并行性 - 使用
gathering = smart进行智能 fact 收集 - 启用 fact 缓存以减少冗余的 fact 收集
创建性能测试 Playbook
让我们创建一个 playbook 来测试和演示性能优化:
- 创建一个名为
performance_test.yml的新文件 - 添加以下内容:
---
- name: Performance Testing
hosts: local
gather_facts: yes
tasks:
- name: Measure fact gathering time
debug:
msg: "Facts gathered in {{ ansible_date_time.epoch | float - ansible_date_time.start | float }} seconds"
- name: Get Python version details
command: "{{ ansible_python.executable }} --version"
register: python_version
- name: Display Python version
debug:
msg: "{{ python_version.stdout }}"
- name: Create performance report
file:
path: "~/performance_report.txt"
state: touch
- name: Write performance information
blockinfile:
path: "~/performance_report.txt"
block: |
Ansible Performance Configuration:
Python Interpreter: {{ ansible_python_interpreter }}
Python Version: {{ python_version.stdout }}
Configuration Settings:
- Forks: {{ lookup('ini', 'forks section=defaults file=ansible.cfg') | default('5') }}
- Fact Gathering: {{ lookup('ini', 'gathering section=defaults file=ansible.cfg') | default('implicit') }}
- Fact Caching: {{ lookup('ini', 'fact_caching section=defaults file=ansible.cfg') | default('disabled') }}
Performance Impact:
- Using Python 3 vs Python 2 can provide significant performance improvements
- Increased forks allows more parallel operations
- Smart fact gathering and caching reduce unnecessary operations
运行性能测试
运行性能测试 playbook:
ansible-playbook performance_test.yml
输出将显示有关 fact 收集时间和 Python 版本的详细信息。
第二次运行测试
再次运行性能测试,以查看 fact 缓存的影响:
ansible-playbook performance_test.yml
你应该注意到,第二次运行的 fact 收集速度更快,因为 fact 正在从缓存中检索。
检查性能报告
让我们检查性能报告:
cat ~/performance_report.txt
此报告总结了你的 Ansible 性能配置,并解释了每个设置如何影响性能。
创建最终摘要
让我们创建一个关于我们所学到的 Ansible Python 解释器和性能优化的全面摘要:
- 创建一个名为
final_summary.yml的新文件 - 添加以下内容:
---
- name: Final Summary
hosts: local
gather_facts: yes
tasks:
- name: Create final summary
copy:
dest: "~/ansible_interpreter_guide.txt"
content: |
## Ansible Python Interpreter Guide
### Current Configuration
- Python interpreter: {{ ansible_python_interpreter }}
- Python version: {{ ansible_python_version }}
- Ansible version: {{ ansible_version.full }}
### Configuration Methods
1. ansible.cfg (global): ansible_python_interpreter = /path/to/python
2. Inventory file: hostname ansible_python_interpreter=/path/to/python
3. Playbook variables: vars: ansible_python_interpreter: /path/to/python
4. Command line: -e ansible_python_interpreter=/path/to/python
### Performance Optimization
- Use Python 3.x for better performance
- Configure proper parallelism with 'forks'
- Enable fact caching for repeated playbook runs
- Use 'gather_facts: smart' to minimize fact gathering
### Best Practices
- Always specify the Python interpreter explicitly for production systems
- Use the most recent stable Python version available on your system
- Test playbooks with the same Python version that will be used in production
- Document Python interpreter requirements for your playbooks
运行此 playbook:
ansible-playbook final_summary.yml
检查最终摘要:
cat ~/ansible_interpreter_guide.txt
本指南总结了你所学到的关于配置和优化 Ansible Python 解释器的所有内容。
总结
在本教程中,你已经学习了如何配置和优化 Ansible Python 解释器。你现在了解:
- 如何检查 Ansible 正在使用哪个 Python 解释器
- 在 Ansible 中指定 Python 解释器的不同方法:
- 在全局
ansible.cfg文件中 - 在清单文件中
- 在使用变量的 playbooks 中
- 通过命令行参数
- 在全局
- 如何创建适当的配置文件以获得最佳性能
- 通过 Python 解释器选择和相关设置进行性能优化技术
这些技能将帮助你确保你的 Ansible playbooks 在不同的环境中高效且有效地运行,从而防止与 Python 解释器不匹配相关的常见问题。你现在可以自信地在你的基础设施自动化项目中管理 Ansible Python 解释器设置。


