当前位置: > 其它学习 > Saltstack >

企业运维-----Saltstack自动化(简介、安装、远程执行、grains、Jinja模板)

时间:2023-03-18 00:16来源:csdn.net 作者:北秋
简介、安装、远程执行、grains、Jinja模板
一、Saltstack简介
1.简介
2.Saltstack通信机制
二、安装
1.服务端server1
(1)配置网络仓库
(2)安装saltstack-master
(3)将仓库配置传给要配置的客户端server2和server3
(4)启动master服务端
2.客户端server2和server3
(1)安装客户端(saltstack-minion)server2和server3(同理)
(2)配置客户端
3.saltstack服务端(master)和客户端(minion)的连接
(1)查看测试连接成功
(2)端口状态
(3)查看进程作用
三、saltstack远程执行
1.命令式
2.模块化远程执行
(1)创建模块
(2)配置管理
3.编写远程执行模块:在server2 中部署apache
(1)写法一
模块编写
编写修改好的配置文件,并执行模块
(2)模块写法二
4.grains匹配运用:在server3部署nginx
(1)安装nginx
(2)配置并启动nginx
(3)编写模块
(4)server3查看nginx是否启动成功
四、grains
1.简介
2.信息查询
(1)自定义grains项
server2:在/etc/salt/minion中定义
(2)检测
server3:在/etc/salt/grains中定义
3.在salt-master端创建_grains目录
4.pillar简介
5.自定义pillar项
6.pillar数据匹配
五、Jinja模板
1.简介
2.Jinja模板使用方式
3.Jinja模板使用方式
server2
server3



 
一、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.
1
2
(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 
 
在这里插入图片描述

(责任编辑:IT)
------分隔线----------------------------
  • 上一篇:没有了
  • 下一篇:没有了