为什么我的 systemd 单元不能正确读取环境变量?
Why is my systemd unit not reading env variables properly?
我正在尝试 运行 coreos 上的 kubernetes。我正在使用 fleet、setup-network-environment 和 kube-register 来注册节点。但是,在我编写 systemd 单元文件的 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
而不是我的 public ip,${DEFAULT_IPV4}
导致 $default_ipv4
,这也不会导致 ip。我知道 --host-name-override
应该只接受一个字符串,当我从命令行 运行 这一行时它会起作用。还有其他单元文件 ${ENV_VAR}
可以正常工作。为什么 kubelet 的 unit 文件就坏了?
编辑 1
/etc/network-environment
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
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
看来问题出在vagrant box中的coreos版本上。更新 vagrant box 后,环境变量能够解析为正确的值。
我正在尝试 运行 coreos 上的 kubernetes。我正在使用 fleet、setup-network-environment 和 kube-register 来注册节点。但是,在我编写 systemd 单元文件的 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
而不是我的 public ip,${DEFAULT_IPV4}
导致 $default_ipv4
,这也不会导致 ip。我知道 --host-name-override
应该只接受一个字符串,当我从命令行 运行 这一行时它会起作用。还有其他单元文件 ${ENV_VAR}
可以正常工作。为什么 kubelet 的 unit 文件就坏了?
编辑 1
/etc/network-environment
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
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
看来问题出在vagrant box中的coreos版本上。更新 vagrant box 后,环境变量能够解析为正确的值。