Comment définir des variables D'environnement Linux avec Ansible
Salut, j'essaie de savoir comment définir une variable d'environnement avec Ansible.
Quelque chose qu'une simple commande shell comme ceci:
EXPORT LC_ALL=C
Essayé en tant que commande shell et a obtenu une erreur essayé d'utiliser le module d'environnement et rien ne s'est passé.
Qu'est-ce que je manque
4 réponses
Il y a plusieurs façons de le faire et à partir de votre question, il n'est pas clair ce dont vous avez besoin.
1. Si vous avez besoin que la variable d'environnement soit définie uniquement par tâche, faites ceci:
- 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
n'est disponible que pour la première tâche, environment
Ne la 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 l'utilisation de environment
sera également possible sur Niveau de jeu, pas seulement le niveau de tâche comme ci-dessus.
Il y a actuellement une demande d'extraction ouverte pour cette fonctionnalité sur le GitHub D'Ansible: https://github.com/ansible/ansible/pull/8651
Mise à jour: il est maintenant fusionné à partir 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épertoire - ...
Vous trouverez des documents 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
d'Ansible et ajouter la ligne souhaitée à certains fichiers. Consultez vos documents OS pour savoir où l'Ajouter pour le rendre permanent.
Je n'ai 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 changements ne seront reflétés qu'après une nouvelle connexion. Dans le cas, vous définissez la variable env et que vous souhaitez l'utiliser dans les tâches suivantes dans le même système de jeu. Envisagez d'ajouter ces variables d'environnement dans le .bashrc fichier. Je suppose que la raison derrière cela est le login et les shells non-login .Ansible, lors de l'exécution de différentes tâches lit les paramètres d'un .bashrc au lieu du bash_profile ou du/etc / profile.
Par exemple, si j'ai mis à jour ma variable path pour inclure le binaire personnalisé dans le .bash_profile fichier de l'utilisateur en question et ont fait une source du fichier. Les tâches suivantes ne reconnaîtront pas ma commande . Cependant, si vous mettez à jour dans le .bashrc, 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 avais-je fait en utilisant les 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 playbook
Pour définir de manière persistante des variables d'environnement, vous pouvez utiliser l'un des rôles existants sur Ansible Galaxy. Je recommande franklinkim.environnement.
En utilisant Ansible-galaxy:
$ ansible-galaxy install franklinkim.environment
En utilisant les 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 des clés / valeurs sur /etc/environment
(qui est à l'échelle 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 sortez et revenez, env
affiche les nouvelles variables d'environnement.