что-то вроде простой команды оболочки, например:
EXPORT LC_ALL=C
попробовал команду оболочки и получил ошибку попробовал использовать модуль среды, и ничего не случилось.
что мне не хватает
что-то вроде простой команды оболочки, например:
EXPORT LC_ALL=C
попробовал команду оболочки и получил ошибку попробовал использовать модуль среды, и ничего не случилось.
что мне не хватает
Существует несколько способов сделать это, а также из вашего вопроса или понять, что вам нужно.
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
также будет возможно на уровне воспроизведения, а не только на уровне задач, как указано выше.
В настоящее время для этой функции в Ansible GitHub открыт запрос на растяжение: https://github.com/ansible/ansible/pull/8651
UPDATE: теперь он сливается с 2 января 2015 года.
2. Если вы хотите, чтобы постоянная переменная среды + ширина системы/только для определенного пользователя
Вы должны посмотреть, как вы это делаете в своем дистрибутиве/оболочке Linux, для этого есть несколько мест. Например, в Ubuntu вы определяете это в файлах, например, например:
~/.profile
/etc/environment
/etc/profile.d
Вы найдете здесь документы Ubuntu: https://help.ubuntu.com/community/EnvironmentVariables
В конце концов для установки переменной среды в ex. Ubuntu вы можете просто использовать модуль lineinfile
от Ansible и добавить нужную строку в определенный файл. Обратитесь к документации по ОС, чтобы узнать, где его добавить, чтобы сделать ее постоянной.
У меня не было достаточно репутации, чтобы комментировать, и поэтому я добавляю новый ответ.
Гасек ответ вполне правильный. Одно дело, если вы обновляете файл .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";
Это не сработает, если у нас есть все эти задачи в одной книге.
Для постоянной установки переменных среды вы можете использовать одну из существующих ролей в Ansible Galaxy. Я рекомендую franklinkim.environment.
Использование ansible-galaxy:
$ ansible-galaxy install franklinkim.environment
Используя require.yml:
- src: franklinkim.environment
Тогда в вашей пьесе:
- hosts: all
sudo: yes
roles:
- role: franklinkim.environment
environment_config:
NODE_ENV: staging
DATABASE_NAME: staging
Вот быстрая локальная задача для установки ключа/значений в /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
показывает новые переменные окружения.
Это лучший вариант. Как сказал Михал Гасек (первый ответ), поскольку запрос на объединение был объединен (https://github.com/ansible/ansible/pull/8651), мы можем легко устанавливать постоянные переменные среды по уровню воспроизведения.
- hosts: all
roles:
- php
- nginx
environment:
MY_ENV_VARIABLE: whatever_value