如果 /etc/network/interfaces 发生变化,则更新接口的脚本

如果 /etc/network/interfaces 发生变化,则更新接口的脚本

[这适用于 Debian Squeeze,但适用于 Ubuntu 和其他 Linux 发行版。]

我有一个相当复杂的 /etc/network/interfaces 文件,它是根据各种因素(接口数量、是否需要桥接、vlan 等)生成的。生成新文件后,我需要 ifup 所有新接口并 ifdown 所有过时接口;如果主接口发生变化(例如,从 eth0 或 br0 变化),我可能必须重新启动。

现在我弄清楚了如何手动进行 ifup/ifdown。

是否有一个脚本可以帮我完成这个任务?

答案1

我不知道您目前如何修改/生成您的/etc/network/interfaces。最好的解决方案可能是使用配置管理工具(例如 Puppet、Chef 或 Cfengine)来执行此任务,并ifup在文件被修改时调用它。此类工具是为此类任务量身定制的。您甚至可以从 Puppet 的模板功能或 Augeas 提供程序中受益,以修改您的文件。

另一个解决方案是使用 inotify。例如,您可以设置为每次修改时incron调用。ifup/etc/network/interfaces

答案2

我不知道这个用例有任何现成的脚本,但为这个任务编写一个简单的 shell 脚本应该不太难。

答案3

files/这就是我使用 puppet 管理 ifcfg 文件的方法。我为每个主机创建一个目录,例如:

modules/network/files/foohostname/
modules/network/files/someotherhostname/

然后modules/network/manifests/init.pp我执行以下操作:

  1. 将所有文件复制modules/network/files/hostname/到主机上的网络脚本目录中。
  2. 运行service network start/etc/init.d/network start在添加/更改任何文件时运行。我发现这service network start会调出任何尚未启动的接口,但不会终止我现有的网络连接。
class network {
  # copy all ifcfg files from files/hostname/ directory to network-scripts/ 
  # other files in network-scripts/ will not be touched.
  file { '/etc/sysconfig/network-scripts/':
      recurse => true,
      purge   => false,
      owner   => root,
      group   => root,
      ignore  => '\.svn', # this is specific to me as I use svn.
      source  => "puppet:///modules/network/${hostname}/",
  }

  # if anything changes with the above File resource, then fire network start to bring them up.
  # this won't restart the network, only bring up any ifaces that are not up yet.
  exec{ 'network-ifup':
      command     => 'service network start',       
      refreshonly => true,
      subscribe   => File['/etc/sysconfig/network-scripts/'],
  }        
}

仅供参考,以上内容可能与 CentOS/RHEL 特定有关。

相关内容