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
模块,如其文档页面的要求部分所列。
这给我们带来了安装方法,您可以使用本机系统包管理器如apt
、yum
、dnf
、zypper
、emerge
、@将模块的依赖项安装到系统中987654330@ 等。或者您可以使用 python 包管理器pip
在virtualenv
内部或外部这样做,这样做是为了对用户灵活,但哪种方法取决于用户选择.
要记住的另一件事是哪里需要安装依赖项,control主机上需要Core运行时要求,但其余的依赖项(例如模块依赖项)在远程主机上是必需的。
您将在Ansible Galaxy 的角色中看到的一个常见模式是拥有一组任务,这些任务为其余任务安装各种依赖项。我们这样做是为了只安装绝对需要的需求,而不是维护 2500 多个 Ansible 模块的依赖链,这些模块是在您环境中的每个系统上标准安装 Ansible 时附带的。
对于您的特定场景,这都是关于您似乎已经解决的 python 路径,但我很惊讶您遇到了这么多麻烦,因为通常您可以将东西安装到 python 全局 site-packages
并且它“只是可以通过pip
或您发行版的本机包管理器运行”。
希望这是有用的信息。
快乐的自动化。
【讨论】:
感谢亚当在这里阅读。感谢您让我了解银河角色资源。现在我不得不跳过麻烦点,幸运的是它们对我的项目还不是关键。等我有空的时候,我得再去看看。谢谢!以上是关于Ansible 的运行时环境变量是怎么回事?的主要内容,如果未能解决你的问题,请参考以下文章