2015-05-19 13 views
9

Sto seguendo questo per Django modulo manage.py http://docs.ansible.com/django_manage_module.htmlCome: django_manage in ansible con python3

per esempio uno dei miei compiti sembra -

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

questo funziona perfettamente bene con python2 (impostazione predefinita in Ubuntu), ma quando provo con il progetto python3-django getta errore

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 

da questo errore sembra Ansible bydefault utilizza Python2. possiamo cambiarlo in python3 o in qualsiasi altra soluzione?

PS: pip freeze garantire che Django 1.8 ha installato (per python3 usando PIP3)

Suggerimenti: quando lo eseguo [email protected]:/srv/myproj$ python3 manage.py migrate funziona benissimo. così sto pensando di comando passando direttamente qualcosa come

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

ma come faccio a passare il percorso del progetto o il percorso del file manage.py, c'è solo la possibilità di passare le impostazioni, qualcosa come --settings=myproject.settings.main.

possiamo fare passando il comando diretto?

+0

Se si utilizza un ambiente virtuale, l'uso del parametro 'virtualenv' si spera possa utilizzare l'interprete Python 3 nell'ambiente virtuale. – Alasdair

+0

@Alasdair: No! Non sto usando virtualenv. tutto è a livello di sistema. 'sudo pip3 installa' – micheal

+0

Sì, l'avevo intuito quando ho visto 'pip3' nella tua domanda, ma ho deciso di lasciare comunque il commento perché potrebbe aiutare qualcun altro. Spero che tu trovi una soluzione. – Alasdair

risposta

3

Da Ansible sito http://docs.ansible.com/intro_installation.html

Python 3 è un linguaggio leggermente diverso rispetto Python 2 e la maggior parte dei programmi Python (compresi Ansible) non sono di commutazione ancora finita. Tuttavia, alcune distribuzioni Linux (Gentoo, Arch) potrebbero non avere un interprete Python 2.X installato per impostazione predefinita. Su quei sistemi, dovresti installarne uno e impostare la variabile 'ansible_python_interpreter' nell'inventario (vedi Inventario) per puntare al tuo 2.X Python. Distribuzioni come Red Hat Enterprise Linux, CentOS, Fedora e Ubuntu hanno tutti un interprete 2.X installato di default e questo non si applica a quelle distribuzioni. Questo vale anche per quasi tutti i sistemi Unix. Se è necessario eseguire il bootstrap di questi sistemi remoti installando Python 2.X, utilizzando il modulo 'raw' sarà possibile farlo da remoto.

1

Ansible sta usando python per eseguire il comando django: https://github.com/ansible/ansible-modules-core/blob/devel/web_infrastructure/django_manage.py#L237

l'unica soluzione è quindi quella di sovrascrivere il file eseguibile che verrà eseguito, per esempio cambiando la tua 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" 
0

Se modifichi lo shebang nel file manage.py di Django per essere #!/usr/bin/env python3 quindi puoi assicurarti che python 3 sarà sempre utilizzato per eseguire la tua app Django.

Provato con successo con Ansible 2.3.0 e Django 1.10.5. YMMV