有没有办法在出现时将接口的IP地址写入文件?

Is there a way to write the ip-address of an interface to a file when it comes up?

我正在寻找一种方法来触发将主机的 IP 地址写入文件 /etc/environment 一旦联网。

现在,我所有的 IP 都是静态的。我希望将来他们也能成为 DHCP。

例如:当 eth0 启动并为其分配从 10-eth0.network 配置的 IP 时,该 ip 以某种形式写入 /etc/environment

private_ipv4=x.x.x.x
public_ipv4=y.y.y.y

我会考虑其他选项,例如可以 运行 来自可以执行相同操作的 systemd 服务的脚本。我不介意它是否需要配置。例如,告诉它哪个接口和可能的网络前缀被认为是 public 与私有。

根据您的发行版,您可以 dhclient 进行写作。

参见:dhclient(8)dhclient-script(8)dhclient.conf(5)

您可以编写脚本 /etc/dhclient-exit-hooks,测试 BOUND 条件并编写您想要的内容。

我通过这个 link 找到了一个可行的解决方案。 似乎 coreos-cloud-init 将 COREOS_PUBLIC_IPV4 和 COREOS_PRIVATE_IPV4 写入 /etc/environment 如果这些变量在 cloud-init 运行之前的环境中。这个脚本实现了同样的事情,可以简单地复制到 /usr/share/oem/cloud-config.yml

#!/bin/sh

workdir=$(mktemp --directory)
trap "rm --force --recursive ${workdir}" SIGINT SIGTERM EXIT

cat << EOF >"${workdir}/cloud-config.yml"
#cloud-config

coreos:
  etcd:
    discovery: 
    addr: \$public_ipv4:4001
    peer-addr: \$private_ipv4:7001
  units:
    - name: etcd.service
      command: start
    - name: fleet.service
      command: start
EOF

get_ipv4() {
    IFACE=""

    local ip
    while [ -z "${ip}" ]; do
        ip=$(ip -4 -o addr show dev "${IFACE}" scope global | gawk '{split (, out, "/"); print out[1]}')
        sleep .1
    done

    echo "${ip}"
}

export COREOS_PUBLIC_IPV4=$(get_ipv4 eth0)
export COREOS_PRIVATE_IPV4=$(get_ipv4 eth1)

coreos-cloudinit --from-file="${workdir}/cloud-config.yml"