SaltStack入门篇之远程执行和配置管理
一、SaltStack概述
Salt,,一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯。
salt底层采用动态的连接总线, 使其可以用于编配, 远程执行, 配置管理等等.
多种配置管理工具对比:
Puppet(rubby开发,现在很少使用)
ansible(python开发,轻量级,没有agent,大规模环境下使用ssh会很慢,串行传输)
Saltstack(python开发,远程执行、配置管理、事件驱动基础设施、使用saltcloud可以管理私有云和公有云)
官方文档:<https://docs.saltstack.com/en/getstarted/>;
官方提供官方yum源:repo.slatstack.com-->可以使用cobbler自定义yum仓库进行同步
官方安装源:<http://repo.saltstack.com/2016.11.html#rhel>;
Saltstack组件:
SaltMaster
SaltMinion
Execution Modules
环境说明:
主机名 IP地址 说明 系统
linux-node1.example.com 192.168.56.11 模式:master Centos 7.4
linux-node2.example.com 192.168.56.12 模式:minion Centos 7.4
二、SaltStack安装
1.安装指定的yum源
# yum install https://repo.saltstack.com/yum/redhat/salt-repo-2016.11-2.el7.noarch.rpm
# yum install https://repo.saltstack.com/yum/redhat/salt-repo-2016.11-2.el7.noarch.rpm
2.安装salt-master和salt-minion
# yum install -y salt-master
# yum install -y salt-minion
# yum install -y salt-minion
3.修改minion配置并启动
# systemctl start salt-master #启动salt-master
# vim /etc/salt/minion #配置salt-minion
master: 192.168.56.11 #可以是主机名需要解析(指定服务端的IP地址),冒号有空格
id: 唯一标识符,可以不配,不配默认就是主机名
# systemctl start salt-minion #启动salt-minion
# vim minion
master: 192.168.56.11 #可以是主机名需要解析(指定服务端的IP地址),冒号有空格
id: 唯一标识符,可以不配,不配默认就是主机名
# systemctl start salt-minion
minion配置中有一个id配置,默认是hostname,如果id配置和hostname不一致会导致无法进行通信,那么当hostname做了修改,或者错误的时候该怎么配置呢?
①关闭salt-minion
②salt-key -d id在master上删除minion的id
③minion上删除pki目录
④minion上删除minion_id文件
⑤修改完成,启动minion
#此处必须先停掉minion修改,并删除相应的文件,否则会默认地去查找原先的配置,已踩坑
#以下是刚装完查看minion_id变成了www.test123.com。进行修改成linux-node2.example.com
# cat minion_id
www.test123.com
# systemctl stop salt-minion
# rm -rf pki
# rm -rf minion_id
# systemctl start salt-minion
# cat minion_id
linux-node2.example.com
4.配置说明
# ll
总用量 124
-rw-r----- 1 root root2624 9月15 23:19 cloud
drwxr-xr-x 2 root root 6 9月16 00:41 cloud.conf.d
drwxr-xr-x 2 root root 6 9月16 00:41 cloud.deploy.d
drwxr-xr-x 2 root root 6 9月16 00:41 cloud.maps.d
drwxr-xr-x 2 root root 6 9月16 00:41 cloud.profiles.d
drwxr-xr-x 2 root root 6 9月16 00:41 cloud.providers.d
-rw-r----- 1 root root 46034 9月15 23:19 master
drwxr-xr-x 2 root root 6 9月16 00:41 master.d
-rw-r----- 1 root root 35101 1月16 10:29 minion
drwxr-xr-x 2 root root 27 1月16 11:47 minion.d
-rw-r--r-- 1 root root 23 1月16 11:45 minion_id
drwxr-xr-x 3 root root 19 1月16 11:45 pki
-rw-r----- 1 root root 26984 9月15 23:19 proxy
drwxr-xr-x 2 root root 6 9月16 00:41 proxy.d
-rw-r----- 1 root root 344 9月15 23:19 roster
说明:
(1)salt-minion首次启动会在/etc/salt/pki/minion目录下生成公钥和秘钥
# ll /etc/salt/pki/minion/
总用量 12
-rw-r--r-- 1 root root450 1月16 11:47 minion_master.pub
-r-------- 1 root root 1674 1月16 11:45 minion.pem
-rw-r--r-- 1 root root450 1月16 11:45 minion.pub
(2)并且在salt-master的/etc/salt/pki/master/minion_pre中存放了salt-minion的公钥。
# ll /etc/salt/pki/master/minions_pre/
linux-node1.example.com
linux-node2.example.com
5.配置salt-master和slat-minion通信
# salt-key
Accepted Keys: 同意的
Denied Keys: 拒绝的
Unaccepted Keys: 等待同意的
linux-node1.example.com
linux-node2.example.com
Rejected Keys:
同意认证的方法:
分为三种:
# salt-key -A
# salt-key -a 指定id
# salt-key -a 支持通配符
# salt-key -a linux*
The following keys are going to be accepted:
Unaccepted Keys:
linux-node1.example.com
linux-node2.example.com
Proceed? Y
Key for minion linux-node1.example.com accepted.
Key for minion linux-node2.example.com accepted.
salt-key 命令参数介绍
-L列出所有
-d 删除指定的支持通配符
-D 删除所有
-A 添加所有
-a 指定添加
同意之后生成的文件
pki/
├── master
│ ├── master.pem
│ ├── master.pub
│ ├── minions
│ │ ├── linux-node1.example.com
│ │ └── linux-node2.example.com
│ ├── minions_autosign
│ ├── minions_denied
│ ├── minions_pre
│ └── minions_rejected
└── minion
├── minion_master.pub同意之后master发送公钥
├── minion.pem
└── minion.pub
三、SaltStack远程执行和配置管理
1.远程执行
第一条命令:
# salt '*' test.ping
linux-node2.example.com:
True
linux-node1.example.com:
True
说明:
salt:命令
*:匹配目标,使用通配符
test.ping:模块.方法
#此处的ping并非ICMP的ping命令,而是master向minion发送了一个包,minion收到了,返回一个True
# salt '*' cmd.run 'uptime'
linux-node1.example.com:
11:51:47 up 21 days,5:57,2 users,load average: 0.04, 0.03, 0.05
linux-node2.example.com:
11:51:47 up 12 days,6:26,2 users,load average: 0.00, 0.03, 0.05
# salt '*' cmd.run 'w'
linux-node1.example.com:
11:52:11 up 21 days,5:58,2 users,load average: 0.03, 0.02, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/2 192.168.56.1 06Jan186:51 3.27s3.27s -bash
root pts/3 192.168.56.1 06Jan183.00s6:17 0.46s /usr/bin/python /usr/bin/salt * cmd.run w
linux-node2.example.com:
11:52:11 up 12 days,6:26,2 users,load average: 0.00, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/1 192.168.56.1 Mon10 21:59m0.28s0.28s -bash
root pts/3 192.168.56.1 06Jan186:59 4.82s0.02s -bash
# salt '*' cmd.run 'df -h'
linux-node2.example.com:
Filesystem SizeUsed Avail Use% Mounted on
/dev/mapper/centos-root 18G 17G1.1G95% /
devtmpfs 905M 0905M 0% /dev
tmpfs 916M 12K916M 1% /dev/shm
tmpfs 916M 41M876M 5% /run
tmpfs 916M 0916M 0% /sys/fs/cgroup
/dev/sda1 497M171M326M35% /boot
tmpfs 184M 0184M 0% /run/user/0
/dev/loop0 4.1G4.1G 0 100% /mnt
linux-node1.example.com:
Filesystem SizeUsed Avail Use% Mounted on
/dev/mapper/centos-root 18G 11G7.2G60% /
devtmpfs 905M 0905M 0% /dev
tmpfs 916M 28K916M 1% /dev/shm
tmpfs 916M 57M860M 7% /run
tmpfs 916M 0916M 0% /sys/fs/cgroup
/dev/sda1 497M171M326M35% /boot
tmpfs 184M 0184M 0% /run/user/0
# netstat -tulnp|grep minion
minion不需要监听端口,说明minion需要主动去链接master,master监听端口为4505、4506
# netstat -tulnp|grep python
tcp 0 0 0.0.0.0:4505 0.0.0.0:* LISTEN 37039/python
tcp 0 0 0.0.0.0:4506 0.0.0.0:* LISTEN 37045/python
#master和minion默认使用一个叫zeroMQ进行并行通信,zeroMQ属于底层(传输层)的消息队列,
#相当于一个发布与订阅系统,比如你订了一个教室听课,那么所有订了此间课室的人都能听到老师的课程。
# lsof -ni:4505
COMMAND PID USER FD TYPEDEVICE SIZE/OFF NODE NAME
salt-mast 37039 root 16uIPv4 3394584 0t0TCP *:4505 (LISTEN)
salt-mast 37039 root 18uIPv4 3412804 0t0TCP 192.168.56.11:4505->192.168.56.12:43126 (ESTABLISHED)
salt-mast 37039 root 19uIPv4 3412811 0t0TCP 192.168.56.11:4505->192.168.56.11:38262 (ESTABLISHED)
salt-mini 39623 root 27uIPv4 3412810 0t0TCP 192.168.56.11:38262->192.168.56.11:4505 (ESTABLISHED)
查看4505端口,我们可以发现salt-minion使用一个随机端口通过4505端口与salt-master通信,master使用4505端口发送指定到salt-minion上进行执行。而4606端口是用于接收数据的返回,用于zeroMQ的请求与响应的系统。
可以通过date命令查看salt的并行通信,可以看到是同时返回
# salt '*' cmd.run 'date'
linux-node2.example.com:
Tue Jan 16 12:01:52 CST 2018
linux-node1.example.com:
Tue Jan 16 12:01:52 CST 2018
2.配置管理
(1)saltstack是使用YAML的格式作为管理文件的格式,下面的YAML的样例:
YAML样例:
house:
family:
name: Doe
parents:
- John
- Jane
children:
- Paul
- Mark
- Simone
address:
number: 34
street: Main Street
city: Nowheretown
zipcode: 12345
(2)YAML的规则:
①缩进表示层级关系,默认缩进是2个空格、4个空格、6个空格
②冒号后面有个空格,以冒号结尾可以有空格,可以无空格
③短横线代表一个列表,短横线后面有个空格
(3)定义yaml文件放的位置:salt内置一个fileserver,在master文件配置:file_roots
# vim /etc/salt/master #定义yaml文件放的位置,base环境是必备的
file_roots:
base:
- /srv/salt/base
dev:
- /srv/salt/dev
test:
- /srv/salt/test
prod:
- /srv/salt/prod
# mkdir -p /srv/salt/{base,dev,test,prod}
# systemctl restart salt-master
# cd /srv/salt/base/
# mkdir web
# vim apache.sls #编写安装apache的YAML文件
apache-install:
pkg.installed:---------->模块pkg,方法installed,会匹配操作系统进行选择安装的方法
- name: httpd--------->装的包的名称
apache-service:----------->id要唯一
service.running:-------->状态模块service,running为模块的方法
- name: httpd--------->管理服务的名称
- enable: True-------->设置开机自动启动
# salt 'linux-node2.example.com' state.sls web.apache
#如果apache.sls的位置是在prod目录下,需要在后面增加saltenv=prod
#salt 'linux-node2.example.com' state.sls web.apache saltenv=prod
实现自动化安装,需要写一个top.sls
# pwd
/srv/salt/base
# vim top.sls #必须在base环境下写
base:
'linux-node1.example.com':
- web.apache
'linux-node2.example.com':
- web.apache
****************************
如果只有一个任务在全部机子上执行,也可以:
base:
'*'
- web.apache
****************************
# salt '*' state.highstate #去top.sls读取,*代表通知哪些主机
salt '*' state.highstate test=True #在不想影响当前主机的运行情况,可以使用test=True 进行预测试
页:
[1]