использовать общесистемную переменную среды при запуске службы с ansible - PullRequest
0 голосов
/ 03 июня 2019

Я хотел бы использовать ansible для развертывания конфигурации, которая на последнем этапе (пере) запускает службу.Этому сервису нужны переменные окружения, которые определены на моем хост-компьютере (тот, в котором хранится книга воспроизведения).Чтобы передать эти env var на мою целевую машину, я попытался добавить аргументы environment к директиве ansible service, выполнив следующее:

  - name: start service
    service:
      name: my_service
      state: restarted
    environment:
      OAUTH2_AUTHORIZE_URL: "{{ lookup('env','OAUTH2_AUTHORIZE_URL') }}"
      OAUTH2_TOKEN_URL: "{{ lookup('env','OAUTH2_TOKEN_URL') }}"
      CLIENT_SECRET: "{{ lookup('env','CLIENT_SECRET') }}"

Однако это не дает результата в том смысле, что эти переменныенеизвестно, когда служба запущена.Единственный способ найти решение этой проблемы - это изменить мою игровую книгу, выполнив следующие действия:

  - name: set some env vars systemctl
    shell: |
      systemctl import-environment OAUTH2_AUTHORIZE_URL OAUTH2_TOKEN_URL CLIENT_SECRET
    args:
      executable: /bin/bash
    environment:
      OAUTH2_AUTHORIZE_URL: "{{ lookup('env','OAUTH2_AUTHORIZE_URL') }}"
      OAUTH2_TOKEN_URL: "{{ lookup('env','OAUTH2_TOKEN_URL') }}"
      CLIENT_SECRET: "{{ lookup('env','CLIENT_SECRET') }}"

  - name: start my service
    service:
      name: my_service
      state: restarted

- это правильный способ продолжить?

NB: будучи совершенно новым с ansible, я не играл с role вещами, из-за которых я хотел бы остаться в данный момент.

Файл конфигурации Systemctl:

[Unit]
Description=my_service
After=syslog.target network.target

[Service]
Environment="PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
ExecStart=/bin/bash /root/start_myservice.sh

[Install]
WantedBy=multi-user.target

Служба для запуска:

#/bin/bash

echo "${CLIENT_SECRET}"
echo "${OAUTH2_AUTHORIZE_URL}"
echo "${OAUTH2_TOKEN_URL}"

1 Ответ

1 голос
/ 03 июня 2019

В системном сервисном модуле вы можете использовать директиву EnvironmentFile для передачи переменных среды более удобным способом, чем с Environment.Он также позволяет при необходимости разделять переменные между службами.

Вы можете использовать ansible для установки файла, содержащего переменные среды, простым copy или с помощью template, например, в /etc/<service>/environment.

Таким образом, вам не нужно устанавливать эти переменные при каждом развертывании.Только один раз, когда вы настраиваете сервис в первый раз, и когда эти настройки необходимо изменить.

Кроме того, насколько я понимаю, использование import-environment означает, что systemd передаст импортируемые вами переменные всем модулям, чтоможет быть не то, что вы хотите.Специально для CLIENT_SECRET один.

...