安装
安装节点主机名: zk1,zk2,zk3 ,zk1 为 master 节点
1. Enabling EPEL on RHEL,其实就是配置 yum
[root@zk1 salt]# rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
2. 安装 salt-master
安装依赖包 python-jinja2先安装 rpmforge:
对于 RHEL6 :
[root@zk1 salt]# rpm -Uvh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
对其他版本和发行版,在 http://pkgs.repoforge.org/rpmforge-release/ 找对应的 rpm
[root@zk1 salt]# yum install python-jinja2
在 master 节点安装
[root@zk1 salt]# yum install salt-master
Loaded plugins: product-id, refresh-packagekit, security
Existing lock /var/run/yum.pid: another copy is running as pid 3697.
Another app is currently holding the yum lock; waiting for it to exit...
The other application is: PackageKit
编辑 /etc/yum/pluginconf.d/refresh-packagekit.conf 关掉检查更新,再 install
[root@zk1 salt]# chkconfig salt-master off
3. 在子节点安装 salt-minion
[root@zk2 salt]# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
[root@zk2 salt]# rpm -Uvh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
[root@zk2 salt]# yum install python-jinja2
[root@zk2 salt]# yum install salt-minion
[root@zk3 salt]# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
[root@zk3 salt]# rpm -Uvh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
[root@zk3 salt]# yum install python-jinja2
[root@zk3 salt]# yum install salt-minion
4. 配置
在 master 节点配置 /etc/salt/master
这个文件无需配置,对于 # 后直接跟参数名的为默认值,# 后有空格的为非默认值,如
#interface: 0.0.0.0 为 默认值 ,而 # enable_gpu_grains: False 则不是默认值
在 zk1 设置
iptables -I INPUT -s zk2 -p tcp -m multiport --dports 4505,4506 -j ACCEPT
iptables -I INPUT -s zk3 -p tcp -m multiport --dports 4505,4506 -j ACCEPT
在 minion 设置:
[root@zk2 salt]# iptables -A INPUT -i eth0 -p tcp -m multiport --dports 4505,4506 -j ACCEPT
[root@zk3 salt]# iptables -A INPUT -i eth0 -p tcp -m multiport --dports 4505,4506 -j ACCEPT
编辑 zk2,zk3 的 /etc/salt/minion,配置 master
master: zk1
启动服务
[root@zk1 ~]# salt-master -d
[root@zk2 ~]# salt-minion -d
[root@zk3 ~]# salt-minion -l debug
5. Using salt-key
minion 启动后会生成 key,连接到 master 时,master 会检查这个 key:
/etc/salt/pki/minion/minion.pem
检查 master 上所有的 key
[root@zk1 salt]# salt-key -L
Accepted Keys:
Unaccepted Keys:
zk2
zk3
Rejected Keys:
这两个 minion 默认使用主机名作为 minion ID 来注册的,检查并比对 minion 节点的公钥指纹
[root@zk1 salt]# salt-key -f zk2
Accepted Keys:
zk2: 7f:7b:49:ba:f6:b4:10:b2:15:dc:c2:94:5f:5c:fe:0f
[root@zk1 salt]# salt-key -f zk3
Accepted Keys:
zk3: 27:2e:fc:d7:ae:35:07:3e:e5:39:41:00:39:7a:19:96
[root@zk2 ~]# salt-call key.finger --local
local:
7f:7b:49:ba:f6:b4:10:b2:15:dc:c2:94:5f:5c:fe:0f
[root@zk3 salt]# salt-call key.finger --local
local:
27:2e:fc:d7:ae:35:07:3e:e5:39:41:00:39:7a:19:96
接受所有的 minion
[root@zk1 salt]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
zk2
zk3
Proceed? [n/Y] y
Key for minion zk2 accepted.
Key for minion zk3 accepted.
[root@zk1 salt]# salt-key -L
Accepted Keys:
zk2
zk3
Unaccepted Keys:
Rejected Keys:
现在 minion 已经通过验证,连接到了 master
测试 minion 是否已经连接:让所有的 minion 运行函数 test.ping ,其中 test 引用了一个模块,ping 则是其中的一个函数
[root@zk1 salt]# salt '*' test.ping
[root@zk1 salt]# salt '*' test.arg 1 "two" 3.1 txt="hello" wow='{a: 1, b: "hello"}
查看可用的函数,还是 web 版更好点
[root@zk1 salt]# salt zk2 sys.doc
从中找了个简单的函数来测试:
file.copy:
Copy a file or directory
CLI Example:
salt '*' file.copy /path/to/src /path/to/dst
[root@zk1 salt]# salt zk2 file.copy ~/install.log ~/salt/
zk2:
The minion function caused an exception: Traceback (most recent call last):
File "/usr/lib/python2.6/site-packages/salt/minion.py", line 767, in _thread_return
return_data = func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/salt/modules/file.py", line 1594, in copy
shutil.copyfile(src, dst)
File "/usr/lib64/python2.6/shutil.py", line 51, in copyfile
with open(dst, 'wb') as fdst:
IOError: [Errno 21] Is a directory: '/root/salt/'
[root@zk1 salt]# salt zk2 file.copy ~/install.log ~/salt/install.log
zk2:
True
复制还要指定目标文件名,挺不符合系统命令惯例的,所以直接 shell 更好点:
[root@zk1 salt]# salt zk2 cmd.run 'cp install.log ~/salt'
zk2:
[root@zk1 salt]# salt zk2 cmd.run 'ls -l ~/salt'
zk2:
total 44
-rw-r--r--. 1 root root 26876 Apr 5 17:13 install.log
使用
1. 配置 master
按如下目录结构创建 sls 文件
[root@zk1 srv]# tree /srv/
/srv/
`-- salt
|-- top.sls
|-- tree.sls
`-- webserver.sls
1 directory, 3 files
[root@zk1 srv]#
[root@zk1 srv]# cat /srv/salt/top.sls
base:
'*':
- webserver
- tree
[root@zk1 srv]# cat /srv/salt/tree.sls
tree: # ID declaration
pkg: # state declaration
- installed # function declaration
[root@zk1 srv]# cat /srv/salt/webserver.sls
httpd: # ID declaration
pkg: # state declaration
- installed # function declaration
2.测试
那我现在只想安装 tree,不想安装 httpd,则可以将 httpd 排除掉, 在所有节点安装 tree 软件包:
[root@zk1 salt]# salt '*' state.highstate exclude="[{'id': 'httpd'}]" -t 60
zk2:
----------
ID: tree
Function: pkg.installed
Result: True
Comment: Package tree is already installed
Changes:
Summary
------------
Succeeded: 1
Failed: 0
------------
Total: 1
zk3:
----------
ID: tree
Function: pkg.installed
Result: True
Comment: The following packages were installed/updated: tree.
Changes:
----------
tree:
----------
new:
1.5.3-2.el6
old:
Summary
------------
Succeeded: 1
Failed: 0
------------
Total: 1
结果显示了 zk2 已经安装了 tree,并且 在 zk3 上成功安装了 tree
如果安装过程中有问题,会显示在 master 控制台
minion 的 日志在 /var/log/salt/minion,也可以在启动服务时让 minion 输出详细日志:
salt-minion -l debug
Reference:
http://docs.saltstack.com/en/latest/