Bonjour, j'essaie de savoir comment définir une variable d'environnement avec Ansible.
quelque chose qui ressemble à une simple commande shell:
EXPORT LC_ALL=C
essayé en tant que commande Shell et une erreur s'est produite lors de l'utilisation du module d'environnement et rien ne s'est passé.
qu'est-ce que je rate
Il y a plusieurs façons de le faire et votre question ne dit pas clairement ce dont vous avez besoin.
1. Si vous avez besoin que la variable d'environnement soit définie PAR TÂCHE UNIQUEMENT, procédez comme suit:
_- 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 définit pas de manière 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": ""}
_
Espérons que bientôt, utiliser environment
sera également possible au niveau de jeu , pas seulement au niveau de la tâche comme ci-dessus. Une demande d'extraction est actuellement ouverte pour cette fonctionnalité sur le GitHub de Ansible: https://github.com/ansible/ansible/pull/8651
MISE À JOUR: Il a maintenant été fusionné à compter du 2 janvier 2015.
2. Si vous voulez une variable d'environnement permanente + système/uniquement pour certains utilisateurs
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épertoireVous 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 le module lineinfile
de Ansible et ajouter la ligne souhaitée à certains fichiers. Consultez la documentation de votre système d'exploitation pour savoir où l'ajouter pour le rendre permanent.
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 fichier .bash_profile
ou le /etc/profile
, ces modifications ne seront reflétées qu’après la nouvelle connexion. Dans ce cas, vous définissez la variable env, puis vous souhaitez l'utiliser dans les tâches suivantes du même livre de lecture. Envisagez d'ajouter ces variables d'environnement dans le fichier .bashrc
.
Je suppose que la raison derrière ceci est la connexion et les shells de non-connexion.
Ansible, lors de l’exécution de différentes tâches, lit les paramètres d’un fichier .bashrc
à la place du .bash_profile
ou du /etc/profile
.
Par exemple, si j'ai mis à jour ma variable de chemin pour inclure le fichier binaire personnalisé dans le fichier .bash_profile
de l'utilisateur respectif, puis créer une source du fichier. Les tâches suivantes ne reconnaîtront pas ma commande. Toutefois, si vous mettez à jour dans le fichier .bashrc
, la commande fonctionnera.
- 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 l'avais-je fait en utilisant des fichiers de profil. le 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 livre de jeu.
Pour définir des variables d'environnement de manière permanente, vous pouvez utiliser l'un des rôles existants sur Ansible Galaxy. Je recommande franklinkim.environment .
En utilisant ansible-galaxy:
$ ansible-galaxy install franklinkim.environment
Utilisation d'exigences.yml:
- src: franklinkim.environment
Puis dans votre playbook:
- hosts: all
Sudo: yes
roles:
- role: franklinkim.environment
environment_config:
NODE_ENV: staging
DATABASE_NAME: staging
Voici une tâche locale rapide pour définir les clés/valeurs sur /etc/environment
(qui concerne l'ensemble du système, tous les utilisateurs):
- name: populate /etc/environment
lineinfile:
dest: "/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 faites un va-et-vient, env
affiche les nouvelles variables d'environnement.
C'est la meilleure solution. Comme l'a dit Michal Gasek (première réponse), puisque la demande d'extraction a été fusionnée ( https://github.com/ansible/ansible/pull/8651 ), nous sommes en mesure de définir variables d’environnement permanentes facilement par niveau de jeu.
- hosts: all
roles:
- php
- nginx
environment:
MY_ENV_VARIABLE: whatever_value