用pip3 安装ansible
查询使用 pip
工具可以安装的 Python 包:
1. PyPI 官方网站
- 网址: https://pypi.org/
- 使用方法: 你可以在 PyPI 官网直接搜索任何 Python 包的名称。每个包的页面通常会列出详细的信息,包括最新版本、历史版本、文档、安装说明以及依赖关系等。
2. pip
工具的 install
命令
- 命令:
pip install package-name
- 使用方法: 如果你知道包的确切名称,可以直接尝试安装它。如果包存在且版本匹配,它将被安装。如果你不确定包名,可以先在 PyPI 网站上确认
4. Python 包文档或项目主页
-
网址: 许多开源项目都有自己的官方网站或 GitHub 仓库,这些网站通常会提供详细的文档和安装指南。例如,Ansible 的文档可以在 Ansible 的官方网站 或 GitHub 仓库 上找到。
-
以ansible官方网站为例,进入参考_附录/发布_和_维护页面,找到社区变更日志
-
发现下图中,示例2.17版本的ansible-core对应10.x版本的ansible社区版本,也可以点击图表中链接查看github中的示例文件
-
Ansible Community Package Release Status Core version dependency 11.0.0 In development (unreleased) 2.18 10.x Changelogs Current 2.17 9.x Changelogs Minor/patch releases (EOL Nov 2024) 2.16 8.x Changelogs Unmaintained (end of life) 2.15 7.x Changelogs Unmaintained (end of life) 2.14 6.x Changelogs Unmaintained (end of life) 2.13 5.x Changelogs Unmaintained (end of life) 2.12 4.x Changelogs Unmaintained (end of life) 2.11 3.x Changelogs Unmaintained (end of life) 2.10 2.10 Changelogs Unmaintained (end of life) 2.10 -
在参考_附录/发布_和_维护页面查找文字链接Ansible Roadmap,此页面包含ansible社区版本的路线图,进入Ansible 项目 10.0,可以查看到从ansible-core2.17.x一点点推进到ansible10.x的过程
-
在参考_附录/发布_和_维护页面查找文字链接ansible-core Roadmaps,此页面包含ansible-core版本的路线图,进入Ansible-core 2.17,可以查看到ansible-core2.17发部过程
-
以github页面为例,进入ansible页面,进入release页面,点击full changelog的链接,在页面中有文件setup.py,setup.cfg,pyproject.toml,requirements.txt这里包含了ansible对于python版本,pip包的依赖信息
# Note: this requirements.txt file is used to specify what dependencies are
# needed to make the package run rather than for deployment of a tested set of
# packages. Thus, this should be the loosest set possible (only required
# packages, not optional ones, and with the widest range of versions that could
# be suitable)
jinja2 >= 3.0.0
PyYAML >= 5.1 # PyYAML 5.1 is required for Python 3.8+ support
cryptography
packaging
# NOTE: resolvelib 0.x version bumps should be considered major/breaking
# NOTE: and we should update the upper cap with care, at least until 1.0
# NOTE: Ref: https://github.com/sarugaku/resolvelib/issues/69
# NOTE: When updating the upper bound, also update the latest version used
# NOTE: in the ansible-galaxy-collection test suite.
resolvelib >= 0.5.3, < 1.1.0 # dependency resolver used by ansible-galaxy
5. pip install
命令
- 命令:
pip install package-name==x.x.x
- 使用方法: 这个命令可以安装指定版本的pypi包。
通过前4步的操作,可以明确,想要安装ansible下2.17版本的ansible-core,通过pypi要安装ansible的具体版本,又通过pypi官网,可以查询到ansible的版本号,那么可以直接安装了,如果想要历史版本,可以直接查看release的信息
pip3 install ansible==10.3.0
6. pip show
命令
- 命令:
pip show package-name
- 使用方法: 这个命令提供了关于已安装包的详细信息,包括版本号、安装位置、依赖关系等。
pip show ansible
Name: ansible
Version: 10.3.0
Summary: Radically simple IT automation
Home-page: https://ansible.com/
Author: Ansible, Inc.
Author-email: info@ansible.com
License: GPL-3.0-or-later
Location: /usr/local/lib/python3.10/dist-packages
Requires: ansible-core
Required-by:
#查看ansible版本信息
ansible --version
ansible [core 2.17.3]
config file = None
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.10/dist-packages/ansible
ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/local/bin/ansible
python version = 3.10.14 (main, Apr 6 2024, 18:45:05) [GCC 9.4.0] (/usr/bin/python3.10)
jinja version = 3.1.4
libyaml = False
到这里ansible部署完成了.
但是ansible配置使用的libyaml是Flase,这表示ansible解析yaml文件时,未使用些模块,而是用python自有的yaml解析器,效率低于C语言编写的libyaml模块
解决libyaml未开启问题
libyaml
是一个用 C 语言编写的 YAML 解析器,它比纯 Python 的 YAML 解析器 (PyYAML
) 更快。
从系统安全和稳定性的角度来说,通常建议先尝试使用 pip
来卸载或升级 Python 包,如果遇到问题再考虑使用 apt
或其他系统包管理器。这种做法有以下几个原因:
1. 包的来源
-
pip
安装的包: 如果包是通过pip
安装的,它的管理和依赖信息都由pip
处理 -
apt
安装的包:apt
安装的包可能与系统的其他软件有依赖关系。
2. 避免依赖冲突
-
首先使用
pip
: 如果你通过pip
安装了某个包,并希望升级或卸载,首先使用pip
可以避免系统与 Python 环境之间的依赖冲突。pip
能准确处理 Python 包的依赖关系,防止残留文件或不完整的卸载。 -
再使用
apt
: 如果pip
处理失败或遇到与系统包的冲突,可以再考虑使用apt
。这是因为apt
可以更加全面地处理系统级别的依赖关系,确保系统的稳定性。
在安装升级时,遇到错误如下
pip install pyyaml==6.0.2
Collecting pyyaml==6.0.2
Downloading PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.1 kB)
Downloading PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (751 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 751.2/751.2 kB 20.0 MB/s eta 0:00:00
WARNING: Error parsing dependencies of distro-info: Invalid version: '0.23ubuntu1'
WARNING: Error parsing dependencies of python-debian: Invalid version: '0.1.36ubuntu1'
Installing collected packages: pyyaml
Attempting uninstall: pyyaml
Found existing installation: PyYAML 5.3.1
error: uninstall-distutils-installed-package
× Cannot uninstall PyYAML 5.3.1
╰─> It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
error: uninstall-distutils-installed-package
错误分析:
-
distutils:
distutils
是 Python 的标准打包工具,用于安装 Python 包。由于它是直接写入到系统的,而不像pip
那样管理包的元数据,pip
无法准确识别通过distutils
安装的包的文件位置。 -
Partial Uninstall:
pip
试图卸载旧版本的PyYAML
,但由于它是通过distutils
安装的,pip
不知道哪些文件属于旧版本,因此无法安全地卸载它。这会导致潜在的“部分卸载”,即某些文件可能会保留在系统中,这会影响新版本的安装和运行。 -
也就是说,这个pyyaml包不是pip安装的,想卸载时,牵扯到了
distutils
,此时需要使用apt来解决,将老版本的pyyaml删除
解决方案:
apt 卸载 pyyaml,pyyaml是对应的pip的包名称,对应的apt的包名称是python3-yaml
这个pip包与apt包如何找到对应关系呢
搜索引擎,官方文档,这种关联关系很模糊,不好友
apt remove -y python3-yaml
手动安装pyyaml
pip3 install pyyaml
检查pyyaml部署位置,是否启动libyaml
python3 -c "import yaml; print(yaml.__file__)"
#检查是否启用libyaml
python3 -c "import yaml; print(yaml.__with_libyaml__)"
检查ansible是否启动libyaml解析器
ansible --version
ansible [core 2.17.3]
config file = None
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.10/dist-packages/ansible
ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/local/bin/ansible
python version = 3.10.14 (main, Apr 6 2024, 18:45:05) [GCC 9.4.0] (/usr/bin/python3.10)
jinja version = 3.1.4
libyaml = True
python,Pyyaml,libyaml三者关系
PyYAML 是 Python 中最常用的 YAML 解析库,它是用纯 Python 编写的,并可以选择性地使用 libyaml 作为底层加速器
libyaml是由C编写的,部署时通过apt或源码安装,这就要求必须有libyaml和libyaml-dev包
apt list --installed | grep yaml
libyaml-0-2/focal,now 0.2.2-1 amd64 [installed,automatic]
libyaml-dev/focal,now 0.2.2-1 amd64 [installed]
#查看libyaml-0-2信息
apt show libyaml-0-2
Package: libyaml-0-2
Version: 0.2.2-1
Priority: important
Section: libs
Source: libyaml
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Anders Kaseorg <andersk@mit.edu>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 152 kB
Depends: libc6 (>= 2.14)
Homepage: https://github.com/yaml/libyaml
Task: minimal, ubuntu-core
Download-Size: 48.9 kB
APT-Manual-Installed: no
APT-Sources: http://mirrors.aliyun.com/ubuntu focal/main amd64 Packages
Description: Fast YAML 1.1 parser and emitter library
LibYAML is a C library for parsing and emitting data in YAML 1.1, a
human-readable data serialization format.
#查看libyaml-dev信息
apt show libyaml-dev
Package: libyaml-dev
Version: 0.2.2-1
Priority: extra
Section: libdevel
Source: libyaml
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Anders Kaseorg <andersk@mit.edu>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 257 kB
Depends: libyaml-0-2 (= 0.2.2-1)
Suggests: libyaml-doc
Homepage: https://github.com/yaml/libyaml
Download-Size: 58.2 kB
APT-Manual-Installed: yes
APT-Sources: http://mirrors.aliyun.com/ubuntu focal/main amd64 Packages
Description: Fast YAML 1.1 parser and emitter library (development)
LibYAML is a C library for parsing and emitting data in YAML 1.1, a
human-readable data serialization format.
.
This package contains development headers and static libraries.
This package contains development headers and static libraries.
这里是说dev包将头文件静态库包含在内了,也是PyYAML安装时,会自动启用libyaml,否则无法启用这个libyaml
即按libyaml,PyYAML的顺序部署,libyaml是系统级别的组件
pyyaml代码示例
CLoader和CDumper是C语言实现的加载器和转储器,它们通过与LibYAML的集成,提供了更高效的解析和生成功能。使用CLoader和CDumper可以在处理大型YAML数据时获得更好的性能和效率。
import yaml
Loader = yaml.CLoader
Dumper = yaml.CDumper
# 假设 data 是一个字典或其他数据结构
data = {'name': 'John', 'age': 30, 'city': 'New York'}
file='/tmp/test.yaml'
with open(file, 'w') as f:
yaml.dump(data, f, Dumper=Dumper)
with open(file, 'r') as f:
print(f.readlines())
pyyaml官网
https://pyyaml.org/wiki/PyYAMLDocumentation