Как установить переменные среды Linux с помощью Ansible


98

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

что-то, что простая команда оболочки вроде этого:

EXPORT LC_ALL=C

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

что мне не хватает


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

Мне нужно установить его, чтобы я мог использовать консоль mongodb. После того, как я подниму машину, я не могу войти в консоль, не экспортируя эту переменную
Gleeb 01

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

1
Как установка переменной среды имеет какое-либо отношение к модулю mongodb. И я им вообще не пользовался. Все, что я хочу, это установить mongo, установить env var и запустить aervice
Gleeb,

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

Ответы:


160

Есть несколько способов сделать это, и из вашего вопроса непонятно, что вам нужно.

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

В конце концов, для установки переменной окружения в ex. В Ubuntu вы можете просто использовать lineinfileмодуль из Ansible и добавить нужную строку в определенный файл. Проконсультируйтесь с документацией по вашей ОС, чтобы узнать, где его добавить, чтобы сделать его постоянным.


6
Второй вариант - это то, что мне нужно. Я сам нашел решение, но оно одно.
Gleeb 04

2
Быстрое обновление: запрос на извлечение № 8651 для Ansible был объединен, поэтому теперь это можно делать и на уровне игры.
Михал Гасек

8
Итак, нет возможности установить постоянные переменные среды через Ansible?
сборщик мусора

1
@DumpHole Я использовал для этого роль franklinkim.environment из Ansible Galaxy.
Атес Горал,

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

30

У меня недостаточно репутации для комментариев, поэтому я добавляю новый ответ.
Ответ Гасека вполне правильный. Только одно: если вы обновляете .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 fileделать. file
Cloverr 03

13

Вот быстрая локальная задача для постоянной установки ключей / значений /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.
guessimtoolate

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 Обновлено!
Атес Горал,

примечание: 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

Единственное предостережение по этому поводу заключается в том, что среды на уровне playbook будут разрешены до запуска playbook. Это будет полезно, если вы заранее знаете все значения, но если вы хотите добавить значение динамически, я предлагаю следовать ответу JL Peyret
Bubzsan
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.