В статье объясняется использование переменных окружения (Environment) в блоках служб systemd.
Директива Environment
В systemd есть директива Environment, которая устанавливает переменные окружения для выполняемых процессов.
- Директива принимает список назначений переменных, разделенных пробелами.
- Этот параметр может быть указан более одного раза, в этом случае будут установлены все перечисленные переменные.
Если одна и та же переменная задана дважды, более поздняя установка отменяет более раннюю. Если этой опции присвоена пустая строка, список переменных окружения обнуляется, все предыдущие назначения не имеют эффекта.
Для примера, настроим демон etcd2 на использование шифрования. Просто создайте /etc/systemd/system/etcd2.service.d/30-certificates.conf для etcd2.service:
1 2 3 4 5 6 7 8 9 | [Service] # Client Env Vars Environment=ETCD_CA_FILE=/path/to/CA.pem Environment=ETCD_CERT_FILE=/path/to/server.crt Environment=ETCD_KEY_FILE=/path/to/server.key # Параметры среды Environment=ETCD_PEER_CA_FILE=/path/to/CA.pem Environment=ETCD_PEER_CERT_FILE=/path/to/peers.crt Environment=ETCD_PEER_KEY_FILE=/path/to/peers.key |
Затем выполним команды ниже, чтобы применить новое окружения к демону etcd2:
1 2 | sudo systemctl daemon-reload sudo systemctl restart etcd2.service |
Директива EnvironmentFile
EnvironmentFile аналогична директиве Environment, но считывает переменные окружения из текстового файла. Текстовый файл должен содержать назначения переменных, разделенных новыми строками.
Этот файл окружения может быть включен другими службами для внесения динамической конфигурации. Вот пример файла окружения при запуске на DigitalOcean (IP-адреса были удалены):
1 2 3 4 5 | COREOS_DIGITALOCEAN_IPV4_ANCHOR_0=X.X.X.X COREOS_DIGITALOCEAN_IPV4_PRIVATE_0=X.X.X.X COREOS_DIGITALOCEAN_HOSTNAME=test.example.com COREOS_DIGITALOCEAN_IPV4_PUBLIC_0=X.X.X.X COREOS_DIGITALOCEAN_IPV6_PUBLIC_0=X:X:X:X:X:X:X:X:X:X:X |
Этот файл окружения может быть использован и его переменные могут быть использованы. Вот пример drop-in для etcd-member.service, который запускает coreos-metadata.service и затем использует сгенерированные результаты:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [Unit]. Requires=coreos-metadata.service After=coreos-metadata.service [Service] EnvironmentFile=/run/metadata/coreos ExecStart= ExecStart=/usr/bin/etcd2 \ --advertise-client-urls=http://${COREOS_DIGITALOCEAN_IPV4_PUBLIC_0}:2379 \79 --initial-advertise-peer-urls=http://${COREOS_DIGITALOCEAN_IPV4_PRIVATE_0}:2380 \80 --listen-client-urls=http://0.0.0.0:2379 \ --listen-peer-urls=http://${COREOS_DIGITALOCEAN_IPV4_PRIVATE_0}:2380 \ --initial-cluster=%m=http://${COREOS_DIGITALOCEAN_IPV4_PRIVATE_0}:2380 |
Другие примеры
Использование IP-адресов хостов и EnvironmentFile
Можно записать IP-адреса хостов в файл /etc/network-environment и хатем запускать свои контейнеры Docker следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [Unit] Description=Nginx service Requires=etcd2.service After=etcd2.service [Service] # Получение переменных сетевого окружения EnvironmentFile=/etc/network-environment ExecStartPre=-/usr/bin/docker kill nginx ExecStartPre=-/usr/bin/docker rm nginx ExecStartPre=/usr/bin/docker pull nginx ExecStartPre=/usr/bin/etcdctl set /services/nginx '{"host": "%H", "ipv4_addr": ${DEFAULT_IPV4}, "port": 80}' ExecStart=/usr/bin/docker run --rm --name nginx -p ${DEFAULT_IPV4}:80:80 nginx ExecStop=/usr/bin/docker stop nginx ExecStopPost=/usr/bin/etcdctl rm /services/nginx |
Этот блок-файл запустит Docker-контейнер nginx и привяжет его к определенному IP-адресу и порту.