2015-01-01 19 views
44

Hallo Ich versuche herauszufinden, wie Umgebungsvariable mit Ansible festgelegt wird.So legen Sie Linux-Umgebungsvariablen mit Ansible fest

etwas, das ein einfaches Shell-Befehl wie folgt aus:

EXPORT LC_ALL=C 

als Shell-Befehl versucht und bekam einen Fehler versucht, die Umwelt-Modul und nichts passiert.

was bin ich

+0

Sie benötigen es in bestimmten Konto ($ HOME eingestellt /.profile, default (/ etc/profile) oder einfach verfügbar machen, bevor Sie eine Anwendung installieren oder ausführen? – BMW

+0

Ich muss es auf s setzen o Ich kann mongodb Konsole verwenden. Nachdem ich die Maschine angehoben habe, kann ich nicht in die Konsole gehen, ohne diese Variable zu exportieren. – Gleeb

+0

ok, du sprichst über mongodb module in ansible, dann stelle es direkt, wenn du dieses Modul vorbereitest (installiere, setze Konfigurationsdatei oder starte seinen Dienst)? – BMW

Antwort

77

Es gibt mehrere Möglichkeiten fehlen, dies zu tun und aus Ihrer Frage, es ist noch unklar, was Sie brauchen.

1. Wenn Sie Umgebungsvariable müssen nur pro Aufgabe definiert werden, tun Sie dies:

- hosts: dev 
    tasks: 
    - name: Echo my_env_var 
     shell: "echo $MY_ENV_VARIABLE" 
     environment: 
     MY_ENV_VARIABLE: whatever_value 

    - name: Echo my_env_var again 
     shell: "echo $MY_ENV_VARIABLE" 

Beachten Sie, dass MY_ENV_VARIABLE nur für die erste Aufgabe zur Verfügung steht, ist environment nicht gesetzt es dauerhaft auf Ihrem System.

TASK: [Echo my_env_var] ******************************************************* 
changed: [192.168.111.222] => {"changed": true, "cmd": "echo $MY_ENV_VARIABLE", ... "stdout": "whatever_value"} 

TASK: [Echo my_env_var again] ************************************************* 
changed: [192.168.111.222] => {"changed": true, "cmd": "echo $MY_ENV_VARIABLE", ... "stdout": ""} 

Hoffentlich bald environment verwendet, wird auch möglich sein, auf Spielebene, nicht nur Task-Ebene, wie oben. Es gibt zur Zeit eine Pull-Anforderung offen für diese Funktion auf ansible der GitHub: https://github.com/ansible/ansible/pull/8651

UPDATE: Es ist nun ab 2. Januar verschmolzen, 2015.

2. Wenn Sie permanente Umgebungsvariable wollen + systemweite/nur für bestimmter Benutzer

Sie sollten schauen, wie Sie es in Ihrer Linux-Distribution/Shell tun, gibt es mehrere Orte dafür. Zum Beispiel in Ubuntu definieren Sie, dass in Dateien wie zum Beispiel:

  • ~/.profile
  • /etc/environment
  • /etc/profile.d Verzeichnis
  • ...

Sie Ubuntu docs darüber finden Sie hier: https://help.ubuntu.com/community/EnvironmentVariables

Immerhin für die Einstellung der Umgebung Variable in ex. Ubuntu können Sie einfach lineinfile Modul von Ansible verwenden und gewünschte Zeile zu bestimmten Datei hinzufügen. Sehen Sie in Ihren BS-Dokumenten nach, wo Sie sie hinzufügen können, um sie dauerhaft zu machen.

+3

Zweite Option ist was ich brauchte. Ich habe die Lösung selbst erreicht, aber das ist die eine. – Gleeb

+2

Quick update: Pull Request # 8651 für Ansible wurde zusammengeführt, so dass es nun auch auf Playlevel möglich ist. –

+6

Also gibt es keine Möglichkeit, dauerhafte Umgebungsvariablen über Ansible zu setzen? – garbagecollector

15

Ich hatte nicht genug Ruf zu kommentieren und daher eine neue Antwort hinzuzufügen. Gasek Antwort ist ganz richtig. Wenn Sie die Datei "bash_profile" oder "/ etc/profile" aktualisieren, werden diese Änderungen nur angezeigt, nachdem Sie eine neue Anmeldung vorgenommen haben. Falls Sie die Variable env festlegen und sie dann in den nachfolgenden Aufgaben im selben Playbook verwenden möchten. Erwägen Sie, diese Umgebungsvariablen in der .bashrc-Datei hinzuzufügen. Ich denke, der Grund dafür ist die Login-und die Nicht-Login-Shells .Ansible, während der Ausführung verschiedener Aufgaben liest die Parameter von a.bashrc-Datei anstelle von bash_profile oder/etc/profile.

Als Beispiel, wenn ich meine Pfadvariable aktualisiert, um die benutzerdefinierte Binärdatei in die .bash_profile-Datei des jeweiligen Benutzers aufzunehmen, und dann eine Quelle der Datei erstellt. Die nächsten folgenden Aufgaben werden meinen Befehl nicht erkennen. Allerdings, wenn Sie in der .bashrc-Datei aktualisieren, würde der Befehl arbeiten

- name: Adding the path in the bashrc files 
    lineinfile: dest=/root/.bashrc line='export PATH=$PATH:path-to-mysql/bin' insertafter='EOF' regexp='export PATH=\$PATH:path-to-mysql/bin' state=present 

- - name: Source the bashrc file 
    shell: source /root/.bashrc 

- name: Start the mysql client 
    shell: mysql -e "show databases"; 

Diese funktionieren würde, aber hatte ich mit Profildateien getan. die mysql -e "show databases" hätte einen Fehler ergeben.

- name: Adding the path in the Profile files 
    lineinfile: dest=/root/.bash_profile line='export PATH=$PATH:{{install_path}}/{{mysql_folder_name}}/bin' insertafter='EOF' regexp='export PATH=\$PATH:{{install_path}}/{{mysql_folder_name}}/bin' state=present 

- name: Source the bash_profile file 
    shell: source /root/.bash_profile 

- name: Start the mysql client 
    shell: mysql -e "show databases"; 

** Dies wird nicht funktionieren **, wenn wir in dem gleichen Textbuch all diese Aufgaben haben

6

Für Umgebungsvariablen dauerhaft einstellen Sie eine der vorhandenen Rollen über auf ansible Galaxy verwenden können. Ich empfehle franklinkim.environment.

ansible-Galaxie Verwendung:

$ ansible-galaxy install franklinkim.environment 

requirements.yml Verwendung:

- src: franklinkim.environment 

Dann in Ihrem Textbuch:

- hosts: all 
    sudo: yes 
    roles: 
    - role: franklinkim.environment 
     environment_config: 
     NODE_ENV: staging 
     DATABASE_NAME: staging 
Verwandte Themen