GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So setzen Sie Linux-Umgebungsvariablen mit Ansible

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

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

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

1. Wenn die Umgebungsvariable NUR PRO AUFGABE definiert werden muss, 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 ist NUR für die erste Aufgabe environment verfügbar 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 bald mit environment wird auch auf Spielebene möglich sein , nicht nur auf Aufgabenebene wie oben. Derzeit ist eine Pull-Anforderung für diese Funktion auf GitHub von Ansible offen:https://github.com/ansible/ansible/pull/8651

UPDATE:Es ist jetzt seit 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 es in Ihrer Linux-Distribution / Shell machen, dafür gibt es mehrere Stellen. Zum Beispiel in Ubuntu definieren Sie das in Dateien wie zum Beispiel:

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

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

Immerhin zum Setzen der Umgebungsvariable in ex. Ubuntu können Sie einfach lineinfile verwenden Modul aus Ansible und fügen Sie die gewünschte Zeile zu einer bestimmten Datei hinzu. Konsultieren Sie Ihre Betriebssystemdokumentation, um zu erfahren, wo Sie es hinzufügen müssen, um es dauerhaft zu machen.


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

- name: populate /etc/environment
  lineinfile:


    path: "/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 ssh raus und wieder rein, env zeigt die neuen Umgebungsvariablen.

p.s. Früher war es dest wie in:

    dest: "/etc/environment"

aber siehe Kommentar

Nur für die Aufgabe:Inlining funktioniert manchmal .

——————-

Hinweis:Das Folgende ist eher eine Beobachtung/ein Experiment als eine Empfehlung.——————-

Die erste Aufgabe ist das Äquivalent zu Michaels bestbewerteter Antwort.

Das zweite geht nicht, aber dann wieder foo=1 echo $foo funktioniert auch nicht in bash (ich vermute, das liegt daran, dass echo ist eingebaut).

Der dritte funktioniert , wie es in bash der Fall ist, und erfordert sehr wenig Aufwand. Allerdings... Als ich versuchte, dies zu tun, um eine Knotenvariable zu setzen, schlug es kläglich fehl, bis ich Michaels Antwort verwendete.

  tasks:
    - name: Echo my_env_var
      shell: "echo $MY_ENV_VARIABLE"
      environment:
        MY_ENV_VARIABLE: value1  

    - name: Echo my_env_var inline, doesnt work in bash either
      shell: "MY_ENV_VARIABLE=value2 echo $MY_ENV_VARIABLE"

    - name: set my_env_var inline then env
      shell: "MY_ENV_VARIABLE=value3 env | egrep MY_ENV"


Ausgabe:

TASK [Echo my_env_var] *********************************************************
changed: [192.168.63.253] => changed=true 
  cmd: echo $MY_ENV_VARIABLE
  stdout: value1

TASK [Echo my_env_var inline, doesnt work in bash either] **********************
changed: [192.168.63.253] => changed=true 
  cmd: MY_ENV_VARIABLE=value2 echo $MY_ENV_VARIABLE
  stdout: ''

TASK [set my_env_var inline then env] ******************************************
changed: [192.168.63.253] => changed=true 
  cmd: MY_ENV_VARIABLE=value3 env | egrep MY_ENV
  stdout: MY_ENV_VARIABLE=value3

Ich hatte nicht genug Reputation, um einen Kommentar abzugeben, und füge daher eine neue Antwort hinzu.
Gaseks Antwort ist ganz richtig. Nur eine Sache:Wenn Sie die .bash_profile aktualisieren Datei oder die /etc/profile , werden diese Änderungen erst nach einer erneuten Anmeldung übernommen. Falls Sie die env-Variable festlegen und dann in nachfolgenden Aufgaben im selben Playbook verwenden möchten, sollten Sie diese Umgebungsvariablen in .bashrc hinzufügen Datei.
Ich denke, der Grund dafür sind die Login- und die Nicht-Login-Shells.
Ansible liest beim Ausführen verschiedener Aufgaben die Parameter aus einem .bashrc Datei anstelle von .bash_profile oder die /etc/profile .

Als Beispiel, wenn ich meine Pfadvariable aktualisiert habe, um die benutzerdefinierte Binärdatei in .bash_profile aufzunehmen Datei des jeweiligen Benutzers und dann eine Quelle der Datei. Die nächsten nachfolgenden Aufgaben erkennen meinen Befehl nicht. Wenn Sie jedoch in .bashrc aktualisieren Datei, würde der Befehl funktionieren.

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

Das würde funktionieren , aber hätte ich es mit den Profildateien mysql -e "show databases" gemacht hätte einen Fehler ausgegeben.

- 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 all diese Aufgaben im selben Playbook haben.


Linux
  1. So verwenden Sie Ansible zum Einrichten der Systemüberwachung mit Prometheus

  2. Linux-Umgebungsvariablen:Lesen und Festlegen auf einem Linux-VPS

  3. So setzen/erstellen Sie Umgebungs- und Shell-Variablen in Linux

  4. Beispiele für Linux-Exportbefehle (Festlegen von Umgebungsvariablen)

  5. Wie druckt man scheinbar versteckte Umgebungsvariablen?

So setzen und listen Sie Umgebungsvariablen in Linux auf

So setzen/löschen Sie Umgebungsvariablen in Linux

So richten Sie eine Firewall mit GUFW unter Linux ein

So setzen und löschen Sie Umgebungsvariablen unter Linux

Linux-Umgebungsvariablen

So installieren und konfigurieren Sie WordPress mit Ansible