GNU/Linux >> Tutoriels Linux >  >> Linux

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

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.

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 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.

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 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.


Linux
  1. Comment utiliser Ansible pour configurer la surveillance du système avec Prometheus

  2. Comment définir et supprimer des variables d'environnement locales, utilisateur et système sous Linux

  3. Comment définir, répertorier et supprimer des variables d'environnement sous Linux

  4. Variables d'environnement utilisateur avec "su" et "sudo" sous Linux

  5. Comment imprimer des variables d'environnement apparemment cachées ?

Comment définir et répertorier les variables d'environnement sous Linux

Comment définir/annuler les variables d'environnement sous Linux

Comment configurer un pare-feu avec GUFW sous Linux

Comment définir et supprimer des variables d'environnement sous Linux

Variables d'environnement Linux

Comment installer et configurer WordPress avec Ansible