为什么我的systemd单元没有正确读取env变量?

时间:2015-06-17 18:29:09

标签: environment-variables coreos systemd kubernetes fleet

我正在尝试在coreos上运行kubernetes。我正在使用fleet,setup-network-environment和kube-register来注册节点。但是,在我编写系统单元文件的cloud-init文件中,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

的/ etc /网络的环境

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 个答案:

答案 0 :(得分:2)

Exec * =命令不是shell命令。在我的实验中,它不是很好地确定变量的位置,除非它本身。我去看了一些在线的例子,他们总是自己显示环境变量。所以,给定像/ tmp / myfile这样的文件:

ENV=1.2.3.4

这些[服务]定义不符合您的想法:

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

答案 1 :(得分:1)

似乎问题出现在流浪盒中的coreos版本中。更新了vagrant box之后,环境变量能够解析为正确的值。