C'est la meilleure solution. Comme l'a dit Michal Gasek (première réponse), puisque la pull request a été fusionnée (https://github.com/ansible/ansible/pull/8651), nous sommes en mesure de définir des variables d'environnement permanentes facilement par niveau de jeu.
- hosts: all
roles:
- php
- nginx
environment:
MY_ENV_VARIABLE: whatever_value
Il existe plusieurs façons de procéder et, d'après votre question, ce dont vous avez besoin n'est pas clair.
- 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"
Notez que MY_ENV_VARIABLE
est disponible UNIQUEMENT pour la première tâche, environment
ne le fixe pas de façon permanente sur votre système.
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": ""}
J'espère bientôt utiliser environment
sera également possible au niveau de jeu , pas seulement au niveau de la tâche comme ci-dessus.
MISE À JOUR :Il est désormais fusionné depuis le 2 janvier 2015.
Vous devriez regarder comment vous le faites dans votre distribution/shell Linux, il y a plusieurs endroits pour cela. Par exemple dans Ubuntu vous définissez cela dans des fichiers comme par exemple :
~/.profile
/etc/environment
/etc/profile.d
répertoire- ...
Vous trouverez la documentation Ubuntu à ce sujet ici :https://help.ubuntu.com/community/EnvironmentVariables
Après tout pour définir la variable d'environnement dans ex. Ubuntu, vous pouvez simplement utiliser lineinfile
module d'Ansible et ajoutez la ligne souhaitée à certains fichiers. Consultez la documentation de votre système d'exploitation pour savoir où l'ajouter pour le rendre permanent.
Voici une tâche locale rapide pour définir de manière permanente des clés/valeurs sur /etc/environment
(qui s'applique à l'ensemble du système, tous les utilisateurs) :
- name: populate /etc/environment
lineinfile:
path: "/etc/environment"
state: present
regexp: "^{{ item.key }}="
line: "{{ item.key }}={{ item.value}}"
with_items: "{{ os_environment }}"
et les vars pour cela :
os_environment:
- key: DJANGO_SETTINGS_MODULE
value : websec.prod_settings
- key: DJANGO_SUPER_USER
value : admin
et, oui, si vous sortez et revenez en ssh, env
affiche les nouvelles variables d'environnement.
p.s. Avant c'était dest
comme dans :
dest: "/etc/environment"
mais regarde le commentaire
Pour la tâche uniquement :l'inlining fonctionne, parfois .
——————-
Remarque :les éléments ci-dessous sont plus une observation/expérience qu'une recommandation.——————-
La première tâche est l'équivalent de la réponse la plus votée de Michael.
Le second ne fonctionne pas, mais encore une fois foo=1 echo $foo
ne fonctionne pas non plus dans bash (je suppose que c'est parce que echo
est une fonction intégrée).
Le troisième fonctionne , comme dans bash, et demande très peu d'efforts. Cependant... quand j'ai essayé de le faire pour définir une variable de nœud, cela a lamentablement échoué jusqu'à ce que j'utilise la réponse de Michael.
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"
sortie :
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
Je n'avais pas assez de réputation pour commenter et j'ajoute donc une nouvelle réponse.
La réponse de Gasek est tout à fait correcte. Juste une chose :si vous mettez à jour le .bash_profile
fichier ou le /etc/profile
, ces modifications ne seraient reflétées qu'après une nouvelle connexion. Si vous souhaitez définir la variable env, puis l'utiliser dans les tâches suivantes du même playbook, envisagez d'ajouter ces variables d'environnement dans le .bashrc
dossier.
Je suppose que la raison derrière cela est la connexion et les shells sans connexion.
Ansible, lors de l'exécution de différentes tâches, lit les paramètres d'un .bashrc
fichier au lieu du .bash_profile
ou le /etc/profile
.
Par exemple, si j'ai mis à jour ma variable de chemin pour inclure le binaire personnalisé dans le .bash_profile
fichier de l'utilisateur respectif, puis a créé une source du fichier. Les prochaines tâches suivantes ne reconnaîtront pas ma commande. Cependant si vous mettez à jour dans le .bashrc
fichier, la commande fonctionnerait.
- 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";
Cela fonctionnerait , mais si je l'avais fait en utilisant les fichiers de profil mysql -e "show databases"
aurait donné une erreur.
- 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";
Celui-ci ne fonctionnera pas , si nous avons toutes ces tâches dans le même playbook.