Salt 和 Puppet Chef 同样可让你同时在多台服务器上执行命令也包括安装和配置软件。Salt 有两个主要的功能:配置管理和远程执行。html
wget -q -O- "http://debian.saltstack.com/debian-salt-team-joehealy.gpg.key" | apt-key add - echo "deb http://debian.saltstack.com/debian wheezy-saltstack main" /etc/apt/sources.list
add-apt-repository ppa:saltstack/salt 或 echo deb http://ppa.launchpad.net/saltstack/salt/ubuntu `lsb_release -sc` main | tee /etc/apt/sources.list.d/saltstack.list wget -q -O- "http://keyserver.ubuntu.com:11371/pks/lookup?op=get&search=0x4759FA960E27C0A6" | apt-key add -
<pre> apt-get update apt-get install salt-master # On the salt-master apt-get install salt-minion # On each salt-minion apt-get install salt-syndic </pre>node
rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm或python
rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm/linux
<pre> [epel] name=Extra Packages for Enterprise Linux 6 baseurl=http://download.fedoraproject.org/pub/epel/6/x86_64 failovermethod=priority enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 </pre>git
<pre> yum update yum install salt-master # On the salt-master yum install salt-minion # On each salt-minion </pre>github
saltstack 的配置文件格式web
Salt默认使用PyAMl语法(http://pyyaml.org) 做为它的模板文件的格式,其余不少模板语言在Salt中是可使用的。 必定要按照正确的格式书写YAML,好比最基本的,它使用到两个空格代替tab,: 或 - 后面要有空格。正则表达式
例一:shell
<pre> interface: 0.0.0.0 log_file: /var/log/salt/master key_logfile: /var/log/salt/key </pre>json
例二:
<pre> file_roots: base: - /srv/salt </pre>
主控端基本设置 编辑配置文件 /etc/salt/master,修改以下所示配置项,去掉前面的注释符
<pre> interface: 0.0.0.0 # interface (服务端监听IP),0.0.0.0 是监听全部IP log_file: /var/log/salt/master # 记录主控端运行日志 key_logfile: /var/log/salt/key # 记录认证证书日志 </pre>
master默认监听两个端口, 4505(publish_port)为salt的消息发布系统,4506(ret_port)为salt客户端与服务端通讯的端口,因此确保客户端能跟服务端的这2个端口通讯
受控端基本设置 编辑配置文件 /etc/salt/minion,修改以下所示配置项,去掉前面的注释符#
<pre> master: 42.121.124.237 # 设置主控端IP id: ubuntu-server-001 # 设定受控端编号 log_file: /var/log/salt/minion # 记录受控端服务日志 key_logfile: /var/log/salt/key # 记录认证证书日志 </pre>
最基本字段:
小技巧:查看配置文件信息,过滤注释语句
<pre> sed -e '/^#/d;/^$/d' /etc/salt/minion </pre>
主控端,和受控端 启动各自的服务,确保服务启动后没有任何报错信息,若是异常请检查相应日志文件处理
<pre> 主控端: service salt-master restart 受控端: service salt-minion restart </pre>
若是一切顺利,请继续!
saltstack 主控端是依靠openssl证书来与受控端主机认证通信的,受控端启动后会发送给主控端一个公钥证书文件,在主控端用 salt-key 命令来管理证书。
salt minion和master的认证过程:
minion在第一次启动时,会在/etc/salt/pki/minion/下自动生成minion.pem(private key), minion.pub(public key),而后将minion.pub发送给master
master在接收到minion的public key后,经过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的public key, 而后master就能对minion发送指令了
<pre> salt-key -L # 用来查看证书状况 salt-key -a <hostn> # 用来管理接受证书 </pre>
受控端证书认证后会显示以下情形:
<pre> Accepted Keys: ubuntu-server-001 Unaccepted Keys: Rejected Keys: </pre>
主控端和被控端的证书默认都存放在 /etc/salt/pki/ 中,若是遇到证书不生效的状况下,可在主控端证书存放目录删除受控端证书,从新认证一下。
你能够从master 使用一个内置命令 test.ping 来测试他们之间的链接
<pre> salt '*' cmd.run test.ping </pre>
它应该有以下输出:
<pre> ubuntu-server-001: True </pre>
测试与外网的链接
<pre> salt '*' cmd.run "ping -c 4 baidu.com" </pre>
salt更多命令及手册
<pre> salt '*' sys.doc </pre>
若是能返回正确结果,salt的基本配置就完成了。
salt按照操做模式能够分为实时管理和配置管理:
远程执行,也能够称为实时管理: 经过执行命令来完成管理任务,优势就是实时性高,缺点就是没法跟踪,保存配置状态; 配置管理,也能够称为状态管理: 经过编写特定的文件用来记录目标系统的配置状态,而后将这些受控主机会按期同步这些配置状态信息;
有时候咱们须要临时的查看一台或多台机器上的某个文件,或者执行某个命令,最通用的模块是 cmd.run
<pre> 格式: 命令 对象 执行模块 参数 示例:salt '*' cmd.run "ping -c 4 baidu.com" </pre>
salt也将一些经常使用的命令作了集成,好比,查看全部节点磁盘使用状况:
<pre> salt '*' disk.usage </pre>
其余命令示例:
<pre> salt '*' grains.ls 查看grains分类 salt '*' grains.items 查看grains全部信息 salt '*' grains.item osrelease 查看grains某个信息 salt '*' pillar.items 查看pillar全部信息 </pre>
更多请参考文档:http://docs.saltstack.com/ref/modules/all/index.html
做用:对minion进行分组
参考文档: http://docs.saltstack.com/topics/targeting/nodegroups.html
编辑 /etc/salt/master 启用分组,最基本分组示例:
<pre> nodegroups: UBUNTU: 'ubuntu-12.04-*' CENTOS: 'centos-6.4-*' </pre>
创建分组以后,操做对象使用分组功能才生效,更多示例:
<pre> nodegroups: group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com or bl*.domain.com' group2: 'G@os:Debian and foo.domain.com' </pre>
在state或者pillar中引用的时候,以下:
<pre> base: group1: - match: nodegroup - webserver </pre>
请确保这条属性存在
<pre> - match: nodegroup </pre>
更多请参考文档:http://docs.saltstack.com/topics/targeting/nodegroups.html
从最基本的测试命令来说述:
<pre> salt '*' test.ping </pre>
引号中以实现很强大的minion的过滤与匹配技术
经常使用命令:
<pre> salt 'shell正则' 命令 salt -E 'prel 正则' 命令 salt -N GroupName 命令 salt -L 'server_id1,server_id2,server_id3' 命令 </pre>
示例:
<pre> salt -C 'webserv* and G@os:Debian or E@web-dc1-srv.*' test.ping </pre>
更多请参考官方文档: http://docs.saltstack.com/topics/targeting/compound.html
我的理解,管理一个服务器应用能够从 软件包,配置文件,服务管理 这个三个最基本角度来出发,要启用配置管理,首先应对受控端进行额外的配置
配置受控端主机,以root用户身份来接受主控端主机的管理
<pre>user: root</pre>
Salt的配置管理指令和文件保存在默认在/srv/salt目录下,这里存放着全部的配置文件,和一些你想要拷贝到从服务器的文件。
配置主控端,编辑 /etc/salt/master 文件
<pre> file_roots: base: - /srv/salt </pre>
手动建立目录和配置文件 /srv/salt/top.sls
<pre> base: '*': - ubuntu.vim </pre>
__ 详细解释一下这个本配置文件的参数 __
一个简单的例子:ubuntu 基本系统默是不安装 vim 咱们能够利用配置管理把被托管的ubuntu主机所有安装上vim
编辑 /srv/salt/ubuntu/vim.sls
<pre> vim: pkg: - name: vim - installed </pre>
执行命令
<pre>salt '*' state.highstate </pre>
请注意观察返回结果,查看/var/log/salt/下面的日志来调试saltstack配置。
一个更复杂的例子:管理ssh服务,而且使用salt托管配置文件
<pre> base: '*': - ubuntu.ssh </pre>
<pre> ssh: pkg: - name: ssh - installed service: - name: ssh - running - reload: True - watch: - file: /etc/ssh/ssh_config /etc/ssh/ssh_config: file.managed: - source: salt://ubuntu/ssh_config - user: root - group: root - mode: 644 </pre>
简要解释一下配置文件
一样,使用以下命令来验证结果须要
<pre> salt '*' state.highstate </pre>
rpm deb 不一样包管理体系,不一样发行版二进制包拆分命名规则不尽相同,相比之下 deb 拆分的力度要更细些。
RHEL6/CentOS 软件包列表
Deian/Ubuntu 软件包列表
下面按照服务端(主控端)和客户端(受控端)来讲明主要功能项。
<pre> default_include: master.d/*.conf </pre>
<pre> default_include: master.d/*.conf </pre>
测试与受控主机网络是否通畅 <pre>salt '*' cmd.run test.ping </pre>
在所有受控主机行执行命令 <pre>salt '*' cmd.run "uptime" </pre>
使用 -E 按照正则匹配操做对象 <pre>salt -E 'ubuntu*' cmd.run "uptime" </pre>
使用 -N 按照分组匹配操做对象 <pre>salt -N 'UBUNTU-GROUPS' cmd.run "uptime" </pre>
使用 -G 按照查询信息匹配操做对象选项 <pre>salt -G 'cpuarch:x86_64' grains.item num_cpus </pre>
查看受控端模块函数帮助信息 <pre>salt '*' sys.doc</pre>
查看受控端模块函数帮助信息 <pre>salt '*' sys.doc service</pre>
*批量复制文件到受控主机
<pre> salt-cp '*' /home/vmdisk.img /var/lib/libvirtsh/vmdisk.img </pre>
*拷贝小文件颇有效,简单测试,拷贝2.5MB以上的文件就会超时报错
salt-run 是用于管理虚拟机的命令
编辑配置文件 /etc/salt/roster
<pre> ubuntu-12.04-001: host: 10.8.0.18 user: root passwd: root sudo: True </pre>
salt的master和minion的交互很大程度上都和网络有关系,好比在管理多个国家的机器的时候(好比大中华局域网),一个master控制多个master,同时被控制的master又能够控制不少的minion,就比如是在 master 和 minions 之间又加了一层的分布式架构。
启动服务 <pre> salt-minion -d </pre>
问题:
建议:
A: Salt配置仓库托管的配置文件是否支持符号连接?
Q: Salt配置仓库支持文件符号连接。
A: salt 配置仓库中配置项存在致命错误状况可否回滚?
Q: 主要保证受控端主机网络通畅,配置仓库结合svn版本控制工具,就能够实现回滚功能。
A: salt 是否支持测试执行?
Q: Salt支持执行测试,须要作的仅仅是将Test设置为True
<pre> salt 'minion1.example.com' state.highstate -v test=True </pre>
A: salt 是否支持配置模板?
Q: Salt默认使用yaml_jinja渲染器,还支持其余渲染器,包括:yaml_mako,使用Mako模板引擎;yaml_wempy,使用Wempy模板引擎;py,直接使用Python写SLS文件;pydsl,创建在Python语法基础上的描述语言。
A: 如何输出给程序解析结果?
Q: salt 能够将执行结果是输出为json格式,yaml等格式,见salt PDF文档 756 页!例如:
<pre>salt '*' test.ping --out json state.show_highstate --out yaml state.show_sls edit.vim --out pprint </pre>