跨机房部署

跨机房的服务部署分两个小问题。第一个是系统(RAID、BIOS、OS) 的部署,另外一个则是 OS 上面的服务的部署。

系统
曾经想通过 dhcp over openvpn 来解决机房的"互联互通"问题,目前暂时仅仅解决了通过 openvpn 进行 lan to lan 的连接,而 over openvpn 的 dhcp(dhcrelay) 到目前为止还不清楚为什么获取不到 IP。

后来看 cobbler 的文档的时候发现可以通过 replicating 实现,这个需要在对端的 IDC 部署一台 cobbler server,由这台机器完成 tftp, dhcp 的功能,而由 central cobbler 实现统一的 system, repo 等配置。
部署起来也很简单。在对端部署一台跟 central cobbler 一样的 cobbler,默认不需要添加任何的 distro 等。该端所有的配置均从 central 拉取,因此需要足够的硬盘空间,尤其要同步 repo:
# cobbler replicate cobbler replicate –master=cobbler.example.org [–distros=pattern] [–profiles=pattern] [–systems=pattern] [–repos-pattern] [–images=pattern] [–prune] [–omit-data]

接下来该建立 RAID 的建立 RAID,该安装系统就安装系统。另外,官方推荐通过 trigger 机制来自动的同步 central 上的数据,这个我后来调研的时候发现并不是很好,如果有多个机房的话,会造成 system 的混乱。因此,暂时还是手动的在对端的 cobbler 上手动的执行一遍 replicating,每次机器上架的时候的才会用到,工作量并不大。

服务
这个相对就比较简单了,如果是通过 tunnel 形成的一个三层结构,那么通过 puppet master 或者类似的 saltstack 就能很轻松的完成,前提是注意 ntp 以及 dns(hosts) 的统一正确。

puppet 问题记录

1. permission denied 问题
在 cliet 测试时,发现如下的问题:
# puppet agent –server jaseywang.example.com  –noop –test
info: Caching catalog for user1.example.com
info: Applying configuration version '1358997047'
err: /Stage[main]/User::Virtual/Ssh_user[user1]/File[/home/user1/.ssh/id_rsa]: Could not evaluate: Error 400 on SERVER: Permission denied – /etc/puppet/modules/user/files/keys/id_rsa Could not retrieve file metuser1ata for puppet:///modules/user/keys/id_rsa: Error 400 on SERVER: Permission denied – /etc/puppet/modules/user/files/keys/id_rsa at /etc/puppet/modules/user/manifests/definition.pp:49
notice: Finished catalog run in 0.52 seconds

看 error log 应该很简单,权限的问题:
jaseywang@example.com:/etc/puppet/modules/user/files/keys$ ll
total 20
-rw-r–r– 1 jaseywang jaseywang 6249 2013-01-23 18:59 authorized_keys
-rw-r–r– 1 jaseywang jaseywang   81 2013-01-22 23:23 config
-rw——- 1 jaseywang jaseywang 1675 2013-01-22 23:18 id_rsa
-rw-r–r– 1 jaseywang jaseywang  398 2013-01-22 23:29 id_rsa.pub

修改一下 if_rsa 的权限:
jaseywang@example.com:/etc/puppet/modules/user/files/keys$ ll
total 20
-rw-r–r– 1 jaseywang jaseywang 6249 2013-01-23 18:59 authorized_keys
-rw-r–r– 1 jaseywang jaseywang   81 2013-01-22 23:23 config
-rw-r–r– 1 jaseywang jaseywang 1675 2013-01-22 23:18 id_rsa
-rw-r–r– 1 jaseywang jaseywang  398 2013-01-22 23:29 id_rsa.pub

再次执行通过:
# puppet agent –server jaseywang.example.com  –noop –test
info: Caching catalog for user1.example.com
info: Applying configuration version '1358997047'
notice: /Stage[main]/User::Virtual/Ssh_user[user1]/File[/home/user1/.ssh/id_rsa]/ensure: current_value absent, should be file (noop)
notice: Ssh_user[user1]: Would have triggered 'refresh' from 1 events
notice: Class[User::Virtual]: Would have triggered 'refresh' from 1 events
notice: Stage[main]: Would have triggered 'refresh' from 1 events
notice: Finished catalog run in 0.57 seconds

Continue reading

puppet 安装 jdk

$ sudo add-apt-repository "deb http://archive.canonical.com/ $(lsb_release -s -c) partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk

然后交互的选择 yes/no 进行安装。为了减少宝贵的人肉时间,有下面几种方式,最原始的方式:
$ ssh host "yes | apt-get -y install sun-java6-jdk"
Continue reading

使用 Puppet 安装 deb 包

一般安装一个包可以使用 apt 方式安装,puppet 也提供了这种功能:
class package{

   $apppackage = [
            "screen",
            "htop",
            "expect",
            "traceroute",
            "curl",
            "ethtool"
   ]
    package
        { $apppackage:
                ensure => installed,
        }  
}
Continue reading

puppet 时间同步间隔设置

默认情况下,agent 每 30min 会向 master 请求一次。我们不希望 agent 自动更新,因此,除了每次执行时,将其设置为 –no-daemonize –onetime 外,还可以将时间间隔设置为永不同步,在 puppet.conf 的 [main] 段加上如下的指令就可以了:
runinterval=never
当然,也可以像下面这样,通过 cron 将间隔设置为一个非常长的时间。

 

Puppet 学习笔记

puppet 由于涉及到证书的问题,在安装时要确保域名解析的正确,这个通过 dns 以及 hosts 都可以实现。比较方便的方式是将所有的主机的 ip/domain 都写到 /etc/hosts 里面,下面三行是标准的 hosts 文件的写法:

#ip         hostname.domainname    hostname
127.0.0.1        localhost.localdomain localhost
192.168.101.10   master.example.com master
192.168.101.30   agent.example.com agent

同时要注意 /etc/resolv.conf 里面的  search 指令,要么要跟 hosts 文件的 domain name 一致,要么直接注释掉,使用下面命令生效或者重启:
# hostname -F /etc/hostname

查看 puppet master/agent 的版本:
# puppet --version
# puppetmaster --version

使用 yum 安装需要使用 epel 源。 需要注意的是,puppetmaster 的版本需要大于等于客户端,否则二者通信会有问题。安装之前 apt-cache policy/yum info 确认一下版本。
Puppet Master:
# yum install puppet-server
# chkconfig puppetmaster on
# iptables -A INPUT -p tcp --dport 8140 -j ACCEPT

Puppet Client:
# yum install puppet
# chkconfig puppet on

Ubuntu 的包分别是 puppetmaster, puppet。
Continue reading