更新服务器上的所有 IP 地址实例
Update all instances of IP address on a server
我们目前有一个动态提供的 IP 地址,正在切换到静态 IP 地址。因此,我需要更改 3 LAMP 服务器上的 IP 地址。这些服务器还 运行 bind9 用于 DNS 和 postfix/dovecot 用于电子邮件。 (MySQL 实际上 运行 宁作为 Percona DB 集群,这可能是无关紧要的。)
我认为我有一个很好的策略,但想与其他可能已经成功完成此操作的人一起检查我的逻辑。
概念是一次停止每台机器上的所有网络、数据库和邮件服务,将流量推送到剩下的两台服务器之一,运行以下脚本替换旧 IP地址与新的 IP 地址,然后重新启动服务器并尝试将流量推送回它,如果一切顺利,则继续使用集群中的下一台服务器。
我使用 grep -r 在系统中查找旧 IP 地址的实例,需要确保我没有遗漏任何需要考虑的重要内容。
find /etc/bind -type f -print0 | xargs -0 sed -i 's/old.ip.address/new.ip.address/g'
find /etc/postfix -type f -print0 | xargs -0 sed -i 's/old.ip.address/new.ip.address/g'
find /etc/apache2 -type f -print0 | xargs -0 sed -i 's/old.ip.address/new.ip.address/g'
find /etc/postfix -type f -print0 | xargs -0 sed -i 's/old-ip-address/new-ip-address/g'
find /etc/bind -type f -print0 | xargs -0 sed -i 's/rev.address.ip.old/rev.address.ip.new/g'
作为澄清点,grep -r 在 /etc/bind/zones 表、/etc/postfix 配置文件和 /etc/apache2 配置文件中找到了 IP 地址引用。在后缀配置文件中也发现了用连字符分隔的 IP 地址。反向 IP 地址也在 /etc/bind/named.conf.local 文件中找到,也需要替换。
任何人都可以看看我是否遗漏了什么?我是在生产环境中这样做的……当然不是最理想的情况。
虽然使用 find
管道连接到 xargs
的想法听起来很合理,但我会根据我 15 年的经验告诉你这是个坏主意。我建议:
- 在重要的方框上标出那些服务 运行(您的查找命令在这里非常有效)
- 确定那些对定义地址的每个服务都很重要的文件
- 备份这些文件(cp 到 .orig 效果很好)
- 创建包含您的新地址的新文件
这样您就可以快速过渡:
cp somefile.new somefile
和快速退出:
cp somefile.orig somefile
此外,我希望区域文件包含实际的 DNS 条目,因此可以更改它们,但您可能需要重新加载命名以使这些更改生效。后缀也是如此,您也需要重新加载后缀。
编辑(我没有花时间实际加载这个区域,但它看起来相当正确):
$ORIGIN example.com.
$TTL 12H @ IN SOA ns1.example.com. hostmaster@example.com. (
2015062660 ;
30M ;refresh
2M ;retry
2W ;expire
1D ;minimum TTL
)
IN NS ns1.example.com.
IN NS ns2.example.com.
IN A 99.101.XXX.X
example.com. IN MX 10 mail.example.com.
mail IN A 99.101.XXX.X
IN TXT "v=spf1 a mx ip4:99.101.XXX.X ~all
ns1 IN A 99.101.XXX.X
ns2 IN A 99.101.XXX.X
www IN CNAME example.com.
dev IN CNAME example.com.
demo IN CNAME example.com.
webconf IN CNAME example.com.
stats IN CNAME example.com.
编辑:
glue records
对不起大家。看起来我在找到解决方案后让它变得陈旧。为了后代的缘故,这似乎是在这一点上工作:
$ORIGIN example.com.
$TTL 12H
; @ symbol represents example.com.
@ 12H IN SOA ns1.example.com. hostmaster@example.com. (
2015062954 ;serial
30M ;refresh
2M ;retry
2W ;expire
1D ;minimum TTL
)
NS ns1.example.com.
NS ns2.example.com.
MX 10 mail.example.com.
IN A 99.101.XXX.XXX
IN TXT "v=spf1 a mx ip4:99.101.XXX.XXX ~all"
IN SPF "v=spf1 a mx ip4:99.101.XXX.XXX -all"
ns1 IN A 99.101.XXX.XXX
ns2 IN A 99.101.XXX.XXX
mail IN A 99.101.XXX.XXX
IN TXT "v=spf1 a mx ip4:99.101.XXX.XXX ~all"
IN SPF "v=spf1 a mx ip4:99.101.XXX.XXX -all"
www IN A 99.101.XXX.XXX
dev IN A 99.101.XXX.XXX
demo IN A 99.101.XXX.XXX
webconf IN A 99.101.XXX.XXX
stats IN A 99.101.XXX.XXX
我们目前有一个动态提供的 IP 地址,正在切换到静态 IP 地址。因此,我需要更改 3 LAMP 服务器上的 IP 地址。这些服务器还 运行 bind9 用于 DNS 和 postfix/dovecot 用于电子邮件。 (MySQL 实际上 运行 宁作为 Percona DB 集群,这可能是无关紧要的。)
我认为我有一个很好的策略,但想与其他可能已经成功完成此操作的人一起检查我的逻辑。
概念是一次停止每台机器上的所有网络、数据库和邮件服务,将流量推送到剩下的两台服务器之一,运行以下脚本替换旧 IP地址与新的 IP 地址,然后重新启动服务器并尝试将流量推送回它,如果一切顺利,则继续使用集群中的下一台服务器。
我使用 grep -r 在系统中查找旧 IP 地址的实例,需要确保我没有遗漏任何需要考虑的重要内容。
find /etc/bind -type f -print0 | xargs -0 sed -i 's/old.ip.address/new.ip.address/g'
find /etc/postfix -type f -print0 | xargs -0 sed -i 's/old.ip.address/new.ip.address/g'
find /etc/apache2 -type f -print0 | xargs -0 sed -i 's/old.ip.address/new.ip.address/g'
find /etc/postfix -type f -print0 | xargs -0 sed -i 's/old-ip-address/new-ip-address/g'
find /etc/bind -type f -print0 | xargs -0 sed -i 's/rev.address.ip.old/rev.address.ip.new/g'
作为澄清点,grep -r 在 /etc/bind/zones 表、/etc/postfix 配置文件和 /etc/apache2 配置文件中找到了 IP 地址引用。在后缀配置文件中也发现了用连字符分隔的 IP 地址。反向 IP 地址也在 /etc/bind/named.conf.local 文件中找到,也需要替换。
任何人都可以看看我是否遗漏了什么?我是在生产环境中这样做的……当然不是最理想的情况。
虽然使用 find
管道连接到 xargs
的想法听起来很合理,但我会根据我 15 年的经验告诉你这是个坏主意。我建议:
- 在重要的方框上标出那些服务 运行(您的查找命令在这里非常有效)
- 确定那些对定义地址的每个服务都很重要的文件
- 备份这些文件(cp 到 .orig 效果很好)
- 创建包含您的新地址的新文件
这样您就可以快速过渡:
cp somefile.new somefile
和快速退出:
cp somefile.orig somefile
此外,我希望区域文件包含实际的 DNS 条目,因此可以更改它们,但您可能需要重新加载命名以使这些更改生效。后缀也是如此,您也需要重新加载后缀。
编辑(我没有花时间实际加载这个区域,但它看起来相当正确):
$ORIGIN example.com.
$TTL 12H @ IN SOA ns1.example.com. hostmaster@example.com. (
2015062660 ;
30M ;refresh
2M ;retry
2W ;expire
1D ;minimum TTL
)
IN NS ns1.example.com.
IN NS ns2.example.com.
IN A 99.101.XXX.X
example.com. IN MX 10 mail.example.com.
mail IN A 99.101.XXX.X
IN TXT "v=spf1 a mx ip4:99.101.XXX.X ~all
ns1 IN A 99.101.XXX.X
ns2 IN A 99.101.XXX.X
www IN CNAME example.com.
dev IN CNAME example.com.
demo IN CNAME example.com.
webconf IN CNAME example.com.
stats IN CNAME example.com.
编辑: glue records
对不起大家。看起来我在找到解决方案后让它变得陈旧。为了后代的缘故,这似乎是在这一点上工作:
$ORIGIN example.com.
$TTL 12H
; @ symbol represents example.com.
@ 12H IN SOA ns1.example.com. hostmaster@example.com. (
2015062954 ;serial
30M ;refresh
2M ;retry
2W ;expire
1D ;minimum TTL
)
NS ns1.example.com.
NS ns2.example.com.
MX 10 mail.example.com.
IN A 99.101.XXX.XXX
IN TXT "v=spf1 a mx ip4:99.101.XXX.XXX ~all"
IN SPF "v=spf1 a mx ip4:99.101.XXX.XXX -all"
ns1 IN A 99.101.XXX.XXX
ns2 IN A 99.101.XXX.XXX
mail IN A 99.101.XXX.XXX
IN TXT "v=spf1 a mx ip4:99.101.XXX.XXX ~all"
IN SPF "v=spf1 a mx ip4:99.101.XXX.XXX -all"
www IN A 99.101.XXX.XXX
dev IN A 99.101.XXX.XXX
demo IN A 99.101.XXX.XXX
webconf IN A 99.101.XXX.XXX
stats IN A 99.101.XXX.XXX