SaltStack环境安装及入门
SaltStack简称salt,是一个配置管理工具,类似Ansible、Chef和Puppet,可以用脚本批量操作多台机器。SaltStack运行得很快,可以很容易管理上万台服务器,还有部分中文文档。它分为服务器(master)和客户端(minion),服务器也是一个客户端。Salt (1) 入门是个不错的参考教程。
准备工作
我们需要先安装virtualBox和vagrant。通过vagrant来驱动virtualBox搭建一个虚拟测试环境。首先在本地任意路径新建一个空文件夹比如test
,运行以下命令:
里面应该有一句config.vm.box = "ubuntu/trusty64"
,在它的下面添加如下几行代码,相当于给它分配三台虚拟机,一台叫做master,它的IP是192.168.33.17;另两台叫做minion1和minion2,它们的IP是192.168.33.18和192.168.33.19,其中minion2安装CentOS,其它安装Ubuntu。
改好之后,分别在三个终端运行以下命令启动并连接三台虚拟机。
|
|
|
|
搭建环境
首先在master的虚拟机上安装salt-master和salt-minion,注意master自己也是一个minion:
然后在minion上安装salt-minion,这次salt-master就没有必要了,Ubuntu和CentOS的安装方法不太一样:
|
|
默认安装好的minion会自动试图连接到名为salt的master去,所以我们得配置一下,然后重新启动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:
如果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模块:
这就相当于在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
非常适用于调试。运行以下命令:
从打印出来的调试信息,我们能看到原来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支持多种方式来指定目标,简单尝试一下就知道啦。
其中的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,所以可以存放密码等敏感信息。我们来加两个文件:
首先创建的top.sls
是一个默认的入口文件,它表示所有minion都适用default.sls
文件。而default.sls
里指定了变量。运行以下的命令:
就能看到现在已经不报错了,所有的minion都是目标。
维持状态(State)
Salt提供了state(点开一看,设计哲学是“简单,简单,简单”。大家都知道重要的事情说三遍)的方式让我们维持所有minion的状态一致。我们来加两个文件:
如同pillar,首先创建的top.sls
是一个默认的入口文件,default.sls
里指定了这个状态需要有/tmp/ggg
这个文件夹。接下来让我们来运行它:
State可以说是salt的核心功能。它通过yaml格式的数据文件sls(SaLt State file)确保了一个系统应该是什么状态的。这个列表里记载了所有可用的状态。