2013-10-23 8 views
12

Ich habe a playbook to install PythonBrew. Um dies zu tun, muss ich die Shell-Umgebung ändern. Da Shell Schritte in ansible nicht persistent sind, habe ich export PYTHONBREW_ROOT=${pythonbrew.root}; source ${pythonbrew.root}/etc/bashrc; bis Anfang jedes meiner PythonBrew bezogene Befehle vorangestellt wird:Wie wird in Ansible das Umgebungsschlüsselwort verwendet?

- name: Install python binary 
     shell: export PYTHONBREW_ROOT=${pythonbrew.root}; source ${pythonbrew.root}/etc/bashrc; pythonbrew install ${python.version} 
     executable=/bin/bash 

    - name: Switch to python version 
     shell: export PYTHONBREW_ROOT=${pythonbrew.root}; source ${pythonbrew.root}/etc/bashrc; pythonbrew switch ${python.version} 
     executable=/bin/bash 

Ich möchte, dass die Redundanz beseitigen. Auf der Ansible discussion group wurde ich das Schlüsselwort environment verwiesen. Ich habe mir die examples in the documentation angesehen und es klickt nicht für mich. Das Umgebungs-Keyword sieht für mich nicht viel anders aus als jede andere Variable.

Ich habe nach anderen Beispielen gesucht, aber konnte nur this very simple example finden.

Kann jemand zeigen, wie das Schlüsselwort environment in Ansible funktioniert, vorzugsweise mit dem Codebeispiel, das ich oben angegeben habe?

Antwort

15

Nicht sicher, ob es wird passt Ihre Notwendigkeit, aber das ist, wie ich sehe dies:

- hosts: all 
    vars: 
    env: 
     PYTHONBREW_ROOT: "{{ pythonbrew.root }}" 
    tasks: 
    - name: Install python binary 
     shell: pythonbrew install {{ python.version }} executable=/bin/bash 
     environment: env 

    - name: Switch to python version 
     shell: pythonbrew switch {{ python.version }} executable=/bin/bash 
     environment: env 

Es ist einfach eine Variable env und wieder verwenden es als Umwelt in Ihre beiden Shell-Befehle genannt setzt. Auf diese Weise wird der Shell-Befehl den PYTHONBREW_ROOT-Pfad festgelegt.

+2

Zumindest bei der aktuellen Version von Ansible funktioniert dieses Beispiel ** nicht **. Die Zeile 'executable =/bin/bash' muss in derselben Zeile wie' shell: ... 'stehen. Ich habe die Antwort entsprechend aktualisiert. –

+0

Danke für die Korrektur :) – magnetik

0

Ich habe ein sehr ähnliches Problem; Ich hätte gerne, dass ich es in einem Python virtualenv machen kann (nachdem es dafür gesorgt hat, dass es natürlich für mich eingerichtet ist).

Hier ist ein Weg, wie ich die Umweltvoraussetzungen bisher gemacht habe; im Wesentlichen habe ich musste hinzufügen (und entfernen Sie optional) Zeilen .bashrc:

tasks: 
    - name: "Enable virtualenv in .bashrc" 
     lineinfile: dest=.bashrc 
        line="source {{ PROJECT_HOME }}/venv/bin/activate" 

    # Put tasks that rely on this environmental precondition here (?) 

    - name: "Disable virtualenv in .bashrc" 
     lineinfile: dest=.bashrc 
        line="source {{ PROJECT_HOME }}/venv/bin/activate" 
        state=absent 

Ich weiß nicht, ob ich „tue es falsch“, aber bis ich es herausfinden oder jemand kommt sagen, mir, wie es besser geht, nehme ich an, das wird funktionieren.

+1

Dies ist ein etwas anderes Problem. Für etwas wie Ansible, anstatt das virtualenv zu aktivieren und zu deaktivieren, rufe ich einfach meinen Befehl mit dem vollständigen virtualenv python-bin-Pfad auf. Zum Beispiel: 'command:" {{PROJECT_HOME}}/vend/bin/python myscript.py "'. Es macht Ihr Ansible-Skript ein wenig transparenter. Ich benutze virtualenv regelmäßig, aber aktiviere es sehr selten in der Shell. Normalerweise rufe ich nur den Python-Bin über die Befehlszeile auf. – klenwell

+0

Sicher, aber da ansible Abhängigkeiten hat, die auch in der virtualenv sein könnten, andere Befehle, etc ... Normalerweise möchte ich so viel wie ich in der virtualenv enthalten und immer aktiviert haben, wenn auf der Anwendungsebene arbeiten . –

+0

Sie können diese Abhängigkeiten im Projektvirtualenv des Steuerhosts mit {{PROJECT_HOME}}/vent/bin/pip install ... installieren, aber wenn diese auf den entfernten Hosts benötigt werden, werden die Dinge komplizierter, weil #!/Usr/bin/Python ist in allen Bibliotheken von ansible enthalten. – bbaassssiiee

Verwandte Themen