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.