web-dev-qa-db-fra.com

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

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

79
Gleeb

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

128
Michal Gasek

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.

25
gaurav parashar

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
10
Ates Goral

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.

5
JL Peyret

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
2
lauralacarra