Почему мой системный модуль неправильно читает переменные env?

Я пытаюсь запустить kubernetes на coreos. Я использую флот, setup-network-environment и kube-register для регистрации узлов. Тем не менее, в моем файле cloud-init, куда я записываю свои файлы модулей systemd, файл модулей kubelet не будет работать должным образом:

 ExecStart=/opt/bin/kubelet  \
 --address=0.0.0.0 --port=10250 \
 --hostname_override=${DEFAULT_IPV4} \
 --allow_privileged=true \
 --logtostderr=true \
 --healthz_bind_address=0.0.0.0

Вместо моего публичного IP, ${DEFAULT_IPV4} результаты в $default_ipv4, что также не приводит к IP. я знаю --host-name-override должен просто взять строку, и это работает, когда я запускаю эту строку из командной строки. Есть другие файлы модуля, где ${ENV_VAR} работает отлично. Почему для файла модуля kubelet он просто ломается?

РЕДАКТИРОВАТЬ 1

/ И т.д. / сеть и окружающая среда

LO_IPV4=127.0.0.1
ENS33_IPV4=192.168.195.242
DEFAULT_IPV4=192.168.195.242
ENS34_IPV4=172.22.22.238

РЕДАКТИРОВАТЬ 2

файл блока kubelet

- name: kube-kubelet.service
  command: start
  content: |
    [Unit]
    Description=Kubernetes Kubelet
    Documentation=https://github.com/GoogleCloudPlatform/kubernetes
    Requires=setup-network-environment.service
    After=setup-network-environment.service
    [Service]
    EnvironmentFile=/etc/network-environment
    ExecStartPre=/usr/bin/curl -L -o /opt/bin/kubelet -z /opt/bin/kubelet https://storage.googleapis.com/kubernetes-release/release/v0.18.2/bin/linux/amd64/kubelet
    ExecStartPre=/usr/bin/chmod +x /opt/bin/kubelet
    # wait for kubernetes master to be up and ready
    ExecStartPre=/opt/bin/wupiao 172.22.22.10 8080
    ExecStart=/opt/bin/kubelet \
    --address=0.0.0.0 \
    --port=10250 \
    --hostname_override=172.22.22.21 \
    --api_servers=172.22.22.10:8080 \
    --allow_privileged=true \
    --logtostderr=true \
    --healthz_bind_address=0.0.0.0 \
    --healthz_port=10248
    Restart=always
    RestartSec=10

2 ответа

Решение

Казалось бы, проблема была в версии coreos в бродячей коробке. После обновления vagrant box переменная окружения смогла найти правильное значение.

Команда Exec*= не является командой оболочки. В моих экспериментах было не очень хорошо понять, где находится переменная, если она не была сама по себе. Я пошел и посмотрел некоторые примеры в Интернете, и они всегда показывают переменную среды самостоятельно. Итак, с учетом файла вроде /tmp/myfile:

ENV=1.2.3.4

Эти определения [Service] не будут делать то, что вы думаете:

EnvironmentFile=/tmp/myfile
ExecStart=echo M$ENV
ExecStart=echo $ENV:8080

но это будет работать на отдельной строке:

EnvironmentFile=/tmp/myfile
ExecStart=echo $ENV

Это не сильно помогает при попытке передать аргумент, например:

EnvironmentFile=/tmp/myfile
ExecStart=echo --myarg=http://$ENV:8080/v2

Для передачи аргумента мне пришлось поместить весь myarg в строку в /tmp/myfile:

ENV="--myarg=http://1.2.3.4:8080/v2"

Наконец я мог бы передать свой аргумент:

EnvironmentFile=/tmp/myfile
ExecStart=echo $ENV
Другие вопросы по тегам