加载中

不久前的一天,当我自豪穿着Salt Stack 文化衫的时候,我的女儿看到后就当面问我,“Salt Stack 是什么呀?” 于是,我开始了作出了如下的解释,假如你有很多台服务器而且想要操作这些服务器,你也许需要一台一台的登录这些服务器,每次作出一次操作变更。这些操作可能是相当简单的,比如重启他们或者检查他们已经运行了多久,更或者,你想要做些更复杂的事情,比如安装软件和按照你的特殊需求来配置他们,也许你只是想要增加用户并且配置他们的权限。

假如你有百十来台服务器,你应该怎么做?想象一下你每次一台一台的登陆这些服务器,执行同样的命令在这些100台的服务器中并且编辑同一个配置文件,你可以想象吗?这是多么的苦逼!仅仅更新一下用户的密码策划就要用掉数天的时间,并且你可能出现错误的操作,怎么样通过一个命令一次完成所有服务器的操作?怎么解决?答案就是,Salt Stack!


葱油拌面
翻译于 2013/03/26 09:21
3

和我女儿一样,你也许还没有听说过Salt Stack(http://saltstack.org),但是你可能比较熟悉Puppet((http://puppetlabs.com))和Chef(http://opscode.com).Salt 跟他们差不多,但是Salt 是用Python写的,且对于设备的要求是相当轻量级的,使用起来相当容易(在我看来),Salt 通讯层使用0MQ(http://www.zeromq.org),这是使得它很快速。并且它是完全开源的,遵守Apche2 (http://www.apache.org/licenses/LICENSE-2.0)开源协议.拥有一个活跃和高效的开源社区。

目前,他们没有任何计划来发布一个残缺的社区版本或一个功能丰富的商业版本,对于Salt,你当前获得的这个版本是任何人都可以获得的,不论你是否付过钱。当然他们有发行商业版本的计划,不过它将是紧密的社区版本,且通过更多的测试和质量保证,以及相关的培训。

Salt和Puppet Chef 一样可以让你同时在多台服务器上执行命令也包括安装和配置软件。Salt 有两个主要的功能:配置管理和远程执行。

葱油拌面
翻译于 2013/03/26 09:48
1

Salt Stack 是一个命令行工具,这里没有任何地方需要你点击你的鼠标,执行的结果也会像字符界面一样反馈到你的屏幕上。这很好吧,它使得事情变得简单,并且很多服务器不需要一个图形界面。(注解:我使用Salt 条款在本文中,他们指的是同一个东西在上下文中)

在本文,Salt 包含两个工具,第一个是远程执行,虽然没有一个清晰的描述,但是假如你想要一个配置管理和远程执行的工具,在Salt中你可以找到很多方法。这可以让你登陆一台主服务器然后同时执行命令在一台或者多台服务器上。使用Salt,你仅仅需要在主服务器上输入命令,它会在每台机器上甚至一个服务器群组执行。

第二,Salt 能够存储配置指令,然后引导其他机器按照这些指令作出动作,如,安装软件,更改软件的配置,反馈这个任务成功执行与否。

接下来,我来演示使用Salt 安装一个额外的包,并且仅仅通过一个命令配置这个包。


葱油拌面
翻译于 2013/03/26 14:56
1

安装 Salt

Salt 是不断变更的,也许当你读到本文时,有些事情已经改变,你可以在这里找到最新的文档:

http://docs.saltstack.org/en/latest/index.html

在安装Salt之前,你需要一些简单的准备工作:

1,一台Linux 服务器

2,sudo 或者root密码

3,这台服务器能够连接因特网

4,知道你的服务器的IP地址(可以是公网或私网IP)。

虽然Salt被设计为能够连接多台服务器,但在本文中,你可以在一台服务器上完成这些操作。

使用你的包管理器来安装Salt,你可以根据你系统版本分支找到相关的安装手册(http://docs.saltstack.org/en/latest/topics/installation/index.html),你也需要sudo或者root权限,来安装和使用salt

葱油拌面
翻译于 2013/03/26 15:18
1

使用包管理的好处或者从在线的源代码安装是一个无法结束的争论,根据你的系统版本分支,选择更好的安装方法。

假如你倾向于使用源代码来安装,你可以在Salt 项目Github版本库里找到最新的Salt源码文件(https://github.com/saltstack/salt).

安装完成Salt-master和salt-minion后,希望一切运行正常且你没有收到错误信息。假如Salt并没有正常运行,你可以在到Salt Stack的邮件列表(http://saltstack.org/learn/#tab-mailinglist)和Salt IRC频道寻求帮助。

葱油拌面
翻译于 2013/03/26 15:49
1

配置主服务器和从服务器

主服务器和从服务器指的是控制器和被控制的服务器,这个主服务器本质上是中央协调中心对所有的从服务器,从服务器类似client/server配置,这里的主服务器是server,从服务器是client.

从服务器配置

在本文中,我配置salt-master和salt-minion 命令在同一台机器上,假如你在配置多台服务器,挑选其中一个为master,剩下的成为minions.根据你的需要来配置master和minion,接下来的我会解释如何配置一台服务器为master和另外的机器为minions.

Salt的配置文件在/etc/salt目录下,默认,这些文件被命名为minion和master,假如你在同一台机器安装了salt-master和salt-minion,你会看到不同的两个文件,master和minion

葱油拌面
翻译于 2013/03/26 16:17
1

首先,你需要告诉你的minion怎样找到并连接你的Master服务器。即使你运行minion和Master在同一台服务器上,你仍然要告诉minion你的master在哪儿。

1,使用你最喜欢的文本编辑器,打开minion配置文件

2,取消注释行#master,移除# 替换为你的Master服务器的IP地址,应该是这样:master:你的master IP地址。(假如以上操作,在同一台服务器,此时增加 127.0.0.1)

3,命名一个昵称给你的服务器,查找到#id行,再一次移除#号,增加一个nameid:1st-salt-minion,(这个名字可以是任何字符串的)

4,为了重新加载新的配置,你需要使用sudo 重启你的salt-minion进程,-d 选项,启动salt-minion为一个后台进程,这样子的话,你可以访问您的命令行发布更多的命令。

葱油拌面
翻译于 2013/03/26 17:46
2

认证 Minion Keys

现在你的minion 已经知道到master在哪里,接下来让他们进行彼此验证,Salt使用公共密钥加密来确保master和minions的安全通信。你需要通过在master端验证minion的证书来明确master和minion之间的是授信的。

认证minion的证书使用salt-key命令,Salt自动生成这些证书,你需要做的仅仅是认证你需要的证书。

1,输入salt-key -L 列出所以没有认证,认证过,拒绝认证的证书

2,你应该可以看到一个没有认证的证书1st-Salt-Minion(或者你自己选择的minion)

3,认证这个证书使用 sudo salt-key -a 1st-salt-minion

葱油拌面
翻译于 2013/03/26 18:03
1

通信测试

现在你已经有了一台 salt-master和一台salt-minion,并且master和minion已经相互信任,你可以从master 使用一个test ping的命令来测试他们之间的连接。假如你的master能够连接到minion,将会返回一个"return".输入 salt '*' test.ping,它应该有如下输出:

>{1st-Salt-Minion: True}
注意,通配符 *代表所有minion,因为这里你只有一台服务器,算是一个简单的模拟测试(要比salt '1st-salt-Minion' test ping 快多了)

假如你收到“True”,证明你已经成功安装和配置完成salt stack。

如果没有的话,你也许需要重启你的master和minion 不带-d参数,这样子的话,你能够获取到更多输出信息,更多的参考资料,请查看Salt 官方文档http://docs.saltstack.org/en/latest/topics/configuration.html

葱油拌面
翻译于 2013/03/26 18:25
1

Salt的语法结构,包括命令,目标和动作,举个例子,* 指任何主机(* 是一个通配符),test.ping 是动作。

你可以在已经链接和信任的主机上执行任何可用的命令,关键提示:这些需要执行的命令在目标主机上必须可用,例如,如下命令:

sudo salt '*' cmd.run "service apache2 restart"
这个命令只会在已经安装了apach2e web服务器的主机上执行,另外,你也可以使用这样的命令:
sudo salt '*' cmd.run "service httpd restart"
另外一个例子,也许你想要查询你的主机已经运行了多长时间,你可以这样子做:
sudo salt '*' cmd.run "uptime"
在举另外一个例子,假如你的Apache Bench(译者注:一个apche 开源压力测试工具)安装在master上而没有安装在minion上,下面的命令:
sudo salt '*' cmd.run "ab -n 10 -c 2 http://www.google.com:80/index.html"
如果你尝试在minion上执行,你将会失败,因为Apache Bench 没有安装在minion上。
葱油拌面
翻译于 2013/03/26 21:13
2
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(15)

葱油拌面
葱油拌面

引用来自“行者深蓝”的评论

base:
'*'
- servers
这里应该是
base:
'*':
- servers
第二行后面应该有 “:” 吧
对的,笔误,谢谢
微笑sky
微笑sky
python2.6 解决 File "/usr/lib/python2.6/site-packages/salt/state.py"
行者深蓝
行者深蓝
base:
'*'
- servers
这里应该是
base:
'*':
- servers
第二行后面应该有 “:” 吧
葱油拌面
葱油拌面

引用来自“btpolo”的评论

引用来自“葱油拌面”的评论

引用来自“btpolo”的评论

你好,我配置完毕,连通性及远程命令都没有问题,但是想尝试进行文件传送报错,能帮我看看嘛,配置文件:
::::::::::::::
top.sls
::::::::::::::
base:
'redhat5-ict193':
- test
::::::::::::::
test.sls
::::::::::::::
/tmp/test_file:
file.managed:
- source: salt://servers/test_file
- owner: root
- group: root
- mode: 644

执行state.highstate报错
[root@]# salt 'redhat5-ict193' state.highstate -v
Executing job with jid 20130904182905817897
-------------------------------------------
redhat5-ict193:
Data failed to compile:
----------
Traceback (most recent call last):
File "/usr/lib/python2.6/site-packages/salt/state.py", line 2196, in call_highstate
top = self.get_top()
File "/usr/lib/python2.6/site-packages/salt/state.py", line 1843, in get_top
return self.merge_tops(tops)
File "/usr/lib/python2.6/site-packages/salt/state.py", line 1775, in merge_tops
for tgt in targets:
TypeError: 'NoneType' object is not iterable

你试一下 这个 salt 'redhat5-ict193' state.sls init
把test.sls 更改为init.sls


这样是可以的,成功了,那原来是什么原因呢?
redhat5-ict193:
----------
State: - file
Name: /tmp/test_file
Function: managed
Result: True
Comment: File /tmp/test_file updated
Changes: diff: ---
+++

salt 'redhat5-ict193' state.highstate -v 这个是运行所有的state 模块
所以 你其他模块 有问题 它就没有办法运行
七魔星呼吸
网上找了挺久,也没解决,请问这个有遇到过吗

[root@6.2_jy_45.10 salt]$ cat top.sls
base:
'*':
- servers
- vim
[root@6.2_jy_45.10 salt]$ cat servers.sls
dos2unix:
pkg.installed
[root@6.2_jy_45.10 salt]$ salt '*' state.sls servers
2st-salt-minion:
----------
State: - pkg
Name: dos2unix
Function: installed
Result: False
Comment: An exception occurred in this state: Traceback (most recent call last):
File "/usr/lib/python2.6/site-packages/salt/state.py", line 1238, in call
*cdata['args'], **cdata['kwargs'])
File "/usr/lib/python2.6/site-packages/salt/states/pkg.py", line 350, in installed
result = _find_install_targets(name, version, pkgs, sources)
File "/usr/lib/python2.6/site-packages/salt/states/pkg.py", line 90, in _find_install_targets
cur_pkgs = __salt__['pkg.list_pkgs'](versions_as_list=True)
KeyError: 'pkg.list_pkgs'

Changes:
b
btpolo

引用来自“葱油拌面”的评论

引用来自“btpolo”的评论

你好,我配置完毕,连通性及远程命令都没有问题,但是想尝试进行文件传送报错,能帮我看看嘛,配置文件:
::::::::::::::
top.sls
::::::::::::::
base:
'redhat5-ict193':
- test
::::::::::::::
test.sls
::::::::::::::
/tmp/test_file:
file.managed:
- source: salt://servers/test_file
- owner: root
- group: root
- mode: 644

执行state.highstate报错
[root@]# salt 'redhat5-ict193' state.highstate -v
Executing job with jid 20130904182905817897
-------------------------------------------
redhat5-ict193:
Data failed to compile:
----------
Traceback (most recent call last):
File "/usr/lib/python2.6/site-packages/salt/state.py", line 2196, in call_highstate
top = self.get_top()
File "/usr/lib/python2.6/site-packages/salt/state.py", line 1843, in get_top
return self.merge_tops(tops)
File "/usr/lib/python2.6/site-packages/salt/state.py", line 1775, in merge_tops
for tgt in targets:
TypeError: 'NoneType' object is not iterable

你试一下 这个 salt 'redhat5-ict193' state.sls init
把test.sls 更改为init.sls


这样是可以的,成功了,那原来是什么原因呢?
redhat5-ict193:
----------
State: - file
Name: /tmp/test_file
Function: managed
Result: True
Comment: File /tmp/test_file updated
Changes: diff: ---
+++
葱油拌面
葱油拌面

引用来自“btpolo”的评论

你好,我配置完毕,连通性及远程命令都没有问题,但是想尝试进行文件传送报错,能帮我看看嘛,配置文件:
::::::::::::::
top.sls
::::::::::::::
base:
'redhat5-ict193':
- test
::::::::::::::
test.sls
::::::::::::::
/tmp/test_file:
file.managed:
- source: salt://servers/test_file
- owner: root
- group: root
- mode: 644

执行state.highstate报错
[root@]# salt 'redhat5-ict193' state.highstate -v
Executing job with jid 20130904182905817897
-------------------------------------------
redhat5-ict193:
Data failed to compile:
----------
Traceback (most recent call last):
File "/usr/lib/python2.6/site-packages/salt/state.py", line 2196, in call_highstate
top = self.get_top()
File "/usr/lib/python2.6/site-packages/salt/state.py", line 1843, in get_top
return self.merge_tops(tops)
File "/usr/lib/python2.6/site-packages/salt/state.py", line 1775, in merge_tops
for tgt in targets:
TypeError: 'NoneType' object is not iterable

你试一下 这个 salt 'redhat5-ict193' state.sls init
把test.sls 更改为init.sls


b
btpolo
&apos 是单引号
b
btpolo
你好,我配置完毕,连通性及远程命令都没有问题,但是想尝试进行文件传送报错,能帮我看看嘛,配置文件:
::::::::::::::
top.sls
::::::::::::::
base:
'redhat5-ict193':
- test
::::::::::::::
test.sls
::::::::::::::
/tmp/test_file:
file.managed:
- source: salt://servers/test_file
- owner: root
- group: root
- mode: 644

执行state.highstate报错
[root@]# salt 'redhat5-ict193' state.highstate -v
Executing job with jid 20130904182905817897
-------------------------------------------
redhat5-ict193:
Data failed to compile:
----------
Traceback (most recent call last):
File "/usr/lib/python2.6/site-packages/salt/state.py", line 2196, in call_highstate
top = self.get_top()
File "/usr/lib/python2.6/site-packages/salt/state.py", line 1843, in get_top
return self.merge_tops(tops)
File "/usr/lib/python2.6/site-packages/salt/state.py", line 1775, in merge_tops
for tgt in targets:
TypeError: 'NoneType' object is not iterable
葱油拌面
葱油拌面

引用来自“seanlin138”的评论

引用来自“seanlin138”的评论

各位有没有出现过这种报错
Comment: Unable to determine upstream hash of source file 127.0.0.1://servers/common_file.txt

sls配置:
/root/linktmp/common_file.txt:
file:
- managed
- source: 127.0.0.1://servers/common_file.txt

你这个写的都不对:
应该如下:
/root/linktmp/common_file.txt:
file:
- managed
- source: salt://servers/common_file.txt
返回顶部
顶部