it-swarm.com.de

Festlegen von Linux-Umgebungsvariablen mit Ansible

Hallo, ich versuche herauszufinden, wie man Umgebungsvariablen mit Ansible einstellt.

etwas, das ein einfacher Shell-Befehl so beschreibt:

EXPORT LC_ALL=C

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

was vermisse ich

79
Gleeb

Es gibt mehrere Möglichkeiten, dies zu tun, und anhand Ihrer Frage ist nicht klar, was Sie benötigen.

1. Wenn Sie eine Umgebungsvariable benötigen, die NUR PRO AUFGABE definiert werden soll, 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_VARIABLE ist NUR für die erste Task verfügbar, environment setzt es nicht 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 wird die Verwendung von environment bald auch auf Spielebene möglich sein, nicht nur auf Aufgabenebene wie oben. Derzeit ist eine Pull-Anfrage für diese Funktion in Ansibles GitHub offen: https://github.com/ansible/ansible/pull/8651

UPDATE: Ab dem 2. Januar 2015 ist es nun zusammengeführt.

2. Wenn Sie eine permanente Umgebungsvariable + systemweit/nur für bestimmte Benutzer möchten

Sie sollten sich ansehen, wie Sie dies in Ihrer Linux-Distribution/Shell tun. Dafür gibt es mehrere Stellen. Zum Beispiel in Ubuntu definierst du das 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 zum Setzen von Umgebungsvariablen in ex. Unter Ubuntu können Sie einfach das lineinfile Modul von Ansible verwenden und die gewünschte Zeile zu einer bestimmten Datei hinzufügen. Lesen Sie in den Dokumenten Ihres Betriebssystems nach, wo Sie es hinzufügen können, um es dauerhaft zu machen.

128
Michal Gasek

Ich hatte nicht genug Ansehen, um Kommentare abzugeben, und füge daher eine neue Antwort hinzu.
Die Antwort von Gasek ist ganz richtig. Nur eine Sache: Wenn Sie die Datei .bash_profile Oder die Datei /etc/profile Aktualisieren, werden diese Änderungen erst nach einer neuen Anmeldung wirksam. In diesem Fall legen Sie die env-Variable fest und möchten sie dann in den nachfolgenden Aufgaben im selben Playbook verwenden. Fügen Sie diese Umgebungsvariablen in die Datei .bashrc Ein.
Ich denke, der Grund dafür sind die Anmelde- und die Nicht-Anmelde-Shells.
Während der Ausführung verschiedener Tasks werden die Parameter aus einer .bashrc - Datei anstelle von .bash_profile Oder /etc/profile Gelesen.

Als Beispiel, wenn ich meine Pfadvariable aktualisiert habe, um die benutzerdefinierte Binärdatei in die Datei .bash_profile Des jeweiligen Benutzers aufzunehmen, und dann eine Quelle für die Datei erstellt habe. Die nächsten nachfolgenden Aufgaben werden meinen Befehl nicht erkennen. Wenn Sie jedoch in der Datei .bashrc 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 hatte ich mit Profildateien getan. der 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";

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

25
gaurav parashar

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

Verwenden von Ansible-Galaxie:

$ ansible-galaxy install franklinkim.environment

Verwendung von requirements.yml:

- src: franklinkim.environment

Dann in deinem Playbook:

- hosts: all
  Sudo: yes
  roles:
    - role: franklinkim.environment
      environment_config:
        NODE_ENV: staging
        DATABASE_NAME: staging
10
Ates Goral

Hier ist eine schnelle lokale Aufgabe, um Schlüssel/Werte für /etc/environment Festzulegen (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 einlesen, zeigt env die neuen Umgebungsvariablen an.

5
JL Peyret

Dies ist die beste Option. Wie gesagt, Michal Gasek (erste Antwort), da die Pull-Anfrage zusammengeführt wurde ( https://github.com/ansible/ansible/pull/8651 ), können wir einstellen permanente Umgebungsvariablen einfach nach Spiellevel.

- hosts: all
  roles:
     - php
     - nginx
  environment:
    MY_ENV_VARIABLE: whatever_value
2
lauralacarra