本文共 9514 字,大约阅读时间需要 31 分钟。
Salt,,一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯。
salt底层采用动态的连接总线, 使其可以用于编配, 远程执行, 配置管理等等.
多种配置管理工具对比:
Puppet(rubby开发,现在很少使用)ansible(python开发,轻量级,没有agent,大规模环境下使用ssh会很慢,串行传输)Saltstack(python开发,远程执行、配置管理、事件驱动基础设施、使用saltcloud可以管理私有云和公有云)官方文档:<;
官方提供官方yum源:repo.slatstack.com-->可以使用cobbler自定义yum仓库进行同步官方安装源:<;Saltstack组件:SaltMasterSaltMinionExecution 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 |
[root@linux-node1 ~]# yum install https://repo.saltstack.com/yum/redhat/salt-repo-2016.11-2.el7.noarch.rpm[root@linux-node2 ~]# yum install https://repo.saltstack.com/yum/redhat/salt-repo-2016.11-2.el7.noarch.rpm
[root@linux-node1 ~]# yum install -y salt-master[root@linux-node1 ~]# yum install -y salt-minion[root@linux-node2 ~]# yum install -y salt-minion
[root@linux-node1 ~]# systemctl start salt-master #启动salt-master[root@linux-node1 ~]# vim /etc/salt/minion #配置salt-minionmaster: 192.168.56.11 #可以是主机名需要解析(指定服务端的IP地址),冒号有空格id: 唯一标识符,可以不配,不配默认就是主机名[root@linux-node1 ~]# systemctl start salt-minion #启动salt-minion[root@linux-node2 salt]# vim minionmaster: 192.168.56.11 #可以是主机名需要解析(指定服务端的IP地址),冒号有空格id: 唯一标识符,可以不配,不配默认就是主机名[root@linux-node2 salt]# systemctl start salt-minionminion配置中有一个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[root@linux-node2 salt]# cat minion_id www.test123.com[root@linux-node2 salt]# systemctl stop salt-minion[root@linux-node2 salt]# rm -rf pki[root@linux-node2 salt]# rm -rf minion_id [root@linux-node2 salt]# systemctl start salt-minion[root@linux-node2 salt]# cat minion_id linux-node2.example.com
[root@linux-node2 salt]# ll总用量 124-rw-r----- 1 root root 2624 9月 15 23:19 clouddrwxr-xr-x 2 root root 6 9月 16 00:41 cloud.conf.ddrwxr-xr-x 2 root root 6 9月 16 00:41 cloud.deploy.ddrwxr-xr-x 2 root root 6 9月 16 00:41 cloud.maps.ddrwxr-xr-x 2 root root 6 9月 16 00:41 cloud.profiles.ddrwxr-xr-x 2 root root 6 9月 16 00:41 cloud.providers.d-rw-r----- 1 root root 46034 9月 15 23:19 masterdrwxr-xr-x 2 root root 6 9月 16 00:41 master.d-rw-r----- 1 root root 35101 1月 16 10:29 miniondrwxr-xr-x 2 root root 27 1月 16 11:47 minion.d-rw-r--r-- 1 root root 23 1月 16 11:45 minion_iddrwxr-xr-x 3 root root 19 1月 16 11:45 pki-rw-r----- 1 root root 26984 9月 15 23:19 proxydrwxr-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目录下生成公钥和秘钥[root@linux-node2 salt]# ll /etc/salt/pki/minion/总用量 12-rw-r--r-- 1 root root 450 1月 16 11:47 minion_master.pub-r-------- 1 root root 1674 1月 16 11:45 minion.pem-rw-r--r-- 1 root root 450 1月 16 11:45 minion.pub(2)并且在salt-master的/etc/salt/pki/master/minion_pre中存放了salt-minion的公钥。[root@linux-node1 ~]# ll /etc/salt/pki/master/minions_pre/linux-node1.example.comlinux-node2.example.com
[root@linux-node1 salt]# salt-keyAccepted Keys: 同意的Denied Keys: 拒绝的Unaccepted Keys: 等待同意的linux-node1.example.comlinux-node2.example.comRejected Keys:
同意认证的方法:
分为三种:[root@linux-node1 salt]# salt-key -A[root@linux-node1 salt]# salt-key -a 指定id[root@linux-node1 salt]# salt-key -a 支持通配符[root@linux-node1 master]# salt-key -a linux*The following keys are going to be accepted:Unaccepted Keys:linux-node1.example.comlinux-node2.example.comProceed? [n/Y] YKey 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
第一条命令:[root@linux-node1 master]# salt '*' test.pinglinux-node2.example.com: Truelinux-node1.example.com: True说明:salt:命令*:匹配目标,使用通配符test.ping:模块.方法 #此处的ping并非ICMP的ping命令,而是master向minion发送了一个包,minion收到了,返回一个True[root@linux-node1 ~]# 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.05linux-node2.example.com: 11:51:47 up 12 days, 6:26, 2 users, load average: 0.00, 0.03, 0.05[root@linux-node1 ~]# 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 06Jan18 6:51 3.27s 3.27s -bash root pts/3 192.168.56.1 06Jan18 3.00s 6:17 0.46s /usr/bin/python /usr/bin/salt * cmd.run wlinux-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:59m 0.28s 0.28s -bash root pts/3 192.168.56.1 06Jan18 6:59 4.82s 0.02s -bash[root@linux-node1 ~]# salt '*' cmd.run 'df -h'linux-node2.example.com: Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 18G 17G 1.1G 95% / devtmpfs 905M 0 905M 0% /dev tmpfs 916M 12K 916M 1% /dev/shm tmpfs 916M 41M 876M 5% /run tmpfs 916M 0 916M 0% /sys/fs/cgroup /dev/sda1 497M 171M 326M 35% /boot tmpfs 184M 0 184M 0% /run/user/0 /dev/loop0 4.1G 4.1G 0 100% /mntlinux-node1.example.com: Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 18G 11G 7.2G 60% / devtmpfs 905M 0 905M 0% /dev tmpfs 916M 28K 916M 1% /dev/shm tmpfs 916M 57M 860M 7% /run tmpfs 916M 0 916M 0% /sys/fs/cgroup /dev/sda1 497M 171M 326M 35% /boot tmpfs 184M 0 184M 0% /run/user/0[root@linux-node1 ~]# netstat -tulnp|grep minionminion不需要监听端口,说明minion需要主动去链接master,master监听端口为4505、4506[root@linux-node1 ~]# netstat -tulnp|grep pythontcp 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属于底层(传输层)的消息队列,#相当于一个发布与订阅系统,比如你订了一个教室听课,那么所有订了此间课室的人都能听到老师的课程。[root@linux-node1 ~]# lsof -ni:4505COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEsalt-mast 37039 root 16u IPv4 3394584 0t0 TCP *:4505 (LISTEN)salt-mast 37039 root 18u IPv4 3412804 0t0 TCP 192.168.56.11:4505->192.168.56.12:43126 (ESTABLISHED)salt-mast 37039 root 19u IPv4 3412811 0t0 TCP 192.168.56.11:4505->192.168.56.11:38262 (ESTABLISHED)salt-mini 39623 root 27u IPv4 3412810 0t0 TCP 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的并行通信,可以看到是同时返回[root@linux-node1 ~]# salt '*' cmd.run 'date'linux-node2.example.com: Tue Jan 16 12:01:52 CST 2018linux-node1.example.com: Tue Jan 16 12:01:52 CST 2018
YAML样例:house:family:name: Doeparents: - John - Janechildren: - Paul - Mark - Simoneaddress:number: 34street: Main Streetcity: Nowheretownzipcode: 12345
(2)YAML的规则:
①缩进表示层级关系,默认缩进是2个空格、4个空格、6个空格②冒号后面有个空格,以冒号结尾可以有空格,可以无空格③短横线代表一个列表,短横线后面有个空格[root@linux-node1 ~]# vim /etc/salt/master #定义yaml文件放的位置,base环境是必备的file_roots: base: - /srv/salt/base dev: - /srv/salt/dev test: - /srv/salt/test prod: - /srv/salt/prod[root@linux-node1 ~]# mkdir -p /srv/salt/{base,dev,test,prod}[root@linux-node1 ~]# systemctl restart salt-master[root@linux-node1 ~]# cd /srv/salt/base/[root@linux-node1 base]# mkdir web[root@linux-node1 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-------->设置开机自动启动[root@linux-node1 ~]# 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[root@linux-node1 base]# pwd/srv/salt/base[root@linux-node1 base]# vim top.sls #必须在base环境下写base: 'linux-node1.example.com': - web.apache 'linux-node2.example.com': - web.apache****************************如果只有一个任务在全部机子上执行,也可以:base: '*' - web.apache****************************[root@linux-node1 ~]# salt '*' state.highstate #去top.sls读取,*代表通知哪些主机salt '*' state.highstate test=True #在不想影响当前主机的运行情况,可以使用test=True 进行预测试
转载于:https://blog.51cto.com/jinlong/2061645