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

ssh 使用 sudo 执行一条命令后退出

正常情况下,如果想用 ssh 在远程主机上执行一条命令就退出,这样就可以了:
# for i in {1..10};do ssh host${i} cp /home/user/hosts /tmp/;done

现在想将 ~/hosts 文件覆盖 /etc/hosts。如果仅仅加上 sudo 是不行的:
# for i in 1 2 3;do ssh host${i} sudo cp /home/user/hosts /etc/hosts;done
sudo: sorry, you must have a tty to run sudo

加上 -t 参数即可,表示强制分配一个 pseudo-tty 给该 shell:
# for i in 1 2 3;do ssh -t host${i} sudo cp /home/user/hosts /etc/hosts;done

挂载 Xen 的镜像文件

由于 domU 跟 dom0 的 IP 产生了冲突,导致一开虚拟机就会出现假死的情况,后来考虑能不能像 ISO 文件一样先挂载到某个目录,对其网络参数进行直接修改,发现可以通过 mount 的 offset 完成。

通过下面可以看到,由于该镜像有多于一个的分区,导致其不可以直接以 ISO 文件的方式进行挂载:
# ls
initrd.gz  ubuntu_10.04.3_x86_64.img  ubuntu_xen  vmlinuz
# mount -o loop ubuntu_10.04.3_x86_64.img  /mnt/
mount: you must specify the filesystem type
Continue reading

使用 Synergy 共享键盘

synergy 可以使用一套键盘/鼠标控制多个系统。以我的为例,右边是 21.5 寸的台式机 op,左边是我自己 13 寸的 tp。现在使用台式机的键盘/鼠标来同时控制二者。二者均为 Archlinux,hosts 如下:

10.18.102.147 op.jaseywang.me op
10.18.102.150 tp.jaseywang.me tp

op 作为 server:
# pacman -S synergy
# cp /etc/synergy.conf.example /etc/synergy.conf

section: screens
    tp:
    op:
end

section: links
    tp:
        right = op

    op:
        left  = tp
end

参照注释修改,以 daemon 的方式启动,可以将其写进 /etc/rc.conf:
# /etc/rc.d/synergys start

tp 作为 client,启动:
# pacman -S synergy
# synergyc op

通过鼠标来移交键盘的控制权。更详细的使用以及问题请看这里

如何在各个主机之间免密码登录

这篇记录源自于我在 Twitter 上这样的一个问题
现在有一个集群,每个机器都有其余机器的公钥,这样可以实现免密码登陆,但是一台机器被入侵其余机器不就悲剧了么,有啥办法可以防范的?

不考虑安全性,最简单的办法是在其中的一台主机上生成一套密钥以及一个 authorized_keys 文件,然后分发到其余的主机上就可以了,但是这样显然是不合理的。 @tifan 给出了一个不错的方案,简单的说就是一个 -A,也就是启动 ssh 的认证转发。

local ---> server-1 ---> server-2 --> server-3

local 上启动 ssh-agent:
$ exec ssh-agent /bin/bash
添加密钥,并查看:
$ ssh-add  .ssh/id_rsa_jw
Identity added: .ssh/id_rsa_jw (.ssh/id_rsa_jw)
$ ssh-add -l
2048 33:b8:33:33:1w:8w:67:81:aw:wq:ca:a8:3a:13:28:c0 .ssh/id_rsa_jw (RSA)
登录 server-1:
$ ssh -A user@server-1

现在就可以免密码登录 server-2 了:
$ ssh user@server-2

如果想要继续登录 server-3,则需要在登录 server-2 时加上 -A:
$ ssh -A user@server-3

注意:在执行 ssh-agent 时,记得加上 exec,不然会出现下面的错误:
Could not open a connection to your authentication agent

上面的 -A 参数就是 ~/.ssh/config 或者 /etc/ssh/ssh_config 中的 ForwardAgent,开启就不必每次都要手动输入 -A 了:
ForwardAgent yes

安全永远是相对的,本套方案同样,@czbug 同学这里记录了一篇 ssh-agent 的安全隐患。要解决此问题,还得靠人,在 man ssh 里面说的很清楚:

"Agent forwarding should be enabled with caution.  Users with the ability to bypass file permissions on the remote host (for the agent's  UNIX-domain  socket)  can  access  the  local  agent through  the forwarded connection.  An attacker cannot obtain key material from the agent, however they can perform operations on the keys that enable them to authenticate using the identities loaded into the agent."

以后完事后记得注销。

2960G 查看端口的使用情况

需要盘点下各个交换机端口的使用情况,除了通过 HTTPS 的方式查看(信息量较少),命令行下也可以查看,个人觉得更加方便。

下面几条命令都是通过 ? 获取到的,意思很简单,做个记录,不一条条解释了:
#show interfaces status
Port      Name               Status       Vlan       Duplex  Speed Type
Gi0/1                        notconnect   2            auto   auto 10/100/1000BaseTX
Gi0/2                        connected    2          a-full  a-100 10/100/1000BaseTX

Gi0/24                       connected    2          a-full a-1000 10/100/1000BaseTX
Gi0/25                       connected    2          a-full a-1000 10/100/1000BaseTX
Gi0/26                       notconnect   2            auto   auto 10/100/1000BaseTX
Gi0/27                       connected    3          a-full a-1000 10/100/1000BaseTX
Gi0/28                       connected    3          a-full a-1000 10/100/1000BaseTX

Gi0/44                       notconnect   3            auto   auto 10/100/1000BaseTX
Gi0/45                       notconnect   3            auto   auto Not Present
Gi0/46                       notconnect   3            auto   auto Not Present
Gi0/47                       connected    trunk      a-full a-1000 10/100/1000BaseTX
Gi0/48                       connected    trunk      a-full a-1000 10/100/1000BaseTX
Continue reading