2015-05-19 4 views
9

Ich verfolge diese für django manage.py Modul http://docs.ansible.com/django_manage_module.htmlWie: django_manage in ansible mit Python3

für z.B. eine meiner Aufgaben sieht aus wie -

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

dies mit python2 perfekt funktioniert gut (Standard in Ubuntu), aber wenn ich mit python3-django Projekt versuchen, wirft es Fehler

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 

aus diesem Fehler es ansible scheint Standardmäßig verwendet Python2. können wir dies zu python3 oder einer anderen Problemumgehung ändern?

PS: pip freeze dass django gewährleisten 1,8 hat (für python3 mit PIP3) installiert

Vorschläge: wenn ich [email protected]:/srv/myproj$ python3 manage.py migrate laufen es funktioniert gut. so ich denke an vorbei Befehl direkt so etwas wie

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

aber wie gehe ich den Projektpfad oder manage.py Dateipfad gibt es nur eine Option, Einstellungen zu übergeben, so etwas wie --settings=myproject.settings.main.

können wir tun, indem wir direkten Befehl übergeben?

+0

Wenn Sie eine virtuelle Umgebung verwenden, wird der Parameter "virtualenv" hoffentlich den Python 3-Interpreter in der virtuellen Umgebung verwenden. – Alasdair

+0

@Alasdair: Nein! Ich benutze nicht virtualenv. alles ist systemweit. 'sudo pip3 install ' – micheal

+0

Ja, ich hatte das erraten, als ich 'pip3' in deiner Frage gesehen habe, aber entschieden habe, den Kommentar trotzdem zu hinterlassen, weil es jemand anderem helfen könnte. Ich hoffe, Sie haben eine Lösung gefunden. – Alasdair

Antwort

3

Von ansible Website http://docs.ansible.com/intro_installation.html

Python 3 ist eine etwas andere Sprache als Python 2 und die meisten Python-Programme (einschließlich ansible) sind noch nicht umgeschaltet. Bei einigen Linux-Distributionen (Gentoo, Arch) ist jedoch möglicherweise kein Python 2.X-Interpreter installiert. Auf diesen Systemen sollten Sie eines installieren und die Variable 'ansible_python_interpreter' im Inventar (siehe Inventar) so einstellen, dass sie auf Ihr 2.X Python zeigt. Bei Distributionen wie Red Hat Enterprise Linux, CentOS, Fedora und Ubuntu ist standardmäßig ein 2.X-Interpreter installiert, was für diese Distributionen nicht gilt. Dies gilt auch für fast alle Unix-Systeme. Wenn Sie diese fernen Systeme durch die Installation von Python 2.X booten müssen, können Sie das 'rohe' Modul auch remote verwenden.

1

ansible wird python mit dem django Befehl auszuführen: https://github.com/ansible/ansible-modules-core/blob/devel/web_infrastructure/django_manage.py#L237

Ihre einzige Lösung ist somit die ausführbare Datei zu überschreiben, das durch das Ändern Ihrer PATH zum Beispiel ausführen, werden:

- 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" 
0

Wenn Sie bearbeiten den Shebang in der Django manage.py-Datei als #!/usr/bin/env python3, dann können Sie sicherstellen, dass Python 3 immer zum Ausführen Ihrer Django-App verwendet wird.

Erfolgreich mit Ansible 2.3.0 und Django 1.10.5 versucht. YMMV