文章目录
  1. 1. 准备工作
  2. 2. 搭建环境
  3. 3. 运行命令
    1. 3.1. salt
    2. 3.2. salt-call
    3. 3.3. salt-run
  4. 4. 指定目标
  5. 5. 维持状态(State)

SaltStack简称salt,是一个配置管理工具,类似AnsibleChefPuppet,可以用脚本批量操作多台机器。SaltStack运行得很快,可以很容易管理上万台服务器,还有部分中文文档。它分为服务器(master)和客户端(minion),服务器也是一个客户端。Salt (1) 入门是个不错的参考教程。

准备工作

我们需要先安装virtualBoxvagrant。通过vagrant来驱动virtualBox搭建一个虚拟测试环境。首先在本地任意路径新建一个空文件夹比如test,运行以下命令:

virtual box host
1
2
3
4
mkdir test
cd test
vagrant init ubuntu/trusty64
vi Vagrantfile

里面应该有一句config.vm.box = "ubuntu/trusty64",在它的下面添加如下几行代码,相当于给它分配三台虚拟机,一台叫做master,它的IP是192.168.33.17;另两台叫做minion1minion2,它们的IP是192.168.33.18192.168.33.19,其中minion2安装CentOS,其它安装Ubuntu。

Vagrantfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
config.vm.define "master" do | host |
host.vm.hostname = "master"
host.vm.network "private_network", ip: "192.168.33.17"
end
config.vm.define "minion1" do | host |
host.vm.hostname = "minion1"
host.vm.network "private_network", ip: "192.168.33.18"
end
config.vm.define "minion2" do | host |
host.vm.box = "bento/centos-7.1"
host.vm.hostname = "minion2"
host.vm.network "private_network", ip: "192.168.33.19"
end

改好之后,分别在三个终端运行以下命令启动并连接三台虚拟机。

virtual box host terminal 1
1
2
vagrant up
vagrant ssh master

virtual box host terminal 2
1
vagrant ssh minion1
virtual box host terminal 3
1
vagrant ssh minion2

搭建环境

首先在master的虚拟机上安装salt-master和salt-minion,注意master自己也是一个minion:

master
1
2
3
4
5
wget -O - https://repo.saltstack.com/apt/ubuntu/14.04/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -
sudo sh -c "echo 'deb http://repo.saltstack.com/apt/ubuntu/14.04/amd64/latest trusty main' >> /etc/apt/sources.list"
sudo apt-get update
sudo apt-get install -y salt-minion
sudo apt-get install -y salt-master

然后在minion上安装salt-minion,这次salt-master就没有必要了,Ubuntu和CentOS的安装方法不太一样:

minion1
1
2
3
4
wget -O - https://repo.saltstack.com/apt/ubuntu/14.04/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -
sudo sh -c "echo 'deb http://repo.saltstack.com/apt/ubuntu/14.04/amd64/latest trusty main' >> /etc/apt/sources.list"
sudo apt-get update
sudo apt-get install -y salt-minion

minion2
1
2
3
4
5
6
7
8
9
10
11
12
sudo rpm --import https://repo.saltstack.com/yum/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub
sudo sh -c "cat << EOF >/etc/yum.repos.d/saltstack.repo
[saltstack-repo]
name=SaltStack repo for RHEL/CentOS 7
baseurl=https://repo.saltstack.com/yum/redhat/7/x86_64/latest
enabled=1
gpgcheck=1
gpgkey=https://repo.saltstack.com/yum/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub
EOF"
sudo yum clean expire-cache
sudo yum update
sudo yum install -y salt-minion

默认安装好的minion会自动试图连接到名为salt的master去,所以我们得配置一下,然后重新启动salt-minion服务:

master and minion1
1
2
sudo sed -i "s/#master: salt/master: 192.168.33.17/" /etc/salt/minion
sudo service salt-minion restart

minion2
1
2
sudo sed -i "s/#master: salt/master: 192.168.33.17/" /etc/salt/minion
sudo systemctl start salt-minion

随便在哪台虚拟机上运行sudo tail -1 /var/log/salt/minion,如果看到错误消息The Salt Master has cached the public key for this node,那就说明前面的安装都是顺利的—这是因为第一次运行的时候,需要建立互信。Salt维护着一个互信列表,在master上运行sudo salt-key可以看到这个表,现在应该是这样子的:
Accepted Keys:
Denied Keys:
Unaccepted Keys:
master
minion1
minion2
Rejected Keys:

从上表可以看出,互信列表里的记录有四种状态

  • Unaccepted:待处理
  • Accepted:互信
  • Rejected:运维人员运行命令拒绝
  • Denied:master自动拒绝(比如ID重复等)

现在所有的minion包括master自己都是处于Unaccepted的状态。运行以下命令就可以把它们都加入到Accepted:

master
1
2
3
sudo salt-key --accept=master --yes
sudo salt-key --accept=minion1 --yes
sudo salt-key --accept=minion2 --yes

如果minion太多了,也可以用sudo salt-key --accept-all --yes来全部accept。忽略--yes可以让我们手动确认所有的Unaccepted记录。再次运行sudo salt-key,确认所有的minion都已经加入到Accepted Keys里了,安装步骤就此完成。

