开发使用第三方python库的自定义ansible模块时正确的设置环境的方法

时间:2019-06-11 04:07:26

标签: pip ansible

我已经开发了一个定制的ansible模块,该模块依赖于第三方库PyYAML。但是运行剧本会产生收益

ansible_module_my_module.py, line 5, in <module>
  import yaml
ImportError: No module named yaml

我在ansible requirements.txt(https://github.com/ansible/ansible/blob/stable-2.8/requirements.txt)中看到了PyYAML,因此我知道它已在主机上安装/使用。我想知道是否有推荐的方法将其安装在远程计算机上?

我可以使用pip ansible模块在剧本中添加一个步骤,以将其安装在遥控器上。像

- hosts: all
  tasks:
  - name: Installing PyYAML python library using Ansible pip module
    pip:
      name: PyYAML

但这意味着剧本知道有关埋在堆栈深处的模块的实现细节,这似乎是错误的。我的期望是,可以通过某种方式告诉ansible在其远程计算机上安装第三方库。例如,在我的模块中添加一个requirements.txt并将ansible附加到其设置中,但是我似乎找不到一种优雅的方法。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

第一个无法检测到依赖关系并自动安装依赖关系违反了他们在主机上安装尽可能少的原则。为了解决这个问题,我最终将自定义模块包装在一个角色中,然后将变量传递给该角色,而不是直接传递给该模块。因此,用户将角色变量包含在其requirements.yml中之后,设置角色变量并使用include_roletasks_from对其进行调用。然后,我使用pip模块(https://docs.ansible.com/ansible/latest/modules/pip_module.html)在调用我的自定义模块的任务之前将环境设置为任务中的任务。

我面临的第二个问题是,即使通过virtualenv执行,ansible也将默认为/usr/bin/python。这显然是设计行为。为了解决这个问题,我必须添加ansible_python_interpreter才能在本地运行时将其手动设置为virtualenv。