SaltStack 安装和使用示例

本文详细介绍如何在RHEL系统上部署SaltStack环境,包括安装Salt Master和Minion、配置网络防火墙、设置密钥验证及状态管理等步骤,并通过实例演示如何进行远程命令执行和状态配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


安装

安装节点主机名: 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


tree.sls 和 webserver.sls 分别声明了要安装 tree  和 httpd  软件包, top.sls 内容表明子节点可以通过这个文件找到这两个文件

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/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值