1. saltstack的介绍
1.1 saltstack的概念
- saltstack是一个配置管理系统,能够维护预定义状态的远程节点。
- saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。
- saltstack是运维人员提高工作效率、规范业务配置与操作的利器。
1.2 saltstack的通信机制
SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口。
Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口。
1.2 saltstack的组件
1、Salt Master:中心管理系统。此系统用于将命令和配置发送到在受管系统上运行的Salt minion。
2、Salt Minions:被管理的系统。 该系统运行Salt minion,它从Salt master接收命令和配置。
3、Execution Modules:从命令行针对一个或多个受管系统执行临时命令。 对以下管理场景有帮助:
- 实时监控,状态和盘点
- 一次性命令和脚本
- 部署关键更新
4、Formulas (States):一种系统配置的声明性或命令式表示。
5、Grains:系统变量。 Grains是有关底层受管系统的静态信息,包括操作系统,内存和许多其他系统属性。
您还可以为任何系统定义自定义grains。6、Pillar:用户定义的变量。 这些安全变量被定义并存储在Salt Master中,然后使用目标“分配”给一个或多个minions。
pilla数据存储诸如端口,文件路径、配置参数和密码之类的值。7、Top File:将formulas和pilla数据与Salt minions匹配。
8、Runners:在Salt master上执行的模块,用于执行支持任务。 Salt
runners报告作业状态、连接状态、从外部API读取数据,查询连接的Salt
minions等。例如,Orchestrate运行器协调跨多个系统的配置部署。9、Returners:将Salt minions返回的数据发送到另一个系统,例如数据库。 Salt Returners可以在Salt
minion或Salt master上运行。10、Reactor:在SaltStack环境中发生特定事件时触发相应的响应。
11、Salt SSH:在没有Salt minion的系统上通过SSH运行Salt命令。
2. saltstack的安装与配置
实验环境:
172.25.10.1 作为master
172.25.10.2 作为minion
172.25.10.3 作为minion
2.1 配置yum源
官网:https://www.saltstack.com/
设置官方yum仓库:
yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm
替换为阿里云镜像:
sudo sed -i "s/repo.saltstack.com/mirrors.aliyun.com\/saltstack/g" /etc/yum.repos.d/salt-3000.repo
2.2 配置master
在server1中:
yum install -y salt-master
#安装master端
systemctl enable salt-master --now
#设置master自启动
2.3 配置minion
在server2&3中:
yum install -y salt-minion
#安装master端
vim /etc/salt/minion
在minion端设置master主机的ip
master: 172.25.0.11
systemctl enable salt-minion --now
#设置master自启动
2.4 配置master验证minion
yum install -y lsof.x86_64
当前没有minion连接:
salt-key -L
查看等待验证的minion
salt-key -a server2
添加server2的minion端
salt-key -A
添加所有minion端
salt-key -d server2
删除指定minion端
(如果hostname与minion端中minion_id中的名称不符合,需要删除salt-key和minion_id后,重启master重新验证
yum install -y python-setproctitle.x86_64
可以在ps中查看更详细的内容
systemctl restart salt-master
再次查看minion端通过验证:
3. saltstack远程执行
3.1 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
funcation是module提供的功能,Salt内置了大量有效的functions.
salt '*' cmd.run 'uname -a'
arguments通过空格来界定参数:
salt 'server2' sys.doc pkg #查看模块文档
salt 'server2' pkg.install httpd
[root@server1 ~]# salt server2 cmd.run 'rpm -q httpd'
server2:
httpd-2.4.6-88.el7.x86_64
[root@server1 ~]# salt server2 cmd.run 'rpm -qa | grep httpd'
server2:
httpd-tools-2.4.6-88.el7.x86_64
httpd-2.4.6-88.el7.x86_64
3.2 编写远程执行模块
1.编辑master配置文件:
vim /etc/salt/master
file_roots:
base:
- /srv/salt
重启master服务:
systemctl restart salt-master
/srv/salt/为salt数据的根目录
2.创建模块目录:
`mkdir /srv/salt/_modules
3.编写模块文件:
vim /srv/salt/_modules/mydisk.py
def df():
return __salt__['cmd.run']('df -h')
4.同步模块:
salt server saltuil.sync_modules
5.运行模块:
salt server2 mydisk.df
mydisk 模块名
df 方法
tree /var/cache/salt
模块文化会被缓存到minion端的/var/cache中
3.3 了解Yaml语法
-
规则一: 缩进
Salt需要每个缩进级别由两个空格组成,不要使用tabs。 -
规则二: 冒号
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。
my_key: my_value -
规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。
-list_value_one
-list_value_two
3.4 配置管理(sls)
1.创建sls文件
1.SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。
2.Salt 状态系统的核心是SLS,或者叫SaLt State 文件。
3.sls文件命名:sls文件以”.sls”后缀结尾,但在调用是不用写此后缀。
4.推荐使用子目录来做组织是个很好的选择。
5.init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以apache/init.sls
就是表示apache
。
注意:如果同时存在apache.sls 和apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示 apache。
创建一个sls文件:
vim /srv/salt/apache.sls
httpd: # ID声明,同时也是软件包的名称
pkg: # 状态声明
-installed # 函数声明
也可以写成这种形式:
vim /srv/salt/apache.sls
httpd: #也可以写成这种形式
pkg.installed
也可以写成这种形式:
vim /srv/salt/apache.sls
web:
pkg.installed:
- pkgs:
- httpd
- php #也可以装多个包
注意:在安装包时会自动安装依赖性,在卸载时则不会卸载依赖性,只会满足所需要的状态
指定主机执行:
salt server2 state.sls apache
2.创建top文件
top是一个高级状态,可以对应不同的节点有不同的操作
vim /srv/salt/top.sls
base:
'*':
- apache
批量执行:
salt '*' state.highstate
3.使用子目录配置管理
mkdir /var/salt/apache
建立子目录
vim /var/salt/apache/install.sls
salt server2 state.sls apache.install
注意:可以在任意目录下执行
也可以更简单:
cd /srv/salt/apache
mv install.sls init.sls
init.sls为入口文件
salt server2 state.sls apache
4.sls示例
1)配置httpd
vim /srv/salt/apache/init.sls
web:
pkg.installed:
- pkgs:
- httpd
- php
file.managed:
- source: salt://apache/file/httpd.conf
- name: /etc/httpd/conf/httpd.conf
service.running:
- name: httpd
- enable: True
- watch:
- file: web ##触发;注意这样的调用只能有一次
也可以换一种写法:
web:
pkg.installed:
- pkgs:
- httpd
- php
service.running:
- name: httpd
- enable: True
- watch:
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/file/httpd.conf
mkdir /srv/salt/apache/file
scp server2:/etc/httpd/conf/httpd.conf /srv/salt/apache/file/
salt server2 state.sls apache
2)配置nginx
方法1:
mkdir /srv/salt/nginx
mkdir /srv/salt/nginx/files
vim /srv/salt/nginx/files/nginx.service
启动脚本文件
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
vim /srv/salt/nginx/files/nginx.conf
#user nobody;
worker_processes 2; ##设置work进程数
vim /srv/salt/nginx/init.sls
nginx-install:
pkg.installed: #安装包
- pkgs:
- openssl-devel
- pcre-devel
- gcc
file.managed:
- name: /mnt/nginx-1.18.0.tar.gz #制定包的位置
- source: salt://nginx/files/nginx-1.18.0.tar.gz
cmd.run:
- name: cd /mnt/ && tar zxf nginx-1.18.0.tar.gz && cd nginx-1.18.0 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make &> /dev/null && make install &> /dev/null
- creates: /usr/local/nginx
/usr/local/nginx/conf/nginx.conf: #设置配置文件
file.managed:
- source: salt://nginx/files/nginx.conf
nginx-service:
file.managed:
- name: /usr/lib/systemd/system/nginx.service
- source: #启动脚本salt://nginx/files/nginx.service
service.running:
- name: nginx
- enable: True
- reload: True
- watch:
- file: /usr/local/nginx/conf/nginx.conf
方法2:
vim /srv/salt/nginx/init.sls
include:
- nginx.install
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
nginx-service:
file.managed:
- name: /usr/lib/systemd/system/nginx.service
- source: salt://nginx/files/nginx.service
service.running:
- name: nginx
- enable: True
- reload: True
- watch:
- file: /usr/local/nginx/conf/nginx.conf
vim /srv/salt/nginx/install.sls
nginx-install:
pkg.installed:
- pkgs:
- openssl-devel
- pcre-devel
- gcc
file.managed:
- name: /mnt/nginx-1.18.0.tar.gz
- source: salt://nginx/files/nginx-1.18.0.tar.g
cmd.run:
- name: cd /mnt/ && tar zxf nginx-1.18.0.tar.gz && cd nginx-1.18.0 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make &> /dev/null && make install &> /dev/null
- creates: /usr/local/nginx
salt server3 state.sls nginx
3)top文件配置不同主机安装不同程序
vim /srv/salt/top.sls
base:
'server2':
- httpd.service
'server3':
- nginx.service
salt server3 state.sls nginx.install
scp nginx.service root@172.25.10.1:/srv/salt/nginx/files
salt server2 state.sls nginx.service
salt '*' state.highstate
高级状态
4.saltstack的数据系统:grains&pillar
grains与pillar是saltstack的数据系统。
4.1 grains(静态)
1. grains的介绍
Grains是SaltStack的一个组件,存放在SaltStack的minion端。
当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
由于grains是静态数据,因此不推荐经常去修改它。
应用场景:
信息查询,可用作CMDB。
在target中使用,匹配minion。
在state系统中使用,配置管理模块
2. grains的信息查询
salt server2 grains.ls
salt server2 grains.items
salt server2 grains.item username
查询主机名
salt server3 grains.item fqdn
查询域名
salt server3 grains.item ipv4
查询IP
3. 自定义grains项
在minion端(方法一)
vim /etc/salt/minion
grains:
roles: apache
systemctl restart salt-minion.service
在master端查看:salt server2 grains.item roles
=
在minion端(方法二)
vim /etc/salt/grains
创建grains文件
roles: nginx
在master端同步数据:
salt server3 saltutil.sync_grains
在master端查看:
salt server3 grains.item roles
在master端:
mkdir /srv/salt/_grains
vim /srv/salt/_grains/my_grain.py
def my_grain():
grains = {}
grains['website'] = 'webser'
grains['hello'] = 'world'
return grains
salt '*' saltutil.sync_grains
salt server2 grains.item salt
查看数据
salt server2 grains.item hello
4. grains匹配运用
target中匹配
salt -G roles:apache cmd.run hostname -G
通过grains
salt -G roles:nginx cmd.run hostname
salt -G salt:website cmd.run hostname
salt -G hello:hello cmd.run hostname
在top文件中匹配
vim /srv/salt/top.sls
base:
'roles:apache':
- match: grain
- httpd
'roles:nginx':
- match: grain
- nginx
salt '*' state.highstate
4.2 pillar(动态)
1. pillar的介绍
- pillar和grains一样也是一个数据系统,但是应用场景不同。
- pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才可以看到对应的信息。
- pillar更加适合在配置管理中运用。
2. 自定义pillar项
vim /etc/salt/master
(这里是默认设置)
pillar_roots:
base:
- /srv/pillar
mkdir /srv/pillar定义pillar
基础目录
vim /srv/pillar/packages.sls
{% if grains['fqdn'] == 'server2' %}
package: httpd
{% elif grains['fqdn'] == 'server3' %}
package: apache
{% endif %}
vim /srv/pillar/top.sls
base:
'*':
- packages
salt '*' saltutil.refresh_pillar
刷新pillar数据
salt '*' pillar.items
查询pillar数据
salt '*' pillar.item packkages
3.pillar的数据匹配
命令行中匹配
salt -I package:httpd cmd.run hostname
state系统中使用
vim /srv/salt/apache/init.sls
web:
pkg.installed:
- pkgs:
- {{ pillar['package'] }}
- php
service.running:
- name: httpd
- enable: True
- watch:
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/file/httpd.conf
salt server2 state.sls apache