小贴士:可以用sudo salt-key --reject=minion2来把minion2加入到Rejected列表中。用sudo salt-key --include-all --accept-all来把Rejected列表中的minion再加到Accepted中来。

运行命令

salt

安装完成之后,在master上运行sudo salt '*' test.ping可以看到各minion是否能联通。其中的*代表目标(target),这里即是所有的minion(master现在也是一个minion),test.ping称为执行模块(execution module),也就是需要在目标上调用的方法。这个列表里记载了所有的原生执行模块。我们来尝试一下其中的cmdmod模块:

master
1
sudo salt minion1 cmd.run 'ifconfig'

这就相当于在minion1上直接运行ifconfig了。

salt-call

Salt还提供了一个salt-call命令,它只能在本机执行,所以无需输入目标。在master上运行sudo salt-call cmd.run 'hostname',效果相当于直接本地运行命令。有所不同的是,它相当于运行在salt的机制上。Salt需要两个端口来运行:通过ZeroMQ在4505发消息,4506用来接收结果,所有的minion都会订阅4505端口。也就是说,运行这条命令使用了这两个端口。配合上--log-level=debug的参数,使得salt-call非常适用于调试。运行以下命令:

master
1
sudo salt-call --log-level=debug disk.usage

从打印出来的调试信息,我们能看到原来disk.usage模块用的是df -P命令。

salt-run

最后再介绍一个salt-run命令。我们简单地试一试在master上运行sudo salt-run manage.up,这个manage.up是个runner,在这里它的作用类似于test.ping模块,也是查看所有minion的状态,但是不需要指定目标即可使用。它一般分为几个步骤,一个步骤内并行执行,步骤之间串行执行。比如先部署好数据库(步骤A)再部署应用服务器(步骤B)。salt-run运行的命令称为runner,这个列表里记载了所有的原生runner。

指定目标

Salt支持多种方式来指定目标,简单尝试一下就知道啦。

master
1
2
3
4
5
6
7
8
sudo salt 'minion*' test.ping # 通配符,以"minion"开头的minion
sudo salt -L 'minion1,minion2' test.ping # 列表,minion1和minion2
sudo salt -E 'minion(1|2)' test.ping # 正则表达式,minion1或minion2
sudo salt -S '192.168.33.19' test.ping # IP,minion2
sudo salt -G 'os:Ubuntu' test.ping # Grains,操作系统为Ubuntu
sudo salt -C 'minion* and G@os:Ubuntu' test.ping # 组合,以"minion"开头的minion并且操作系统为Ubuntu
sudo salt -C 'master or G@os:CentOS' test.ping # 组合,master或操作系统为CentOS(不区分大小写)
sudo salt -I 'region:cn' test.ping # Pillar,region为cn的minion

其中的Grains是minion的属性,包含机器名、IP、操作系统、CPU等多种信息。可以运行sudo salt '*' grains.items来查看所有的grains数据。那Pillar又是什么鬼?简言之,Pillar是存放在master的变量,Grains是minion自己的常量。上面的命令中,Pillar这行应该会报错:No minions matched the target,这是因为我们没有在master上加Pillar的缘故。Pillar文件为yaml格式,默认存放在/srv/pillar里。由于pillar只会加密传送给指定的minion,所以可以存放密码等敏感信息。我们来加两个文件:

master
1
2
3
4
5
6
sudo sh -c "cat << EOF > /srv/pillar/top.sls
base:
'*':
- default
EOF"
sudo sh -c "echo 'region: cn' > /srv/pillar/default.sls"

首先创建的top.sls是一个默认的入口文件,它表示所有minion都适用default.sls文件。而default.sls里指定了变量。运行以下的命令:

master
1
2
sudo salt '*' pillar.items # 生成、分发、查看现在的pillar。用pillar.raw可以仅查看当前值
sudo salt -I 'region:cn' test.ping # 再次运行test.ping,以pillar为目标

就能看到现在已经不报错了,所有的minion都是目标。

维持状态(State)

Salt提供了state(点开一看,设计哲学是“简单,简单,简单”。大家都知道重要的事情说三遍)的方式让我们维持所有minion的状态一致。我们来加两个文件:

master
1
2
3
4
5
6
7
8
9
10
sudo sh -c "cat << EOF > /srv/salt/top.sls
base:
'*':
- default
EOF"
sudo sh -c "cat << EOF > /srv/salt/default.sls
/tmp/ggg:
file.directory:
- makedirs: True
EOF"

如同pillar,首先创建的top.sls是一个默认的入口文件,default.sls里指定了这个状态需要有/tmp/ggg这个文件夹。接下来让我们来运行它:

master
1
2
3
4
5
sudo salt 'master' state.show_sls default # 检查并显示default的state
sudo salt 'master' state.sls default # 运行default的state
ls /tmp # 能够看到ggg文件夹已经创建好了
sudo salt 'master' state.sls default # 再次运行default的state
ls /tmp # 运行几次都一样,维持状态

State可以说是salt的核心功能。它通过yaml格式的数据文件sls(SaLt State file)确保了一个系统应该是什么状态的。这个列表里记载了所有可用的状态。

文章目录
  1. 1. 准备工作
  2. 2. 搭建环境
  3. 3. 运行命令
    1. 3.1. salt
    2. 3.2. salt-call
    3. 3.3. salt-run
  4. 4. 指定目标
  5. 5. 维持状态(State)