So legen Sie Linux-Umgebungsvariablen mit Ansible fest

95

Hallo, ich versuche herauszufinden, wie Umgebungsvariablen mit Ansible festgelegt werden.

etwas, das ein einfacher Shell-Befehl wie folgt lautet:

EXPORT LC_ALL=C

Als Shell-Befehl ausprobiert und beim Verwenden des Umgebungsmoduls wurde ein Fehler festgestellt, und es ist nichts passiert.

Was vermisse ich

Gleeb
quelle
1
Müssen Sie ein bestimmtes Konto festlegen ($ HOME / .profile, Standard (/ etc / profile) oder es nur vor der Installation oder Ausführung einer Anwendung verfügbar machen?
BMW
Ich muss es einstellen, damit ich die Mongodb-Konsole verwenden kann. Nachdem ich die Maschine
angehoben habe,
ok, Sie sprechen über das Mongodb-Modul in Ansible. Warum sollten Sie es dann nicht direkt einfügen, wenn Sie das Modul vorbereiten (installieren, Konfigurationsdatei festlegen oder den Dienst starten)?
BMW
Wie hat das Festlegen einer Umgebungsvariablen etwas mit dem Mongodb-Modul zu tun? Und ich habe es überhaupt nicht benutzt. Alles was ich will ist zu installieren mongo setze die env var und starte den aervice
Gleeb
Sie hatten das Mongodb-Modul also nicht bereit? Dann müssen Sie zuerst Zeit damit verbringen, dann ist Ihr Problem kein Problem.
BMW

Antworten:

157

Es gibt mehrere Möglichkeiten, dies zu tun, und aus Ihrer Frage geht nicht hervor, was Sie benötigen.

1. Wenn die Umgebungsvariable NUR PRO AUFGABE definiert werden muss, gehen Sie folgendermaßen vor:

- 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_VARIABLENUR für die erste Aufgabe verfügbar ist und environmentdiese nicht dauerhaft auf Ihrem System festgelegt wird.

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 mit environmentwird auch möglich sein , auf Spielebene , nicht nur Task - Ebene , wie oben. Derzeit ist auf Ansibles GitHub eine Pull-Anfrage für diese Funktion geöffnet: https://github.com/ansible/ansible/pull/8651

UPDATE: Es ist jetzt ab dem 2. Januar 2015 zusammengeführt.

2. Wenn Sie eine permanente Umgebungsvariable + systemweit / nur für bestimmte Benutzer wünschen

Sie sollten sich ansehen, wie Sie dies in Ihrer Linux-Distribution / Shell tun. Dafür gibt es mehrere Stellen. Zum Beispiel definieren Sie dies in Ubuntu in Dateien wie zum Beispiel:

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

Ubuntu-Dokumente dazu finden Sie hier: https://help.ubuntu.com/community/EnvironmentVariables

Immerhin für die Einstellung der Umgebungsvariablen in ex. Unter Ubuntu können Sie einfach das lineinfileModul von Ansible verwenden und einer bestimmten Datei die gewünschte Zeile hinzufügen. Konsultieren Sie Ihre Betriebssystemdokumente, um zu erfahren, wo Sie es hinzufügen müssen, um es dauerhaft zu machen.

Michal Gasek
quelle
6
Die zweite Option ist das, was ich brauchte. Ich habe die Lösung selbst erreicht, aber das ist die eine.
Gleeb
2
Schnelles Update: Die Pull-Anfrage Nr. 8651 für Ansible wurde zusammengeführt, sodass dies jetzt auch auf Spielebene möglich ist.
Michal Gasek
8
Es gibt also keine Möglichkeit, persistente Umgebungsvariablen über Ansible festzulegen.
Müllsammler
1
@DumpHole Ich habe dafür die Rolle "franklinkim.environment" von Ansible Galaxy verwendet.
Ates Goral
1
Was ist, wenn Sie eine Umgebungsvariable nur für die aktuelle Bash-Shell festlegen möchten? Auf diese Weise kann beispielsweise ein entschlüsseltes Kennwort verwendet werden.
openCivilisation
28

Ich hatte nicht genug Ruf, um Kommentare abzugeben, und füge daher eine neue Antwort hinzu.
Die Antwort von Gasek ist ganz richtig. Nur eines: Wenn Sie die .bash_profileDatei oder die aktualisieren /etc/profile, werden diese Änderungen erst nach einer neuen Anmeldung übernommen. Wenn Sie die env-Variable festlegen und sie dann in nachfolgenden Aufgaben im selben Playbook verwenden möchten, sollten Sie diese Umgebungsvariablen in die .bashrcDatei aufnehmen.
Ich denke, der Grund dafür ist das Login und die Nicht-Login-Shells.
Ansible liest beim Ausführen verschiedener Aufgaben die Parameter aus einer .bashrcDatei anstelle von .bash_profileoder /etc/profile.

Wenn ich beispielsweise meine Pfadvariable aktualisiert habe, um die benutzerdefinierte Binärdatei in die .bash_profileDatei des jeweiligen Benutzers aufzunehmen, und dann eine Quelle für die Datei erstellt habe. Die nächsten nachfolgenden Aufgaben erkennen meinen Befehl nicht. Wenn Sie jedoch die .bashrcDatei aktualisieren , funktioniert der Befehl.

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

Dies würde funktionieren , aber wenn ich es mit Profildateien gemacht mysql -e "show databases"hätte, hätte das einen Fehler gegeben.

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

Dieser wird nicht funktionieren , wenn wir alle diese Aufgaben im selben Spielbuch haben.

Gaurav Parashar
quelle
2
Wenn die Standard-Shell sh ist, funktioniert die Quelle möglicherweise nicht. Anstatt zu source filetun. file
Cloverr
12

Hier ist eine schnelle lokale Aufgabe, um Schlüssel / Werte dauerhaft festzulegen /etc/environment(systemweit für alle Benutzer):

- name: populate /etc/environment
  lineinfile:
    dest: "/etc/environment"
    state: present
    regexp: "^{{ item.key }}="
    line: "{{ item.key }}={{ item.value}}"
  with_items: "{{ os_environment }}"

und die vars dafür:

os_environment:
  - key: DJANGO_SETTINGS_MODULE 
    value : websec.prod_settings  
  - key: DJANGO_SUPER_USER 
    value : admin

und ja, wenn Sie aus- und wieder einsteigen, envwerden die neuen Umgebungsvariablen angezeigt.

JL Peyret
quelle
destwurde durch ersetzt path, sollte aber laut docs noch funktionieren. Wenn nicht, wechseln Sie zu path.
Raten Sie den
9

Zum dauerhaften Festlegen von Umgebungsvariablen können Sie eine der vorhandenen Rollen bei Ansible Galaxy verwenden. Ich empfehle weareinteractive.environment .

Mit Ansible-Galaxie:

$ ansible-galaxy install weareinteractive.environment

Verwenden der Anforderungen.yml:

- src: franklinkim.environment

Dann in deinem Spielbuch:

- hosts: all
  sudo: yes
  roles:
    - role: franklinkim.environment
      environment_config:
        NODE_ENV: staging
        DATABASE_NAME: staging
Ates Goral
quelle
@openCivilisation Aktualisiert!
Ates Goral
Hinweis: weareinteractive.environment schreibt in / etc / environment
simohe
5

Dies ist die beste Option. Wie Michal Gasek (erste Antwort) sagte , können wir seit dem Zusammenführen der Pull-Anfrage ( https://github.com/ansible/ansible/pull/8651 ) permanente Umgebungsvariablen einfach nach Spielstufe festlegen .

- hosts: all
  roles:
     - php
     - nginx
  environment:
    MY_ENV_VARIABLE: whatever_value
lauralacarra
quelle
2
Wird die Umgebung vor der Rolle ausgeführt? Weil meine Suche noch leer ist.
EvgenyKolyakov
Sogar meine Suche ist unabhängig von der Reihenfolge leer
AhmFM
Die einzige Einschränkung besteht darin, dass die Umgebungen in der Playbook-Ebene aufgelöst werden, bevor das Playbook ausgeführt wird. Dies ist nützlich, wenn Sie alle Werte im Voraus kennen, aber wenn Sie einen Wert dinamisch hinzufügen möchten, schlage ich vor, JL Peyrets Antwort zu
folgen