【问题标题】:How: django_manage in ansible with Python3如何:使用 Python3 在 ansible 中使用 django_manage
【发布时间】:2015-05-19 13:11:26
【问题描述】:

我正在关注 django manage.py 模块 http://docs.ansible.com/django_manage_module.html

例如我的一项任务看起来像 -

- name: Django migrate
  django_manage: command=migrate
                 app_path={{app_path}}
                 settings={{django_settings}}
  tags:
    - django

这在 python2 (默认在 ubuntu 中)工作得很好,但是当我尝试使用 python3-django 项目时它会抛出错误

failed: [123.456.200.000] => (item=school) => {"cmd": "python manage.py makemigrations --noinput school --settings=myproj.settings.production", "failed": true, "item": "school", "path": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games", "state": "absent", "syspath": ["/home/ubuntu/.ansible/tmp/ansible-tmp-1432039779.41-30449122707918", "/usr/lib/python2.7", "/usr/lib/python2.7/plat-x86_64-linux-gnu", "/usr/lib/python2.7/lib-tk", "/usr/lib/python2.7/lib-old", "/usr/lib/python2.7/lib-dynload", "/usr/local/lib/python2.7/dist-packages", "/usr/lib/python2.7/dist-packages"]}
msg: 
:stderr: Traceback (most recent call last):
  File "manage.py", line 8, in <module>
    from django.core.management import execute_from_command_line
ImportError: No module named django.core.management

从这个错误看来 Ansible 默认使用 Python2。我们可以将其更改为 python3 或任何其他解决方法吗?

PS:pip freeze 确保已安装 django 1.8(对于使用 pip3 的 python3)

建议: 当我运行ubuntu@ubuntu:/srv/myproj$ python3 manage.py migrate 时,它工作正常。所以我正在考虑直接传递命令 像

 - name: Django migrate
   command: python3 manage.py migrate
   tags:
     - django

但是我如何传递项目路径或manage.py文件的路径,只有一个选项可以传递设置,比如--settings=myproject.settings.main

我们可以通过直接命令吗?

【问题讨论】:

  • 如果您使用的是虚拟环境,那么使用 virtualenv 参数有望在虚拟环境中使用 Python 3 解释器。
  • @Alasdair:不!我没有使用 virtualenv。一切都是系统范围的。 sudo pip3 install &lt;pkg_name&gt;
  • 是的,当我在您的问题中看到pip3 时,我已经猜到了,但还是决定留下评论,因为它可能对其他人有所帮助。希望你能找到解决办法。
  • 在本地机器上我使用 virtualenv。 virtaulenv -p python3 venv 但在远程服务器上我会使用sudo apt-get install python3-pip 并直接使用pip3 install xyz,因为我不需要在那台机器上使用 virtualenv。
  • 对于命令有 chdir 键,您可以在运行命令之前使用 cd 在目录中

标签: django ansible ansible-playbook


【解决方案1】:

来自 Ansible 网站http://docs.ansible.com/intro_installation.html

Python 3 是一种与 Python 2 略有不同的语言,大多数 Python 程序(包括 Ansible)还没有切换。但是,某些 Linux 发行版(Gentoo、Arch)可能没有默认安装 Python 2.X 解释器。在这些系统上,您应该安装一个,并在清单(请参阅清单)中设置“ansible_python_interpreter”变量以指向您的 2.X Python。 Red Hat Enterprise Linux、CentOS、Fedora 和 Ubuntu 等发行版都默认安装了 2.X 解释器,这不适用于这些发行版。几乎所有的 Unix 系统也是如此。如果您需要通过安装 Python 2.X 来引导这些远程系统,使用“原始”模块将能够远程完成。

【讨论】:

    【解决方案2】:

    如果您将 Django manage.py 文件中的 shebang 编辑为 #!/usr/bin/env python3,那么您可以确保始终使用 python 3 来运行您的 Django 应用程序。

    使用 Ansible 2.3.0 和 Django 1.10.5 成功尝试。 YMMV

    【讨论】:

      【解决方案3】:

      Ansible 正在使用 python 运行 django 命令:https://github.com/ansible/ansible-modules-core/blob/devel/web_infrastructure/django_manage.py#L237

      因此,您唯一的解决方案是覆盖将要运行的可执行文件,例如通过更改您的 PATH:

      - file: src=/usr/bin/python3 dest=/home/user/.local/bin/python state=link
      - name: Django migrate
        django_manage: command=migrate
                       app_path={{app_path}}
                       settings={{django_settings}}
        environment:
          - PATH: "/home/user/.local/bin/:/bin:/usr/bin:/usr/local/bin"
      

      【讨论】:

      • 现在不是这样了。此时是第 259 行,带有 ./manage.py
      • 哈好吧......但是:OP的问题还会出现吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2021-08-29
      • 1970-01-01
      相关资源
      最近更新 更多