简介、安装、远程执行、grains、Jinja模板
一、Saltstack简介
1.简介
- saltstack是一个配置管理系统,能够维护预定义状态的远程节点。
- saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。
- saltstack是运维人员提高工作效率、规范业务配置与操作的利器。
- Salt的核心功能
- 使命令发送到远程系统是并行的而不是串行的
- 使用安全加密的协议
- 使用最小最快的网络载荷
- 提供简单的编程接口
- Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。
2.Saltstack通信机制
- SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队
列通信,默认监听4505端口。 - Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听
4506端口。
二、安装
1.服务端server1
[root@server1 ~]# vim /etc/yum.repos.d/westos.repo #配置网络仓库
[root@server1 ~]# cat /etc/yum.repos.d/westos.repo
[wan]
name="wan"
baseurl=http://172.25.15.250/rhel7
gpgcheck=0
[salt]
name="salt"
baseurl=ftp://172.25.15.250/pub/docs/saltstack/rhel7/3000/
gpgcheck=0
[root@server1 ~]# yum repolist #扫描仓库软件包
[root@server1 ~]# yum list salt-*
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
Available Packages
salt.noarch 3000.3-1.el7 salt
salt-api.noarch 3000.3-1.el7 salt
salt-master.noarch 3000.3-1.el7 salt
salt-minion.noarch 3000.3-1.el7 salt
salt-ssh.noarch 3000.3-1.el7 salt
salt-syndic.noarch 3000.3-1.el7 salt
[root@server1 ~]# yum install -y salt-master.noarch
[root@server1 ~]# scp /etc/yum.repos.d/westos.repo server2:/etc/yum.repos.d/
[root@server1 ~]# scp /etc/yum.repos.d/westos.repo server3:/etc/yum.repos.d/
[root@server1 ~]# systemctl enable --now salt-master.service
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-master.service to /usr/lib/systemd/system/salt-master.service.
(1)配置网络仓库
(2)安装saltstack-master
(3)将仓库配置传给要配置的客户端server2和server3
(4)启动master服务端
2.客户端server2和server3
[root@server2 ~]# yum install -y salt-minion
[root@server2 ~]# cd /etc/salt
[root@server2 salt]# ls
cloud cloud.maps.d master minion.d proxy.d
cloud.conf.d cloud.profiles.d master.d pki roster
cloud.deploy.d cloud.providers.d minion proxy
[root@server2 salt]# vim minion
16 master: 172.25.15.1
[root@server2 salt]# systemctl enable --now salt-minion.service
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-minion.service to /usr/lib/systemd/system/salt-minion.service.
[root@server2 salt]#
[root@server3 ~]# yum install -y salt-minion
[root@server3 ~]# cd /etc/salt
[root@server3 salt]# ls
cloud cloud.maps.d master minion.d proxy.d
cloud.conf.d cloud.profiles.d master.d pki roster
cloud.deploy.d cloud.providers.d minion proxy
[root@server3 salt]# vim minion
16 master: 172.25.15.1
[root@server3 salt]# systemctl enable --now salt-minion.service
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-minion.service to /usr/lib/systemd/system/salt-minion.service.
[root@server3 salt]#
(1)安装客户端(saltstack-minion)server2和server3(同理)
(2)配置客户端
3.saltstack服务端(master)和客户端(minion)的连接
server1开启服务
[root@server1 ~]# salt-key -L #列出saltstack的客户端
Accepted Keys:
Denied Keys:
Unaccepted Keys:
server2
server3
Rejected Keys:
[root@server1 ~]# 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 ~]# salt-key -L
Accepted Keys:
server2
server3
Denied Keys:
Unaccepted Keys:
Rejected Keys:
[root@server1 ~]# salt '*' test.ping #查看测试连接成功
server2:
True
server3:
True
[root@server1 ~]#
[root@server1 ~]# lsof -i :4505 #4505端口
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 23577 root 15u IPv4 56595 0t0 TCP *:4505 (LISTEN)
salt-mast 23577 root 17u IPv4 59059 0t0 TCP server1:4505->server2:34542 (ESTABLISHED)
salt-mast 23577 root 18u IPv4 59060 0t0 TCP server1:4505->server3:36104 (ESTABLISHED)
[root@server1 ~]# lsof -i :4506
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 23583 root 23u IPv4 55871 0t0 TCP *:4506 (LISTEN)
[root@server1 ~]#
(1)查看测试连接成功
(2)端口状态
- 4505对客户端(master)发送
- 4506对服务端(minion)反馈
[root@server1 ~]# yum install -y python-setproctitle.x86_64
[root@server1 ~]# systemctl restart salt-master.service
[root@server1 ~]# ps ax
(3)查看进程作用
- minion_id:启动minion后,会产生主机名文件,更改主机名后,要删除这个文件,每次启动时都会用原来生成的文件id去连接master,不删除文件的话,会读取这个文件,更改主机名后会不生效。删除后重启,会自动以当前主机名生成新的文件。
三、saltstack远程执行
1.命令式
salt 命令由三个主要部分构成:salt'<target>'<funcation>[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 #查看pkg模块文档
# salt 'server2' sys.doc pkg | grep pkg.install #过滤查看远程安装
# salt 'server2' pkg.install httpd #server2安装http服务
#salt 'server2' service.start httpd #远程启动http服务
# salt 'server2' pkg.remove httpd #远程删除http服务
salt内置的执行模块列表:
http://docs.saltstack.cn/ref/modules/all/index.html
2.模块化远程执行
(1)创建模块
- 要作模块化执行
- 首先创建目录
[root@server1 ~]# mkdir /srv/salt/_modules -p
[root@server1 ~]# cd /srv/salt/_modules/
[root@server1 _modules]# vim mydisk.py
[root@server1 _modules]# cat mydisk.py
def df():
return __salt__['cmd.run']('df -h')
[root@server1 _modules]# salt server2 saltutil.sync_modules
server2:
- modules.mydisk
[root@server1 _modules]# salt server2 mydisk.df #执行模块查看server2内存情况
server2:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 17G 1.2G 16G 8% /
devtmpfs 484M 0 484M 0% /dev
tmpfs 496M 100K 496M 1% /dev/shm
tmpfs 496M 14M 483M 3% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/vda1 1014M 132M 883M 14% /boot
tmpfs 100M 0 100M 0% /run/user/0
[root@server1 _modules]#
init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以``apache/init.sls`` 就是表示``apache``.
如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示 apache.
(2)配置管理
Salt 状态系统的核心是SLS,或者叫SaLt State 文件。
•SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。
•sls文件命名:
•sls文件以”.sls”后缀结尾,但在调用是不用写此后缀。
•使用子目录来做组织是个很好的选择。
• 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 # 函数声明
指定主机执行:
# salt server2 state.sls apache
准备Top文件:
# vim /srv/salt/top.sls
base:
'*':
- apache
批量执行:
# salt '*' state.highstate
3.编写远程执行模块:在server2 中部署apache
(1)写法一
[root@server1 salt]# pwd
/srv/salt
[root@server1 salt]# mkdir apache
[root@server1 apache]# vim install.sls #编写模块
apache:
pkg.installed:
- pkgs:
- httpd #安装http,php服务
- php
service.running:
- name: httpd #开启http服务
- enable: true #设置开机自启
- reload: ture #刷新服务
- watch:
- file: /etc/httpd/conf/httpd.conf #条件:监控配置文件,发生改变,执行服务开启,开机自启,刷新
##唯一性声明
/etc/httpd/conf/httpd.conf: #配置文件修改内容设置,声明修改文件路径
file.managed:
- source: salt://apache/httpd.conf #替换这个文件为新的配置文件
[root@server1 apache]# cp /etc/httpd/conf/httpd.conf . #复制一份配置文件
[root@server1 apache]# ls
httpd.conf init.sls
[root@server1 apache]# vim httpd.conf #修改配置文件
Listen 8080 #端口改为8080
[root@server1 apache]# salt server2 state.sls apache ##所有的文件路径都是基于/srv/salt来确定的,调用apache目录下的install文件
模块编写
编写修改好的配置文件,并执行模块
我们可以看到server2端口被修改为8080
(2)模块写法二
[root@server1 apache]# vim init.sls
[root@server1 apache]# cat init.sls
apache:
pkg.installed:
- pkgs:
- httpd
- php
service.running:
- name: httpd
- enable: true
- reload: ture
- watch:
- file: /etc/httpd/conf/httpd.conf
file.managed:
- source: salt://apache/httpd.conf
- name: /etc/httpd/conf/httpd.conf #制定修改文件
[root@server1 apache]# salt server2 state.sls apache
可以看到结果一致
4.grains匹配运用:在server3部署nginx
(1)安装nginx
[root@server1 salt]# mkdir nginx
[root@server1 salt]# ls
apache _modules nginx
[root@server1 salt]# cd nginx/
## 下载安装包
lftp 172.25.15.250:/pub/docs/lamp> get nginx-1.20.1.tar.gz
1061461 bytes transferred
lftp 172.25.15.250:/pub/docs/lamp> exit
[root@server1 nginx]# ls
init.sls nginx-1.20.1.tar.gz #将安装包下载下来
[root@server1 nginx]# vim init.sls #编写安装nginx模块
[root@server1 nginx]# cat init.sls
nginx-install:
pkg.installed:
- pkgs: #安装nginx依赖性
- gcc
- pcre-devel
- openssl-devel
file.managed:
- source: salt://nginx/nginx-1.20.1.tar.gz #执行机器上安装包的位置
- name: /mnt/nginx-1.20.1.tar.gz #指定存放安装包路径
cmd.run: #命令执行模块
- name: cd /mnt && tar zxf nginx-1.20.1.tar.gz && cd nginx-1.20.1 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-threads --with-file-aio &> /dev/null && make &> /dev/null && make install &> /dev/null
- creates: /usr/local/nginx #检测是否已存在
[root@server1 nginx]# salt server3 state.sls nginx #远程部署nginx安装
nginx远程安装成功
(2)配置并启动nginx
## 将配置文件复制一份给servr1
[root@server3 mnt]# cd /usr/local/nginx/conf/
[root@server3 conf]# scp nginx.conf server1:/srv/salt/nginx
##下载nginx启动脚本
[root@server1 nginx]# ls
init.sls nginx-1.20.1.tar.gz
[root@server1 nginx]# lftp 172.25.15.250
lftp 172.25.15.250:~> cd /pub/docs/lamp/
lftp 172.25.15.250:/pub/docs/lamp> get nginx.service
414 bytes transferred
lftp 172.25.15.250:/pub/docs/lamp> exit
[root@server1 nginx]# ls
init.sls nginx-1.20.1.tar.gz nginx.conf nginx.service
[root@server1 nginx]#
## 编写启动模块
[root@server1 nginx]# vim service.sls
[root@server1 nginx]# cat service.sls
include:
- nginx
nginx-user:
user.present:
- name: nginx #创建用户
- shell: /sbin/nologin #没有登陆
- home: /usr/local/nginx
- createhome: false
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/nginx.conf
nginx-service:
file.managed:
- name: /usr/lib/systemd/system/nginx.service
- source: salt://nginx/nginx.service
service.running:
- name: nginx
- enable: true
- reload: true
- watch:
- file: /usr/local/nginx/conf/nginx.conf #监控配置文件
[root@server1 nginx]# salt server3 state.sls nginx.service #
(3)编写模块
(4)server3查看nginx是否启动成功
[root@server3 ~]# curl localhost #访问本地默认网页
四、grains
1.简介
- Grains是SaltStack的一个组件,存放在SaltStack的minion端。
- 当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
- 由于grains是静态数据,因此不推荐经常去修改它。
- 应用场景:
信息查询,可用作CMDB。
在target中使用,匹配minion。
在state系统中使用,配置管理模块。
2.信息查询
用于查询minion端的IP、FQDN等信息。
默认可用的grains:
[root@server1 ~]# salt server2 grains.item ipv4
[root@server1 ~]# salt server2 grains.items
[root@server1 ~]# salt server2 grains.ls
列出所有的key
列出所有 key和值
指定key的值
(1)自定义grains项
server2:在/etc/salt/minion中定义
## 修改server2中 /etc/salt/minion文件
[root@server2 files]# cd /etc/salt
[root@server2 salt]# ls
cloud cloud.maps.d master minion.d proxy
cloud.conf.d cloud.profiles.d master.d minion_id proxy.d
cloud.deploy.d cloud.providers.d minion pki roster
[root@server2 salt]# vim minion ###129行添加
grains:
roles:
- apache
[root@server2 salt]# systemctl restart salt-minion.service #重启客户端
[root@server2 salt]#
## server1
[root@server1 salt]# salt server2 test.ping
[root@server1 salt]# salt server2 grains.item ipv4 ## 指定ip
[root@server1 salt]# salt server2 grains.item roles ##指定角色
(2)检测
server3:在/etc/salt/grains中定义
[root@server3 ~]# cd /etc/salt
[root@server3 salt]# ls
cloud cloud.maps.d master minion.d proxy
cloud.conf.d cloud.profiles.d master.d minion_id proxy.d
cloud.deploy.d cloud.providers.d minion pki roster
[root@server3 salt]# vim grains
roles:
- nginx
[root@server1 _modules]# salt server3 saltutil.sync_grains ##同步数据
[root@server1 _modules]# salt '*' grains.item roles
3.在salt-master端创建_grains目录
[root@server1 salt]# mkdir _grains
[root@server1 salt]# cd _grains/
[root@server1 _grains]# vim grains.py
[root@server1 _grains]# cat grains.py
def my_grain():
grains = {}
grains['hello'] = 'world'
grains['salt'] = 'stack'
return grains
[root@server1 _grains]# salt '*' saltutil.sync_grains ##同步grains到minion端
[root@server1 _grains]# salt '*' grains.item hello
[root@server1 _grains]# salt '*' grains.item salt
4.pillar简介
- pillar和grains一样也是一个数据系统,但是应用场景不同。
- pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才可以看到对应的信息。
- pillar更加适合在配置管理中运用。
5.自定义pillar项
[root@server1 srv]# mkdir pillar
[root@server1 srv]# cd pillar/
[root@server1 pillar]# vim top.sls
[root@server1 pillar]# cat top.sls
base:
'*':
- pkgs
[root@server1 pillar]# vim pkgs.sls
[root@server1 pillar]# cat pkgs.sls
{% if grains['fqdn'] == 'server2' %}
package: httpd
{% elif grains['fqdn'] == 'server3' %}
package: nginx
{% endif %}
[root@server1 pillar]# salt '*' saltutil.refresh_pillar
server3:
True
server2:
True
[root@server1 pillar]# salt '*' pillar.items
server3:
----------
package:
nginx
server2:
----------
package:
httpd
[root@server1 pillar]#
6.pillar数据匹配
[root@server1 apache]# vim init.sls
[root@server1 apache]# cat init.sls
apache:
pkg.installed:
- pkgs:
- {{ pillar['package'] }}
service.running:
- name: httpd
- enable: true
- reload: ture
- watch:
- file: /etc/httpd/conf/httpd.conf
file.managed:
- source: salt://apache/httpd.conf
- name: /etc/httpd/conf/httpd.conf
[root@server1 apache]# salt server2 state.sls apache
五、Jinja模板
1.简介
Jinja是一种基于python的模板引擎,在SLS文件里可以直接使用jinja模板来做一些操作。
通过jinja模板可以为不同服务器定义各自的变量。
两种分隔符: {% ... %} 和 {{ ... }},前者用于执行诸如 for 循环 或
赋值的语句,后者把表达式的结果打印到模板上。
2.Jinja模板使用方式
[root@server1 salt]# ls
apache _grains _modules nginx top.sls
[root@server1 salt]# vim test.sls
[root@server1 salt]# cat test.sls
/mnt/testfile:
file.append:
{% if grains['fqdn'] == 'server2' %}
- text: server2
{% elif grains['fqdn'] == 'server3' %}
- text: server3
{% endif %}
[root@server1 salt]# salt '*' state.sls test
3.Jinja模板使用方式
## 配置pillar
[root@server1 salt]# cd ..
[root@server1 srv]# cd pillar/
[root@server1 pillar]# cat top.sls
base:
'*':
- pkgs
[root@server1 pillar]# cat pkgs.sls
{% if grains['fqdn'] == 'server2' %}
package: httpd
port: 80
{% elif grains['fqdn'] == 'server3' %}
package: httpd
port: 8080
{% endif %}
[root@server1 apache]# vim init.sls
[root@server1 apache]# cat init.sls
apache:
pkg.installed:
- pkgs:
- {{ pillar['package'] }}
service.running:
- name: httpd
- enable: true
- reload: ture
- watch:
- file: /etc/httpd/conf/httpd.conf
file.managed:
- source: salt://apache/httpd.conf
- name: /etc/httpd/conf/httpd.conf
- template: jinja
- context:
http_port: {{ pillar['port'] }}
http_port: {{ grains['ipv4'][-1] }}
[root@server1 apache]# vim httpd.conf
Listen {{ http_host }}:{{ http_port }} ## 直接引用grains变量
[root@server1 pillar]# salt '*' state.sls apache #执行完成端口改变
server2
[root@server2 salt]# vim /etc/httpd/conf/httpd.conf
server3
[root@server3 salt]# vim /etc/httpd/conf/httpd.conf