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

49
demandé sur Michal Gasek 2015-01-01 21:38:40

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

88
répondu Michal Gasek 2015-04-25 22:32:44

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

17
répondu gaurav parashar 2015-06-24 05:51:20

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
6
répondu Ates Goral 2017-02-10 14:46:29

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.

1
répondu JL Peyret 2018-08-17 22:10:52