Fork me on GitHub

用pip3 安装ansible

查询使用 pip 工具可以安装的 Python 包:

1. PyPI 官方网站

  • 网址: https://pypi.org/
  • 使用方法: 你可以在 PyPI 官网直接搜索任何 Python 包的名称。每个包的页面通常会列出详细的信息,包括最新版本、历史版本、文档、安装说明以及依赖关系等。

2. pip 工具的 install 命令

  • 命令: pip install package-name
  • 使用方法: 如果你知道包的确切名称,可以直接尝试安装它。如果包存在且版本匹配,它将被安装。如果你不确定包名,可以先在 PyPI 网站上确认

4. Python 包文档或项目主页

# 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/

https://pyyaml.org/wiki/PyYAMLDocumentation

https://pyyaml.org/wiki/LibYAML

https://github.com/yaml/pyyaml

posted on 2024-08-15 16:42  anyux  阅读(58)  评论(0编辑  收藏  举报