Comment définir des variables d'environnement Linux avec Ansible

96

Salut, j'essaie de savoir comment définir la variable d'environnement avec Ansible.

quelque chose qu'une simple commande shell comme celle-ci:

EXPORT LC_ALL=C

essayé en tant que commande shell et obtenu une erreur essayé en utilisant le module d'environnement et rien ne s'est passé.

Qu'est-ce que je rate

Gleeb
la source
1
Avez-vous besoin de le définir dans un compte particulier ($ HOME / .profile, par défaut (/ etc / profile) ou simplement de le rendre disponible avant d'installer ou d'exécuter une application?
BMW
Je dois le configurer pour pouvoir utiliser la console mongodb. Après avoir soulevé la machine, je ne peux pas accéder à la console sans exporter cette variable
Gleeb
ok, vous parlez du module mongodb dans ansible, alors pourquoi ne pas le mettre directement lorsque vous préparez ce module (installer, définir le fichier de configuration ou démarrer son service)?
BMW
1
Comment la définition d'une variable d'environnement a-t-elle quelque chose à voir avec le module mongodb. Et je ne l'ai pas du tout utilisé. Tout ce que je veux, c'est installer mongo set the env var et démarrer le service
Gleeb
donc vous n'aviez pas ce module mongodb prêt? alors vous devez d'abord passer du temps dessus, puis votre problème n'est pas un problème.
BMW

Réponses:

157

Il y a plusieurs façons de le faire et d'après votre question, ce dont vous avez besoin n'est pas clair.

1. Si vous avez besoin que la variable d'environnement soit définie UNIQUEMENT PAR TÂCHE, 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 qu'il MY_ENV_VARIABLEest disponible UNIQUEMENT pour la première tâche, environmentne 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 l'utilisation environmentsera également possible au niveau du jeu , pas seulement au niveau des tâches comme ci-dessus. Une pull request est actuellement ouverte pour cette fonctionnalité sur le GitHub d'Ansible: https://github.com/ansible/ansible/pull/8651

MISE À JOUR: Il a maintenant fusionné le 2 janvier 2015.

2. Si vous voulez une variable d'environnement permanente + à l'échelle du 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 annuaire
  • ...

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 le lineinfilemodule d'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.

Michal Gasek
la source
6
La deuxième option est ce dont j'avais besoin. J'ai atteint la solution moi-même, mais c'est celle-là.
Gleeb
2
Mise à jour rapide: la demande d'extraction n ° 8651 pour Ansible a été fusionnée, il est donc maintenant possible de le faire également au niveau du jeu.
Michal Gasek
8
Il n'y a donc aucun moyen de définir des variables d'environnement persistantes via Ansible?
garbagecollector
1
@DumpHole J'ai utilisé le rôle "franklinkim.environment" d'Ansible Galaxy pour cela.
Ates Goral
1
Que faire si vous souhaitez définir une variable d'environnement pour le shell bash actuel uniquement? par exemple, un mot de passe déchiffré peut être utilisé de cette manière.
openCivilisation
28

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_profilefichier ou le /etc/profile, ces modifications ne seront 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, pensez à ajouter ces variables d'environnement dans le .bashrcfichier.
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 à partir d'un .bashrcfichier au lieu du .bash_profileou du /etc/profile.

Par exemple, si j'ai mis à jour ma variable de chemin pour inclure le binaire personnalisé dans le .bash_profilefichier de l'utilisateur respectif, puis que j'ai fait une source du fichier. Les prochaines tâches suivantes ne reconnaîtront pas ma commande. Cependant, si vous mettez à jour dans le .bashrcfichier, 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 si je l'avais fait en utilisant des fichiers de profil, mysql -e "show databases"cela 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 jeux.

Gaurav Parashar
la source
2
Si le shell par défaut est sh, la source peut ne pas fonctionner. Au lieu de source filefaire. file
Cloverr
12

Voici une tâche locale rapide sur laquelle définir de manière permanente les clés / valeurs /etc/environment(à 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 rentrez, envaffiche les nouvelles variables d'environnement.

JL Peyret
la source
desta été remplacé par path, mais selon la documentation devrait toujours fonctionner. Si ce n'est pas le cas, passez à path.
guessimtoolate
9

Pour définir de manière persistante les variables d'environnement, vous pouvez utiliser l'un des rôles existants sur Ansible Galaxy. Je recommande weareinteractive.environment .

Utilisation d'ansible-galaxy:

$ ansible-galaxy install weareinteractive.environment

Utilisation de requirements.yml:

- src: franklinkim.environment

Puis dans votre playbook:

- hosts: all
  sudo: yes
  roles:
    - role: franklinkim.environment
      environment_config:
        NODE_ENV: staging
        DATABASE_NAME: staging
Ates Goral
la source
@openCivilisation Mis à jour!
Ates Goral
Remarque: weareinteractive.environment écrit dans / etc / environment
simohe
5

C'est la meilleure solution. Comme l'a dit Michal Gasek (première réponse), depuis la fusion de la pull request ( https://github.com/ansible/ansible/pull/8651 ), nous sommes en mesure de définir facilement des variables d'environnement permanentes par niveau de jeu.

- hosts: all
  roles:
     - php
     - nginx
  environment:
    MY_ENV_VARIABLE: whatever_value
lauralacarra
la source
2
L'environnement est-il exécuté avant le rôle? Parce que ma recherche est toujours vide.
EvgenyKolyakov
Même ma recherche est vide quel que soit l'ordre
AhmFM
La seule mise en garde à ce sujet est que les environnements au niveau du playbook seront résolus avant l'exécution du playbook. Ce sera utile si vous connaissez toutes les valeurs à l'avance, mais si vous souhaitez ajouter une valeur de manière dynamique, je suggère de suivre la réponse de JL Peyret
Bubzsan