文章目录
server1 :192.168.1.11 master端
server2 : 192.168.1.12 minion端
server3 : 192.168.1.13 minion端
saltstack简介
- saltstack是一个配置管理系统,能够维护预定义状态的远程节点。
- saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。
- saltstack是运维人员提高工作效率、规范业务配置与操作的利器。
Salt的核心功能
-
使命令发送到远程系统是并行的而不是串行的
-
使用安全加密的协议
-
使用最小最快的网络载荷
-
提供简单的编程接口
-
Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。
-
区别:
Salt 和ansible 最大的区别在于salt是具有客户端的,而 ansible 没有,salt 直接获取root权限进行访问
saltstack通信机制
- SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ(轻量级)消息队列通信,默认监听4505端口。saltstack的优势就在于这个ZMQ,它运行起来的速度比ansible快很多
- Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口,就是接受客户端的回执的。
安装与配置
-
进入官网下载,或者使用国内的开源镜像网站(如清华大学镜像和中科大镜像网站或者阿里云)进行下载:
yum install https://mirrors.aliyun.com/saltstack/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
-
设置官方yum仓库
因为这条命令会产生一个新的yum源,然而这个yum源的镜像地址并不是非常快,我们把它换成aliyun的地址,会快一些[root@rhel7 yum.repos.d]# ls redhat.repo salt-latest.repo [root@rhel7 yum.repos.d]# cat salt-latest.repo [salt-latest] name=SaltStack Latest Release Channel for RHEL/Centos $releasever baseurl=https://mirrors.aliyun.com/saltstack/yum/redhat/7/$basearch/latest ##阿里云的镜像地址 failovermethod=priority enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/saltstack-signing-key
更改后查看yum源是否配置好:
[root@rhel7 yum.repos.d]# yum repolist Loaded plugins: langpacks, product-id, search-disabled-repos, subscription- : manager This system is not registered with an entitlement server. You can use subscription-manager to register. repo id repo name status salt-latest/x86_64 SaltStack Latest Release Channel for RHEL/Centos 7Serv 83 repolist: 83
在server2上做同样的配置。
master节点配置:server1
[root@rhel7 yum.repos.d]# yum install -y salt-master Loaded plugins: langpacks, product-id, search-disabled-repos, subscription- : manager This system is not registered with an entitlement server. You can use subscription-manager to register. Resolving Dependencies --> Running transaction check ---> Package salt-master.noarch 0:3000.3-1.el7 will be installed ......省略 --> Finished Dependency Resolution Error: Package: salt-3000.3-1.el7.noarch (salt-latest) ##注意这里的依赖性并没有得到解决 Requires: python-markupsafe Error: Package: salt-3000.3-1.el7.noarch (salt-latest) Requires: python-jinja2 You could try using --skip-broken to work around the problem You could try running: rpm -Va --nofiles --nodigest
解决依赖性,成功安装
设置自启动 [root@server1 Downloads]# systemctl enable salt-master Created symlink from /etc/systemd/system/multi-user.target.wants/salt-master.service to /usr/lib/systemd/system/salt-master.service. 启动 [root@server1 Downloads]# systemctl start salt-master 安装用来查看已经打开的端口的包 [root@server1 Downloads]# yum install -y lsof Loaded plugins: langpacks, product-id, search-disabled-repos, subscription- : manager This system is not registered with an entitlement server. You can use subscription-manager to register. Nothing to do 接受请求 [root@server1 Downloads]# lsof -i :4506 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 11417 root 23u IPv4 82603 0t0 TCP *:4506 (LISTEN) 消息队列 [root@server1 Downloads]# lsof -i :4505 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 11411 root 15u IPv4 82565 0t0 TCP *:4505 (LISTEN)
minion节点配置:server2,server3
yum install -y salt-minion #安装minion端 vim /etc/salt/minion #对minion端的配置文件进行配置 master: 192.168.1.11 #指定master端 systemctl enable salt-minion #设置自启动minion systemctl start salt-minion #开启自启动
配置完minion端之后,查看master端
[root@server1 Downloads]# lsof -i :4506 #请求消息端口 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 14705 root 23u IPv4 104656 0t0 TCP *:4506 (LISTEN) # server2向server1发送的请求 salt-mast 14705 root 30u IPv4 115223 0t0 TCP server1:4506->192.168.1.12:51154 (ESTABLISHED) # server3向server1发送的请求 salt-mast 14705 root 31u IPv4 115229 0t0 TCP server1:4506->192.168.1.13:45888 (ESTABLISHED) [root@server1 Downloads]# lsof -i :4505 #消息队列 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 14699 root 15u IPv4 104627 0t0 TCP *:4505 (LISTEN)
这时master端需要通过key去允许minion端的连接
[root@server1 Downloads]# salt-key -L Accepted Keys: Denied Keys: Unaccepted Keys: server2 server3 Rejected Keys:
同意key:-A允许所有
[root@server1 Downloads]# salt-key -A The following keys are going to be accepted: Unaccepted Keys: server2 server3 Proceed? [n/Y] y Key for minion server2 accepted. Key for minion server3 accepted.
再次查看
[root@server1 Downloads]# salt-key -L Accepted Keys: server2 server3 Denied Keys: Unaccepted Keys: Rejected Keys: #请求队列 [root@server1 Downloads]# lsof -i :4506 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 14705 root 23u IPv4 104656 0t0 TCP *:4506 (LISTEN) #消息队列(已经建立长链接,master发的时候,minion端就可以收到) [root@server1 Downloads]# lsof -i :4505 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME salt-mast 14699 root 15u IPv4 104627 0t0 TCP *:4505 (LISTEN) salt-mast 14699 root 17u IPv4 118817 0t0 TCP server1:4505->192.168.1.12:53022 (ESTABLISHED) salt-mast 14699 root 18u IPv4 118822 0t0 TCP server1:4505->192.168.1.13:41772 (ESTABLISHED)
注意: 当我们更改了主机名时,要及时的去这个文件中更改,或者删除文件,重启minion端。因为salt会去读文件中的名字
[root@server2 salt]# cat minion_id server2 [root@server2 salt]# pwd /etc/salt
查看更详细的进程信息:
安装
[root@server1]# yum install -y python-setproctitle.x86_64
重启salt
[root@server1]# systemctl restart salt-master.service
[root@server1]# ps ax
...
19546 ? S 0:00 /usr/bin/python /usr/share/PackageKit/helpers/yum/yu
19554 ? Ss 0:00 /usr/bin/python /usr/bin/salt-master ProcessManager
19565 ? S 0:00 /usr/bin/python /usr/bin/salt-master Multiprocessing
消息队列
19578 ? Sl 0:00 /usr/bin/python /usr/bin/salt-master ZeroMQPubServer
19579 ? S 0:00 /usr/bin/python /usr/bin/salt-master EventPublisher
19582 ? S 0:00 /usr/bin/python /usr/bin/salt-master Maintenance
请求队列
19583 ? S 0:00 /usr/bin/python /usr/bin/salt-master ReqServer_Proce
维护队列
19584 ? Sl 0:00 /usr/bin/python /usr/bin/salt-master MWorkerQueue
19585 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-0
19586 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-1
19593 ? Sl 0:00 /usr/bin/python /usr/bin/salt-master FileserverUpdat
19594 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-2
19595 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-3
19598 ? R 0:00 /usr/bin/python /usr/bin/salt-master MWorker-4
19897 pts/1 R+ 0:00 ps ax
在master端测试ping在minion端的执行情况:
[root@server1 ~]# salt '*' test.ping #*表示在key中能识别的所有主机
server3:
True
server2:
True
指定key进行测试:
[root@server1 ~]# salt server2 test.ping
server2:
True
我们当前是以超户身份进行远程命令:
[root@server1 ~]# salt server2 cmd.run pwd
server2:
/root
[root@server1 ~]# salt server2 cmd.run 'touch /tmp/file'
server2:
[root@server2 yum.repos.d]# ls /tmp/file
/tmp/file
slatstack远程执行
- 测试连接
- 远程执行命令
salt命令
salt命令由三个主要部分组成:
salt '<target>' <function> [arguments]
-
target:指定哪些minion,默认的规则是使用glob匹配minion_id
salt '*' test.ping
targets也可以使用正则表达式:
salt -E 'server[1-3]' test.ping
targets也可以指定列表:
salt -L 'server2,server3' test.ping
-
function是module提供的功能,salt内置了大量有效的functions
http://docs.saltstack.cn/ 查看中文手册 [root@server1 ~]# salt '*' cmd.run 'uname -a' server3: Linux server3 3.10.0-957.el7.x86_64 #1 SMP Thu Oct 4 20:48:51 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux server2: Linux server2 3.10.0-957.el7.x86_64 #1 SMP Thu Oct 4 20:48:51 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
-
arguments通过空格来界定参数
salt 'server2' sys.doc pkg #查看模块文档 salt 'server2' pkg.install httpd salt 'server2' pkg.remove httpd #这样就很简单的完成了远程安装 [root@server1 ~]# salt 'server2' pkg.remove httpd server2: ---------- httpd: ---------- new: old: 2.4.6-88.el7 [root@server1 ~]# salt 'server2' pkg.install httpd server2: ---------- httpd: ---------- new: 2.4.6-88.el7 old:
命令由4505端口推送,结果由4506接收
salt内置的执行模块(写文件时的用法)
http://docs.saltstack.cn/ref/modules/all/index.html
salt的数据都会保存在/var/cache/salt目录中
[root@server2 yum.repos.d]# cd /var/cache/salt
[root@server2 salt]# tree .
.
└── minion
├── extmods
└── proc
3 directories, 0 files
编写远程执行模块
除了由salt内置的执行模块,作为用户自己也可以再编写自己的模块。
配置管理
- salt状态系统的核心是SLS,或者叫SaLt State文件。
- SLS表示系统将会是什么样的一个状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。
- sls文件命名:
1.sls文件以“.sls”后缀结尾,但在调用时不用写此后缀
2.使用子目录来做组织是个很好的选择
3.init.sls在一个子目录里面表示引导文件,也就表示子目录本身,所以apache/init.sls文件就是表示apache本身
4.如果同时存在“apache/init.sls”和“apache.sls”文件,则“apache/init.sls”被忽略,“apache.sls”将被用来表示apache
YAML语法
- 规则一:缩进
Salt需要每个缩进级别由两个空格组成,不要使用tab - 规则二:冒号
字典keys在YMAL中的表现形式是一个以冒号结尾的字符串
my_key:my_value - 规则三:段横杠
- 想要表示列表项,使用一个段横杠加一个空格
- list_value_one
-list_value_two
grains与pillar详解
grains
- grains是saltstack的一个组件,它被存放在minion端
- 当salt-minion启动时会把数据静态存储到grains当中,只有当minion重启时才会进行数据的更新
- 由于grains时静态数据,所以不推荐常去改它
- 应用场景:
信息查询,可做CMDB
在target中使用,匹配minion
在state模块中使用,配置管理模块
信息查询
用于查询minion端的IP,FQDN等信息
默认可用的grains
自定义grains项
编写grains模块
grains匹配应用
pillar
- 与grains一样也是一个数据系统,但是应用场景不同
- pillar是将信息动态的存放在master端,主要存放私密,敏感信息(如用户名,密码等),而且可以指定某一个minion端才可以看到对应的信息
- pillar更适合在配置管理中应用
声明pillar
自定义pillar
数据匹配
Jinja模板
简介
- Jinja是一种基于python的模板引擎,在sls文件里可以直接使用jinja模板来做一些操作
- 通过jinja模板可以为不同服务器定义各自的变量
- 两种分隔符:{%…%}和{{…}},前者用于执行诸如for循环或赋值的语句,后者把表达式的结果打印到模板上
使用方式
引用变量
Job管理
- master在下发指令任务时,会附带上产生的jid
- minion在接受到指令开始执行时,会在本地的/var/cache/salt/minion/proc目录下产生该gid命名的文件,用于在执行过程中,master查看当前任务的执行情况
- 指令执行完毕将结果传送给master后,删除该临时文件