SaltStack部署
saltstack 简介
Salt 是一个统一配置管理工具(与 puppet 功能相似)。可以批量远程执行命令、修改配置文件、部署软件、定时执行任务…… 总之,你能想到的,从远程对服务器执行的操作,它几乎都能做,而且可以批量对一批服务器做。
Salt 采用 master(server) - minion(client) 模式。具有很好的水平拓展性,以 “支持无限多个 client” 为设计目标。
总体架构
todo:图片
- Salt Master 控制中心。
- Salt Minion 装在被操作的服务器上。
- Grains 是每一台 Minion 自身的 静态 属性。以 Python 字典的形式存放在 Minion 端。
- Pillar 存放 key-value 变量。存放在 Master 端,由 Master 编译好后,下发给 Minion。所以,可以存放密码之类的涉密的或是一些需要统一配置的变量。
- State 希望由 Salt 执行的一套操作。(比如 “安装 vim、配置 vim” 可以写在一个 state 里,也可以拆成两个 state 写。)执行时,Master 将 states 生成好,下发给 Minion,由 Minion 执行 states (转化成一条条命令)。
1.安装epel包
For RHEL/CentOS 5
rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/5/x86_64/epel-release-5-4.norach.rpm
For RHEL/CentOS 6
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
2.master 服务器端
安装
yum install -y salt-master
配置
打开/etc/salt/master 主配置文件;添加如下配置
vim /etc/salt/master
interface: 192.168.178.165
auto_accept: True
==注意:注意冒号后面一定要有一个空格,yaml格式==
开机启动
chkconfig salt-master on
查看服务器端开放的端口
netstat -lntup
# 4505 4505(publish_port)为 salt 的 消息发布系统,
# 4506 4506(ret_port)为 salt 客户端与服务端通信的端口。
3.客户端:
安装
yum install salt-minion
配置
minion端至少需要配置两项,id和master需要指定。
1.id: 这台主机的唯一标识! 就像mac地址一样!
2.master: 指定salt master的IP地址或域名!
==注意:注意冒号后面一定要有一个空格。==
$ vim /etc/salt/minion
#id: salt.client.id 不配置,默认为主机名称
#此配置必须配置在默认配置文件注释位置;
#不然,master 无法发现
master: 192.168.178.165
4.启动
启动master
service salt-master restart
启动minion
service salt-minion restart
其他启动方式
/usr/bin/python2.6 /usr/bin/salt-master -d
/usr/bin/python2.6 /usr/bin/salt-minion -d
日志查看路径:(有问题可查日志获取出错信息)
服务端:/var/log/salt/master
客户端:/var/log/salt/minion
master与minion的认证
master 主机执行
salt-key -L #查看所有主机
#没有接受的key会显示在Unaccepted Keys下
salt-key -A #接受所有主机
salt-key -D #删除所有主机
salt-key -a node1.salt.com #接受指定的主机
salt-key -d node1.salt.com #删除指定的主机
==一般情况下,master不会在配置文件中开启自动授权==
测试连通性
master 执行
salt '*' test.ping
node1.salt.com:
True
[root@salt-master salt]# salt --versions-report
Salt: 2015.5.10
Python: 2.6.6 (r266:84292, Jul 23 2015, 15:22:56)
Jinja2: 2.2.1
M2Crypto: 0.20.2
msgpack-python: 0.4.6
msgpack-pure: Not Installed
pycrypto: 2.0.1
libnacl: Not Installed
PyYAML: 3.10
ioflo: Not Installed
PyZMQ: 14.3.1
RAET: Not Installed
ZMQ: 3.2.5
Mako: Not Installed
Tornado: Not Installed
timelib: Not Installed
dateutil: 1.4.1
至此,安装完成;
salt 基本说明及使用
在服务端 salt 匹配 minion id
在运行 salt 命令进行匹配时,请使用单引号(‘),避免 shell 解析
匹配所有 minion:salt ‘*’ test.ping
匹 配 example.net域中的:salt ‘web?.example.net’ test. ping
匹配web1到web5的minion:salt ‘web[1-5]’ test.ping
匹配web-x、web-y及web-z minion:salt ‘web-[x-z]’ test.ping正则表达式
匹配web-prod和web1-devel minion:
salt -E ‘web1-(prod|devel)’ test.ping
指定列表
salt -L ‘web1,web2,web3’ test.ping指定组:
在服务务端中打开 master 配置文件 vim /etc/salt/master 添加如下分组
nodegroups:
group1: 'salt-slave01'
group2: 'L@salt-slave01,salt-slave02'
==* 注意yaml格式;前面是 2 个空格*==
测试
[root@salt-master salt]# salt -N group2 test.ping
salt-slave02:
True
salt-slave01:
True
[root@salt-master salt]# salt -N group1 test.ping
salt-slave01:
True
group1 中为什么会有 L@,这代表什么意思;见下解释
>
Letter Match Type Example
G Grains glob G@os:Ubuntu
E PCRE minion ID E@web\d+.(dev|qa|prod).loc
P Grains PCRE P@os:(RedHat|Fedora|CentOS)
L List of minions L@minion1.example.com, minion3.domain.com
I Pillar glob I@pdata:foobar
S Subnet/IP address S@192.168.1.0/24 or S@192.168.1.100
R Range cluster R@%foo.bar
>
Saltstack 配置管理流程
Salt使用State模块文件进行配置管理,使用Y AML编写,以.sls结尾。如果进行配 置管理首先需要再Master的配置文件中指定”file roots”的选项,Salt支持环境的配 置,比如测试环境和生产环境但是base环境是必须的。而且Base环境必须包含入 口文件top.sls。
配置软件安装
告诉 Salt 你的配置管理文件在哪里。根据你是如何安装 Salt,有时你需要自己创建
/srv/salt 目录,服务端 master 配置文件中,默认是:
file_roots:
base:
- /srv/salt
/srv/salt 目录结构
[root@salt-master salt]# tree /srv/salt
/srv/salt
├── apache
│ ├── apache.sls
│ └── httpd.conf
├── git
│ ├── install.sls
│ └── remove.sls
├── testshell
│ ├── test.sh
│ └── test.sls
└── top.sls
[root@salt-master salt]# cat top.sls
base:
'salt-slave01':
- apache.apache
'salt-slave01':
- testshell.test
[root@salt-master salt]# cat apache/apache.sls
apache:
service:
- name: httpd
- running
- reload: True
- watch:
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file:
- managed
- source: salt://apache/httpd.conf
- backup: minion
[root@salt-master salt]# cat git/install.sls
git_install:
pkg.installed:
- name: git
[root@salt-master salt]# cat testshell/test.sls
nginx_install:
cmd.script:
- source: salt://testshell/test.sh
- user: root
- shell: /bin/bash
[root@salt-master salt]# cat testshell/test.sh
#!/bin/bash
echo hostname
echo date
echo `date` >> /tmp/salt_test.md
salt 'salt-slave01' state.highstate test=True
salt 'salt-slave01' state.highstate
salt 'salt-slave01' state.sls testshell.test
salt 'salt-slave01' pkg.remove git
[root@salt-master salt]# salt 'salt-slave01' sys.list_functions pkg
salt-slave01:
- pkg.available_version
- pkg.check_db
- pkg.clean_metadata
- pkg.del_repo
- pkg.diff
- pkg.download
- pkg.expand_repo_def
- pkg.file_dict
- pkg.file_list
- pkg.get_locked_packages
- pkg.get_repo
- pkg.group_diff
- pkg.group_info
- pkg.group_install
- pkg.group_list
- pkg.hold
- pkg.install
- pkg.latest_version
- pkg.list_holds
- pkg.list_pkgs
- pkg.list_repo_pkgs
- pkg.list_repos
- pkg.list_upgrades
- pkg.mod_repo
- pkg.modified
- pkg.normalize_name
- pkg.owner
- pkg.purge
- pkg.refresh_db
- pkg.remove
- pkg.unhold
- pkg.upgrade
- pkg.upgrade_available
- pkg.verify
- pkg.version
- pkg.version_cmp
[root@salt-master salt]# salt 'salt-slave01' sys.list_functions cmd
salt-slave01:
- cmd.exec_code
- cmd.exec_code_all
- cmd.has_exec
- cmd.retcode
- cmd.run
- cmd.run_all
- cmd.run_chroot
- cmd.run_stderr
- cmd.run_stdout
- cmd.script
- cmd.script_retcode
- cmd.shell
- cmd.shells
- cmd.tty
- cmd.which
- cmd.which_bin
[root@salt-master salt]#
基本说明
配置文件
/etc/salt/master #master 配置文件修改之后无需重启
/etc/salt/minion #minion 客户端配置文件,修改后需要重启
文件位置
State 文件 默认存放在 /srv/salt
Pillar 文件 默认存放在 /srv/pillar
基本使用
启动 Salt
# 根据自己需要,选择以下启动方式
salt-master
salt-master -d # daemonize the process
sudo service salt-master start # linux service
salt-master --log-level=debug
salt-minion
salt-minion -d # daemonize the process
sudo service salt-minion start # linux service
执行 Salt 命令
salt '<target>' <function> [arguments]
target
用来指定对哪些 minion 执行操作。可以匹配 minion id 或 Grains。
# 支持正则表达、列表以及 id/grains 混合。
# 普通 (按 minion-id 过滤)
salt '*.example.org' test.ping
# 正则表达 (regular expression)
salt -E 'virtmach[0-9]' test.ping
# 列表 (list)
salt -L 'foo,bar,baz,quo' test.ping
# 混合型 (combined)
salt -C 'G@os:Ubuntu and webser* or E@database.*' test.ping
| Letter | Match Type | Example |
| :----- | :----------------- | :---------------------------------- |
| G | Grains glob | G@os:Ubuntu |
| E | 正则匹配 Minion ID | E@web\d+\.(dev\|qa\|prod)\.loc |
| P | Grains 正则匹配 | P@os:(RedHat\|Fedora\|CentOS) |
| L | List of minions | L@minion1,minion3 or bl*.domain.com |
| I | Pillar glob | I@pdata:foobar |
| S | Subnet/IP address | S@192.168.1.0/24 or S@192.168.1.100 |
| R | Range cluster | R@%foo.bar |
function:
指定执行哪个命令模块(module)。
要习惯从下面这个 salt builtin execution modules 列表中寻找自己需要的,点进去看详细的命令参数。
http://docs.saltstack.com/en/latest/ref/modules/all/
常用的举例:
salt '*' test.ping
salt '*' cmd.run "ls -l | awk '/foo/{print \$2}'"
salt '*' state.sls xxx
arguments:
module 的参数。通过空格分隔,加在 function 后面。 比如:-l debug 输出 debug 信息
salt 命令参数:http://docs.saltstack.com/en/latest/ref/cli/salt.html
salt module 使用指南:http://docs.saltstack.cn/topics/tutorials/modules.html
salt builtin execution modules 列表: http://docs.saltstack.com/en/latest/ref/modules/all/
salt logging 指南:
http://salt.readthedocs.org/en/latest/ref/configuration/logging/index.html
http://blog.appcheckin.com/2015/12/10/saltstack-tutorial/
配置文件;说的很详细
http://www.jixuege.com/?id=32
saltapi
123456
crt key 123456
补充
ps -ef | grep -i salt | grep -v saltsta+ | grep -v grep
salt-master -l debug
必要时可祭出日志文件查看日志:
cat /var/log/salt/minion
cat /var/log/salt/master
缓存目录
/var/cache/salt/minion
#tcp端口显示如下认为ok
#http://blog.csdn.net/u010842538/article/details/51702108
[root@test1-1053 ~]# netstat -ntau | grep -E "450"
tcp 0 0 172.16.10.53:4505 0.0.0.0:* LISTEN
tcp 0 0 172.16.10.53:4506 0.0.0.0:* LISTEN
tcp 0 0 172.16.10.53:4506 172.16.10.55:34850 ESTABLISHED
tcp 0 0 172.16.10.53:4505 172.16.10.55:44483 ESTABLISHED
tcp 0 0 172.16.10.53:4506 172.16.10.54:60344 ESTABLISHED
tcp 0 0 172.16.10.53:4505 172.16.10.54:44852 ESTABLISHED
time salt '*' test.ping
[root@test1-1053 private]# time salt '*' test.ping
test2-1054:
True
test3-1055:
True
这个时间长,是因为本地dns解析很慢导致;
real 0m31.215s
user 0m0.781s
sys 0m0.144s
http://172.16.10.53:8888/events?token=beda0c99e5f86f1d09602399a30b6e4c16950592
查看还在运行的程序:
salt-run jobs.active
查看以前的操作历史记录来:
salt-run jobs.list_jobs
查看制定的jid,来查看返回的信息
salt-run jobs.lookup_jid <job id number>
#只是在minion本地拷贝文件;注意:是minion 自己拷贝自己机器文件;不是跨同步
salt 'test2-1054' file.copy /tmp/aa.log /tmp/bb.log
#修改文件所有者
salt 'test2-1054' file.chown '/home/liuliwei_bak/src/me' liuliwei liuliwei
#文件追加内容
salt 'test2-1054' file.append '/home/liuliwei_bak/src/me' 'test append fsadsfsad'
#对比文件md5;md5sum filel
salt 'test2-1054' file.check_hash '/home/liuliwei_bak/src/me' md5:111b64d5671788e7ffaef9637ec3613f
#获取文件之行权限
salt 'test2-1054' file.get_mode /tmp/aa.log
问题
dns解析慢有可能造成此问题
Salt request timed out. The master is not responding. If this error persists after verifying the master is up, worker_threads may need to be increased.
作者:{微尘大海}(weichenddahai),日期:2016-6-17, email:784456305@qq.com