其他分享
首页 > 其他分享> > 7.企业运维-----Saltstack自动化(简介、安装、远程执行、grains、Jinja模板)

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

作者:互联网

简介、安装、远程执行、grains、Jinja模板

一、Saltstack简介

1.简介

2.Saltstack通信机制

二、安装

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)端口状态

[root@server1 ~]# yum install -y python-setproctitle.x86_64 
[root@server1 ~]# systemctl restart salt-master.service 
[root@server1 ~]# ps ax

在这里插入图片描述
在这里插入图片描述

(3)查看进程作用

三、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.简介

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简介

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 

在这里插入图片描述

标签:grains,运维,root,server1,server2,nginx,-----,apache,salt
来源: https://blog.csdn.net/qq_44060147/article/details/118851849