【问题标题】:Ansible: playbook not running with python3Ansible:剧本未与 python3 一起运行
【发布时间】:2019-10-11 08:30:56
【问题描述】:

我已经按照官方 ansible 文档克隆了 ansible 存储库和设置。

我通过为 python3 创建venv 直接从源代码进行设置。

运行这个:. venv/bin/activate && . hacking/env-setup 确实设置了 ansible 环境。如果我写这个(venv 被激活):

ansible-playbook --version

它输出这个:

ansible-playbook 2.8.5.post0
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/oerp/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/oerp/src/ansible/lib/ansible
  executable location = /home/oerp/src/ansible/bin/ansible-playbook
  python version = 3.6.7 (default, Mar 29 2019, 10:38:28) [GCC 5.4.0 20160609]

所以它确实表明它使用了 Python 版本 3.6.7。如果我为具有 python 3.6 语法的自定义模块运行单元测试,测试运行良好(测试使用 tox 运行,如 ansible 本身所记录的那样)。

但它无法通过剧本运行我的模块。看起来它正在使用python2执行它。

当我运行这个命令时:

ansible-playbook --extra-vars "target=local_stage" --connection=local /home/oerp/src/ansible-playbooks/buildout_test.yml -vvv

它抛出这个回溯:

The full traceback is:
Traceback (most recent call last):
  File "/home/oerp/.ansible/tmp/ansible-tmp-1570781848.1110492-2720137190388/AnsiballZ_focusate_buildout.py", line 114, in <module>
    _ansiballz_main()
  File "/home/oerp/.ansible/tmp/ansible-tmp-1570781848.1110492-2720137190388/AnsiballZ_focusate_buildout.py", line 106, in _ansiballz_main
    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)
  File "/home/oerp/.ansible/tmp/ansible-tmp-1570781848.1110492-2720137190388/AnsiballZ_focusate_buildout.py", line 49, in invoke_module
    imp.load_module('__main__', mod, module, MOD_DESC)
  File "/tmp/ansible_focusate_buildout_payload_JDfOK3/__main__.py", line 52
    path: str,
        ^
SyntaxError: invalid syntax

显然它不识别打字语法。查看调试,我可以看到正在执行这样的二进制文件:

<stage-my-domain.com> EXEC /bin/sh -c '/usr/bin/python /home/oerp/.ansible/tmp/ansible-tmp-1570781848.1110492-2720137190388/AnsiballZ_my_buildout.py && sleep 0'

在我的环境中/usr/bin/python --version,是Python 2.7.12

调试也显示此信息:

<stage-my-domain.com> EXEC /bin/sh -c 'echo PLATFORM; uname; echo FOUND; command -v '"'"'/usr/bin/python'"'"'; command -v '"'"'python3.7'"'"'; command -v '"'"'python3.6'"'"'; command -v '"'"'python3.5'"'"'; command -v '"'"'python2.7'"'"'; command -v '"'"'python2.6'"'"'; command -v '"'"'/usr/libexec/platform-python'"'"'; command -v '"'"'/usr/bin/python3'"'"'; command -v '"'"'python'"'"'; echo ENDFOUND && sleep 0'

有谁知道为什么 ansible 会忽略激活的 venv 而只使用全局 python 即 python2?

附:我还通过apt-get install ansible 全局安装了ansible。

【问题讨论】:

    标签: python python-3.x ansible python-venv


    【解决方案1】:

    venv 使用起来有点棘手。它与您的会话相关联。 Ansible 在执行时使用与您作为登录用户不同的会话。您需要为 Ansible 在执行时使用的特定会话激活 venv。

    你可以尝试两件事:

    1:设置环境变量:

    environment:
      PATH: "{{ ansible_env.PATH }}:/yourpython/bin"
      SOME: value
    

    2:设置 Ansible python 解释器

    https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#how-do-i-handle-python-not-having-a-python-interpreter-at-usr-bin-python-on-a-remote-machine

    在任何主机上设置库存变量 ansible_python_interpreter 将告诉 Ansible 自动替换 Python 解释器 取而代之的是价值。因此,您可以在 如果您系统上的 /usr/bin/python 不指向 兼容的 Python 解释器。

    某些平台可能仅默认安装 Python 3。如果是 未安装为 /usr/bin/python,您需要配置路径 通过 ansible_python_interpreter 到解释器。虽然大部分核心 模块将适用于 Python 3,可能有一些特殊用途 那些没有,或者您可能会在边缘情况下遇到错误。作为一个 临时解决方法,您可以在托管主机上安装 Python 2,然后 通过 ansible_python_interpreter 配置 Ansible 以使用该 Python。

    【讨论】:

    • 如果我理解正确的话,重要的是什么 python 用于目标环境,而不是运行 ansible 本身(比如在某个远程服务器上使用哪个 python)。虽然我在文档中没有看到任何提及这一点,但它解释了如何设置环境然后使用它。
    • 没错。我知道这有点难以理解,但本质上 Ansible 将创建一个 Python 文件,该文件将被复制到目标主机,并将与目标主机 Python 一起运行。我认为这可能不会在文档中提及。您可以进行调试运行以查看会发生什么。 -vvv 它会打印出正在发生的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2021-11-09
    • 2018-11-05
    • 1970-01-01
    • 2017-09-26
    相关资源
    最近更新 更多