Jak ustawić zmienne środowiskowe Linuksa za pomocą Ansible

101

Cześć, próbuję dowiedzieć się, jak ustawić zmienną środowiskową za pomocą Ansible.

coś, co proste polecenie powłoki, takie jak:

EXPORT LC_ALL=C

próbowano jako polecenie powłoki i otrzymałem błąd. Próbowano użyć modułu środowiska i nic się nie stało.

czego mi brakuje

Gleeb
źródło
1
Czy potrzebujesz go ustawić na konkretnym koncie ($ HOME / .profile, default (/ etc / profile), czy po prostu udostępnić go przed zainstalowaniem lub uruchomieniem aplikacji?
BMW
Muszę to ustawić, aby móc używać konsoli Mongodb. Po podniesieniu maszyny nie mogę wejść do konsoli bez wyeksportowania tej zmiennej
Gleeb
ok, mówisz o module mongodb w ansible, więc dlaczego nie wstawić go bezpośrednio przy przygotowywaniu tego modułu (instalacji, ustawieniu pliku konfiguracyjnego lub uruchomieniu jego usługi)?
BMW
1
W jaki sposób ustawienie zmiennej środowiskowej ma cokolwiek wspólnego z modułem mongodb. I wcale go nie używałem. Chcę tylko zainstalować mongo, ustawić zmienną env i uruchomić usługę aervice
Gleeb
więc nie masz gotowego modułu mongodb? wtedy musisz najpierw poświęcić na to trochę czasu, wtedy twój problem nie jest problemem.
BMW

Odpowiedzi:

163

Można to zrobić na wiele sposobów, az Twojego pytania nie wynika, czego potrzebujesz.

1. Jeśli potrzebujesz zdefiniować zmienną środowiskową TYLKO DLA ZADANIA, wykonaj następujące czynności:

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

Zauważ, że MY_ENV_VARIABLEjest dostępne TYLKO dla pierwszego zadania, environmentnie ustawia go na stałe w systemie.

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": ""}

Miejmy nadzieję, że wkrótce korzystanie z niego environmentbędzie również możliwe na poziomie gry , a nie tylko na poziomie zadań, jak powyżej. Obecnie otwarte jest żądanie ściągnięcia tej funkcji w serwisie GitHub firmy Ansible: https://github.com/ansible/ansible/pull/8651

AKTUALIZACJA: teraz została scalona od 2 stycznia 2015 r.

2. Jeśli chcesz mieć stałą zmienną środowiskową + systemową / tylko dla określonego użytkownika

Powinieneś przyjrzeć się, jak to robisz w swojej dystrybucji / powłoce Linuksa, jest na to wiele miejsc. Na przykład w Ubuntu definiujesz to w plikach takich jak na przykład:

  • ~/.profile
  • /etc/environment
  • /etc/profile.d informator
  • ...

Dokumentację Ubuntu na ten temat znajdziesz tutaj: https://help.ubuntu.com/community/EnvironmentVariables

W końcu do ustawienia zmiennej środowiskowej w ex. Ubuntu możesz po prostu użyć lineinfilemodułu Ansible i dodać żądaną linię do określonego pliku. Skonsultuj się z dokumentacją systemu operacyjnego, aby dowiedzieć się, gdzie go dodać, aby był trwały.

Michał Gasek
źródło
6
Druga opcja jest tym, czego potrzebowałem. Sam doszedłem do rozwiązania, ale to jest jedyne.
Gleeb
2
Szybka aktualizacja: żądanie ściągnięcia nr 8651 dla Ansible zostało scalone, więc teraz można to zrobić również na poziomie gry.
Michał Gasek
8
Więc nie ma sposobu, aby ustawić trwałe zmienne środowiskowe za pomocą Ansible?
garbagecollector
1
@DumpHole Użyłem do tego roli „franklinkim.environment” z Ansible Galaxy.
Ates Goral
1
A co jeśli chcesz ustawić zmienne środowisko tylko dla bieżącej powłoki bash? na przykład w ten sposób można użyć odszyfrowanego hasła.
openCivilisation
30

Nie miałem wystarczającej reputacji, aby komentować, dlatego dodaję nową odpowiedź.
Odpowiedź Gaska jest całkiem poprawna. Tylko jedno: jeśli aktualizujesz .bash_profileplik lub plik /etc/profile, te zmiany zostaną odzwierciedlone dopiero po ponownym zalogowaniu. Jeśli chcesz ustawić zmienną env, a następnie użyć jej w kolejnych zadaniach w tym samym playbooku, rozważ dodanie tych zmiennych środowiskowych do .bashrcpliku.
Myślę, że powodem tego jest logowanie i powłoki niezalogowane.
Ansible, wykonując różne zadania, odczytuje parametry z .bashrcpliku zamiast .bash_profilelub /etc/profile.

Na przykład, jeśli zaktualizowałem zmienną ścieżki, aby uwzględnić niestandardowy plik binarny w .bash_profilepliku odpowiedniego użytkownika, a następnie utworzyłem źródło pliku. Następne kolejne zadania nie rozpoznają mojego polecenia. Jeśli jednak zaktualizujesz .bashrcplik, polecenie zadziała.

 - 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";

To zadziałałoby , ale gdybym to zrobił przy użyciu plików profili, mysql -e "show databases"dałoby to błąd.

- 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";

Ten nie zadziała , jeśli mamy wszystkie te zadania w tym samym podręczniku.

gaurav parashar
źródło
2
Jeśli domyślną powłoką jest sh, source może nie działać. Zamiast source filerobić. file
Cloverr
13

Oto szybkie zadanie lokalne, w którym można na stałe ustawić pary klucz / wartości /etc/environment(obejmujące cały system i wszystkich użytkowników):

- name: populate /etc/environment
  lineinfile:
    dest: "/etc/environment"
    state: present
    regexp: "^{{ item.key }}="
    line: "{{ item.key }}={{ item.value}}"
  with_items: "{{ os_environment }}"

i vars dla niego:

os_environment:
  - key: DJANGO_SETTINGS_MODULE 
    value : websec.prod_settings  
  - key: DJANGO_SUPER_USER 
    value : admin

i tak, jeśli wyjdziesz i z powrotem ssh, envpokazuje nowe zmienne środowiskowe.

JL Peyret
źródło
destzostał zastąpiony path, ale zgodnie z dokumentacją powinien nadal działać. Jeśli tak nie jest, przełącz się na path.
guessimtoolate
9

Aby trwale ustawiać zmienne środowiskowe, możesz użyć jednej z istniejących ról w Ansible Galaxy. Polecam myareinteractive.environment .

Korzystanie z ansible-galaxy:

$ ansible-galaxy install weareinteractive.environment

Korzystanie z Requirements.yml:

- src: franklinkim.environment

Następnie w swoim poradniku:

- hosts: all
  sudo: yes
  roles:
    - role: franklinkim.environment
      environment_config:
        NODE_ENV: staging
        DATABASE_NAME: staging
Ates Goral
źródło
@openCivilisation zaktualizowana!
Ates Goral
uwaga: weareinteractive.environment zapisuje w / etc / environment
simohe
5

To najlepsza opcja. Jak powiedział Michał Gasek (pierwsza odpowiedź), ponieważ żądanie ściągnięcia zostało scalone ( https://github.com/ansible/ansible/pull/8651 ), jesteśmy w stanie łatwo ustawić stałe zmienne środowiskowe według poziomu gry.

- hosts: all
  roles:
     - php
     - nginx
  environment:
    MY_ENV_VARIABLE: whatever_value
lauralacarra
źródło
2
Czy środowisko jest uruchamiane przed rolą? Ponieważ moje wyszukiwanie jest nadal puste.
EvgenyKolyakov
Nawet moje wyszukiwanie jest puste niezależnie od kolejności
AhmFM,
Jedynym zastrzeżeniem jest to, że środowiska na poziomie podręcznika zostaną rozwiązane przed uruchomieniem podręcznika. Będzie to przydatne, jeśli znasz wszystkie wartości wcześniej, ale jeśli chcesz dodać wartość dynamicznie, sugeruję podążanie za odpowiedzią JL
Peyreta