Як встановити змінні середовища Linux за допомогою Ansible


95

Привіт, я намагаюся з'ясувати, як встановити змінну середовища за допомогою Ansible.

щось на зразок простої командної оболонки:

EXPORT LC_ALL=C

спробував як команду оболонки і отримав помилку, спробував використовувати модуль середовища, і нічого не сталося.

чого мені не вистачає


1
Вам потрібно встановити його в певному обліковому записі ($ HOME / .profile, за замовчуванням (/ etc / profile) або просто зробити його доступним перед встановленням або запуском програми?
BMW

Мені потрібно встановити його, щоб я міг користуватися консоллю mongodb. Після того, як я піднімаю машину, я не можу зайти в консоль, не експортуючи цю змінну
Гліб

добре, ви говорите про модуль mongodb в ansible, то чому б не поставити його безпосередньо під час підготовки цього модуля (встановити, встановити конфігураційний файл або запустити його службу)?
BMW

1
Як налаштування змінної середовища має якесь відношення до модуля mongodb. І я його взагалі не використовував. Все, що я хочу, це встановити mongo set env var і запустити сервіс
Gleeb

отже, у вас не було готового модуля mongodb? тоді спочатку потрібно витратити час на це, тоді ваша проблема не проблема.
BMW

Відповіді:


157

Для цього існує кілька способів, і з вашого запитання не зрозуміло, що вам потрібно.

1. Якщо вам потрібна змінна середовища, яка визначається ТІЛЬКИ НА ЗАДАННЯ, ви робите це:

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

Зверніть увагу, що MY_ENV_VARIABLEдоступний ТІЛЬКИ для першого завдання, environmentне встановлює його постійно у вашій системі.

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

Сподіваємось, скоро використання environmentстане можливим і на рівні гри , а не лише на рівні завдань, як зазначено вище. Наразі для цієї функції на GitHub Ansible відкрито запит на витяг: https://github.com/ansible/ansible/pull/8651

ОНОВЛЕННЯ: Зараз воно об’єднано станом на 2 січня 2015 року.

2. Якщо ви хочете постійну змінну середовища + загальносистемну / лише для певного користувача

Ви повинні вивчити, як ви це робите у своєму дистрибутиві / оболонці Linux, для цього є кілька місць. Наприклад, в Ubuntu ви визначаєте це у файлах, як наприклад:

  • ~/.profile
  • /etc/environment
  • /etc/profile.d каталог
  • ...

Документи Ubuntu про це ви знайдете тут: https://help.ubuntu.com/community/EnvironmentVariables

Адже для встановлення змінної середовища в напр. Ubuntu ви можете просто використовувати lineinfileмодуль з Ansible і додати потрібний рядок до певного файлу. Зверніться до документів з ОС, щоб знати, куди його додати, щоб зробити його постійним.


6
Другий варіант - це те, що мені потрібно. Я сам дійшов рішення, але це єдине.
Гліб

2
Швидке оновлення: Запит на витяг # 8651 для Ansible був об’єднаний, тому тепер це можливо зробити і на рівні гри.
Michal Gasek

8
Тож немає можливості встановити постійні змінні середовища через Ansible?
сміттєзбірник

1
@DumpHole Я використав для цього роль "franklinkim.environment" від Ansible Galaxy.
Ates Goral

1
Що робити, якщо ви хочете встановити змінне середовище лише для поточної оболонки bash? наприклад, таким чином можна використовувати розшифрований пароль.
openCivilisation

28

У мене не було достатньо репутації, щоб коментувати, і тому я додаю нову відповідь.
Відповідь Гашека цілком вірна. Тільки одне: якщо ви оновлюєте .bash_profileфайл або файл /etc/profile, ці зміни відображатимуться лише після нового входу. Якщо ви хочете встановити змінну env, а потім використовувати її для подальших завдань у тій самій книзі, розгляньте можливість додавання цих змінних середовища у .bashrcфайл.
Я думаю, причиною цього є логін і невхідні оболонки.
Анзібль, при виконанні різних завдань, зчитує параметри з .bashrcфайлу замість .bash_profileабо /etc/profile.

Як приклад, якщо я оновив змінну шляху, щоб включити власний двійковий .bash_profileфайл у файл відповідного користувача, а потім зробив джерело файлу. Наступні наступні завдання не розпізнають мою команду. Однак якщо ви оновите .bashrcфайл, команда буде працювати.

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

Це могло б спрацювати , але якби я це зробив із використанням файлів профілю, це mysql -e "show databases"дало б помилку.

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

Це не спрацює , якщо ми маємо всі ці завдання в одній книзі ігор.


2
Якщо типовою оболонкою є sh, джерело може не працювати. Замість source filedo. file
Cloverr

12

Ось коротке локальне завдання для постійного встановлення ключів / значень /etc/environment(яке є загальносистемним для всіх користувачів):

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

та варіації для цього:

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

і так, якщо ви ssh і назад, envпоказує нові змінні середовища.


destбуло замінено на path, але згідно з документами все одно має працювати. Якщо ні, перейдіть на path.
здогадайся про

9

Для постійного встановлення змінних середовища ви можете використовувати одну з існуючих ролей у Ansible Galaxy. Я рекомендую weareinteractive.environment .

Використання ansible-galaxy:

$ ansible-galaxy install weareinteractive.environment

Використовуючи requirements.yml:

- src: franklinkim.environment

Тоді у вашій книзі ігор:

- hosts: all
  sudo: yes
  roles:
    - role: franklinkim.environment
      environment_config:
        NODE_ENV: staging
        DATABASE_NAME: staging

@openCivilisation оновлено!
Ates Goral

примітка: weareinteractive.environment пише в / etc / environment
simohe

5

Це найкращий варіант. Як сказав Міхал Гашек (перша відповідь), оскільки запит на витягування було об’єднано ( https://github.com/ansible/ansible/pull/8651 ), ми можемо легко встановлювати постійні змінні середовища за рівнем гри.

- hosts: all
  roles:
     - php
     - nginx
  environment:
    MY_ENV_VARIABLE: whatever_value

2
Чи виконується середовище до ролі? Тому що мій пошук все ще порожній.
Євген Коляков

Навіть мій пошук порожній незалежно від замовлення
AhmFM

Єдине застереження щодо цього полягає в тому, що середовище на рівні ігрової книги буде вирішено до запуску плейбука. Це буде корисно, якщо ви заздалегідь знаєте всі значення, але якщо ви хочете додати значення динамічно, я пропоную слідувати відповіді JL
Peyret
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.