Ansible 的运行时环境变量是怎么回事?

Posted

技术标签:

【中文标题】Ansible 的运行时环境变量是怎么回事?【英文标题】:What is up with Ansible's runtime environment variables? 【发布时间】:2018-09-09 02:42:33 【问题描述】:

有人可以向我解释 Ansible 在什么样的环境中运行吗?在过去的三个月里,我一直在使用这个产品,并且发现它在使用它的模块时非常脆弱。

我遇到了 python、mysql 和其他模块吐出错误的问题找不到这个无法加载那个。我必须重写非常好的示例(甚至来自 Ansibles 自己的文档),甚至不得不在 virtualenv 中运行 Ansible,以便(例如)python-package 只会被识别,而另一个 playbook 无法识别它。

例如。我正在尝试使用 mysql db modules 并不断收到以下错误:

"msg": "Unable to find any of pip2, pip to use.  pip needs to be installed."

"msg": "The MySQL-python module is required."

我确实找到了解决方案(经过几天的努力),但对于为什么我需要诉诸以下方法感到目瞪口呆:

解决方案:


- name: Execute task with extended PATH
  shell: echo $PATH
  environment:
    PATH: "/home/vagrant/venv/bin: ansible_env.PATH "

我正在本地执行剧本。

我已经全局安装了 pip 和 mysql-python:

$ pip --version
pip 9.0.1 from /usr/local/lib/python2.7/site-packages (python 2.7)

[vagrant@controller bin]$ pip show mysql-python
You are using pip version 9.0.1, however version 9.0.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

[vagrant@controller bin]$ pip show python
Name: Python
Version: 2.7.4
Summary: A high-level object-oriented programming language
Home-page: http://www.python.org/2.7
Author: Guido van Rossum and the Python community
Author-email: python-dev@python.org
License: PSF license
Location: /usr/local/lib/python2.7/lib-dynload
Requires:
You are using pip version 9.0.1, however version 9.0.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

[vagrant@controller bin]$ rpm -qa MySQL-python
MySQL-python-1.2.5-1.x86_64

[vagrant@controller bin]$ python27 --version
Python 2.7.4

[vagrant@controller ~]$ which python27
/usr/local/bin/python27

我还在我的 virtualenv 中安装了上述内容,我目前正在从那里运行 Ansible:

(venv) [vagrant@controller ~]$ pip --version
pip 9.0.3 from /home/vagrant/venv/lib/python2.7/site-packages (python 2.7)

(venv) [vagrant@controller ~]$ python --version
Python 2.7.4

(venv) [vagrant@controller ~]$ which python
~/venv/bin/python

(venv) [vagrant@controller ~]$ pip show mysql-python
Name: MySQL-python
Version: 1.2.5
Summary: Python interface to MySQL
Home-page: https://github.com/farcepest/MySQLdb1
Author: Andy Dustman
Author-email: farcepest@gmail.com
License: GPL
Location: /home/vagrant/venv/lib/python2.7/site-packages
Requires:

我还在命令行以及本地库存文件中指定了解释器和环境变量:

[all:vars]
deploy_env=local ansible_python_interpreter=/home/vagrant/venv/bin/python2.7

$ansible-playbook -i inventory/local deploy_mysql.yml --diff -e "ansible_python_interpreter=/home/vagrant/venv/bin/python2.7"

所有必需的包都安装在全局或 virtualenv 中,但在 playbook 运行时无法找到。对于 pip,我能够像这样安装软件包来克服错误:

- name: Install the Python MySQLB module
  pip: name=" item "
  extra_args: --index=https://pypi.python.org/pypi/
  with_items: " mysql_dependencies "

但是安装在哪里?如前所述,我已经将它安装在全局和 virtualenv 中。虽然 pip 好像安装了 mysql-python 还是无法安装。

我在工作中交付我的项目时遇到了巨大的延误,希望能得到解释。我错过了什么明显的东西吗?

【问题讨论】:

所以继续我的工作,上面提到的解决方案让我通过了这个:- name: Install MySQL dependencies yum: pkg=" item " state=installed with_items: " mysql_dependencies ",但后来在这个块失败了:- name: Create a new database mysql_db: name: " item.value.name " state: present login_host: " item.value.userhost " login_port: " mysql_port " login_user: " mysql_root " login_password: " mysql_root_pass " with_dict: " databases " 出现此错误:TASK [mysqldb-setup : Create a new database] ***************************************************************************** failed: [127.0.0.1] (item=........., "msg": "The MySQL-python module is required." to retry, use: --limit @/vagrant/tools/deploy_mysql.retry 将失败任务的-vvv日志添加到OP。 请不要在 cmets 中写一大堆未格式化的代码。请edit 包含它们的问题,以便它们的格式很好。 会的,很抱歉“编辑”按钮太小了,我一直忽略它。 【参考方案1】:

Ansible 本身,就像它编写的 python 一样,本质上是模块化的,因此仅在实际需要时才需要依赖项,而不是在执行时一次全部需要。 requirements file 中概述了 Ansible Core Runtime 的依赖链,但是每个模块都可能添加依赖。当一个模块添加一个依赖项时,它将被记录下来,您需要从那里处理它。例如,os_image module for OpenStack 需要 shade 模块,如其文档页面的要求部分所列。

这给我们带来了安装方法,您可以使用本机系统包管理器如aptyumdnfzypperemerge、@将模块的依赖项安装到系统中987654330@ 等。或者您可以使用 python 包管理器pipvirtualenv 内部或外部这样做,这样做是为了对用户灵活,但哪种方法取决于用户选择.

要记住的另一件事是哪里需要安装依赖项,control主机上需要Core运行时要求,但其余的依赖项(例如模块依赖项)在远程主机上是必需的。

您将在Ansible Galaxy 的角色中看到的一个常见模式是拥有一组任务,这些任务为其余任务安装各种依赖项。我们这样做是为了只安装绝对需要的需求,而不是维护 2500 多个 Ansible 模块的依赖链,这些模块是在您环境中的每个系统上标准安装 Ansible 时附带的。

对于您的特定场景,这都是关于您似乎已经解决的 python 路径,但我很惊讶您遇到了这么多麻烦,因为通常您可以将东西安装到 python 全局 site-packages 并且它“只是可以通过pip 或您发行版的本机包管理器运行”。

希望这是有用的信息。

快乐的自动化。

【讨论】:

感谢亚当在这里阅读。感谢您让我了解银河角色资源。现在我不得不跳过麻烦点,幸运的是它们对我的项目还不是关键。等我有空的时候,我得再去看看。谢谢!

以上是关于Ansible 的运行时环境变量是怎么回事?的主要内容,如果未能解决你的问题,请参考以下文章

不是内部或外部命令,也不是可运行的程序 是怎么回事

shell脚本ansible执行不成功

java的环境变量classpath该怎么设置呢?

java运行显示“找不到或无法加载主类”怎么回事?

ansible 之 设置环境变量

go编程语言 设置环境变量是怎么回事