自动化运维工具saltstack(二)---grains、pillar、job cache、jinja模板详解与nginx、keepalived服务的配置

1.配置管理(续)

现在,在上一篇博文的基础上,继续讲一下配置管理。补充一下sls文件的知识:
 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.

(1)想要批量执行上一篇博客中的apache.install,在base目录下准备top.sls文件:

# vim /srv/salt/top.sls
base:
  '*':
    - apache.install

在这里插入图片描述
(2)批量执行:

salt '*' state.highstate
在这里插入图片描述

在这里插入图片描述
可以看到server2和server3都执行了apache.install,在server3上查看进程
在这里插入图片描述
(3)现在,想要在server3中推nginx服务,那么nginx如何推呢?install.sls文件怎么写呢?具体操作如下:
base模式下,建立nginx子目录,并在子目录下建立files目录,获取nginx安装到到files目录下:

[root@server1 salt]# pwd
/srv/salt
[root@server1 salt]# mkdir nginx
[root@server1 salt]# cd nginx/
[root@server1 nginx]# scp root@172.25.33.250:/home/kiosk/Desktop/nginx-1.15.8.tar.gz .
The authenticity of host '172.25.33.250 (172.25.33.250)' can't be established.
ECDSA key fingerprint is SHA256:Bb8c7OXdsCYqQj0jSzzS/ESbOEP/47vePQXgV4L86es.
ECDSA key fingerprint is MD5:6d:4e:ce:d1:b5:65:f4:cb:0a:21:0b:b8:45:a7:1a:b7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.25.33.250' (ECDSA) to the list of known hosts.
root@172.25.33.250's password: 
nginx-1.15.8.tar.gz                           100% 1004KB  36.9MB/s   00:00    
[root@server1 nginx]# mkdi files
-bash: mkdi: command not found
[root@server1 nginx]# mkdir files
[root@server1 nginx]# mv nginx-1.15.8.tar.gz files
[root@server1 nginx]# cd files/
[root@server1 files]# ls
nginx-1.15.8.tar.gz

在这里插入图片描述

nginx子目录下准备install.sls文件:

##拆分的写Install.sls文件,先写简单操作,nginx压缩文件的解压
[root@server1 nginx]# cat install.sls 
install-nginx:
  file.managed:
    - name: /mnt/nginx-1.15.8.tar.gz
    - source: salt://nginx/files/nginx-1.15.8.tar.gz

  cmd.run:
    - name: cd /mnt && tar zxf nginx-1.15.8.tar.gz && cd nginx-1.15.8
#进行推送,结果如下:

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

##现在,进行nginx的编译,install.sls文件如下:
include:
  - pkgs.install          ##将编译过程中使用的依赖性软件,写成Install.sls文件,包含进来

install-nginx:
  file.managed:
    - name: /mnt/nginx-1.15.8.tar.gz
    - source: salt://nginx/files/nginx-1.15.8.tar.gz

  cmd.run:
    - name: cd /mnt && tar zxf nginx-1.15.8.tar.gz && cd nginx-1.15.8 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install
    - creates: /usr/local/nginx
[root@server1 nginx]# mkdir ../pkgs
[root@server1 nginx]# vim ../pkgs/install.sls
[root@server1 nginx]# cat ../pkgs/install.sls
nginx-make:     ##nginx编译所需软件
  pkg.installed:
    - pkgs:
      - gcc:
      - make
      - zlib-devel
      - pcre-devel
##进行推送,结果如下:

在这里插入图片描述

##客户端执行结果 通过4506返回给master端 通过zmq消息队列实现的
返回结果实际上是保存的缓存里的 /var/cache/salt/master/jobs  会保存24小时 
在生产实际中是将缓存数据和数据库结合在一起的
[root@server1 nginx]# cd /var/cache
[root@server1 cache]# ls
ldconfig  man  salt  yum
[root@server1 cache]# cd salt/
[root@server1 salt]# cd master/
[root@server1 master]# cd jobs/
[root@server1 jobs]# ls
13  20  4b  57  59  60  61  77  86  98  9f  a0  a8  ad  ae  e1  eb  f2  f5  f6

在这里插入图片描述

##准备nginx.conf到files目录下,并修改nginx.conf文件,使worker进程适应远程主机的cpu数
[root@server1 nginx]# pwd
/srv/salt/nginx
[root@server1 nginx]# ls
files  install.sls  service.sls
[root@server1 nginx]# cd files/
[root@server1 files]# scp root@172.25.33.3:/usr/local/nginx/conf/nginx.conf .
root@172.25.33.3's password: 
nginx.conf                                    100% 2656     1.3MB/s   00:00    
[root@server1 files]# ls
nginx-1.15.8.tar.gz  nginx.conf
[root@server1 files]# vim nginx.conf 

在这里插入图片描述

##nginx目录下,编写service.sls文件,将nginx.install包括进来:
[root@server1 nginx]# cat service.sls 
include:
  - nginx.install

/usr/local/nginx/sbin/nginx:
  cmd.run:
    - creates: /usr/local/nginx/logs/nginx.pid

/usr/local/nginx/conf/nginx.conf:
  file.managed:
    - source: salt://nginx/files/nginx.conf

/usr/local/nginx/sbin/nginx -s reload:
  cmd.wait:
    - watch:
      - file: /usr/local/nginx/conf/nginx.conf

最后,在files下配置文件准备完毕,base下nginx目录中install.sls准备完毕,service.sls文件也准备完毕,可以进行最后推送

[root@server1 nginx]# salt server3 state.sls nginx.service

在这里插入图片描述

在这里插入图片描述
(4)在server3中推动成功之后,进行nginx启动方式的修改,使用systemd启动nginx更方便,所以,首先,在files下准备脚本文件

##files下准备脚本文件
[root@server1 files]# cat nginx.service 
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.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

在这里插入图片描述

##修改之前的service.sls文件,将脚本包括进去
nclude:
  - nginx.install

/usr/local/nginx/conf/nginx.conf:
  file.managed:
    - source: salt://nginx/files/nginx.conf

service-nginx:
  file.managed:
    - name: /usr/lib/systemd/system/nginx.service
    - source: salt://nginx/files/nginx.service

  service.running:
    - name: nginx
    - reload: True
    - watch:
      - file: /usr/local/nginx/conf/nginx.conf

在这里插入图片描述

##最后,在base目录下修改top.sls,直接高亮匹配推送
[root@server1 salt]# cat top.sls 
base:
  'server2':
    - apache.install
  'server3':
    - nginx.service

##在推送之前,因为server3上已经开启nginx进程,所以先将nginx的master的worker的进程关闭
 4414 ?        Ss     0:00 nginx: master process /usr/local/nginx/sbin/nginx
 4417 ?        S      0:00 nginx: worker process
12601 ?        R      0:00 [kworker/0:1]
14507 pts/0    R+     0:00 ps ax
[root@server3 ~]# kill -9 4414
[root@server3 ~]# kill -9 4417

在这里插入图片描述

在这里插入图片描述
salt '*' state.highstate

在这里插入图片描述
在这里插入图片描述
server3的nginx推送成功!!!
在这里插入图片描述

2.Grains详解

(1)Grains简介

 Grains是SaltStack的一个组件,存放在SaltStack的minion端。
 当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
 由于grains是静态数据,因此不推荐经常去修改它。
应用场景:
 信息查询,可用作CMDB。
 在target中使用,匹配minion。
 在state系统中使用,配置管理模块。

(2)Grains信息查询
用于查询minion端的IP、FQDN等信息。
 默认可用的grains:

salt '*' grains.ls
在这里插入图片描述
查看每一项的值:
salt '*' grains.items
在这里插入图片描述
取单项的值:
salt server3 grains.item ipv4
salt server3 grains.item fqdn
在这里插入图片描述
(3)自定义grains项
在/etc/salt/minion中定义:
vim /etc/salt/minion
grains:
roles:
- apache

重启salt-minion,否则数据不会更新:
systemctl restart salt-minion

在这里插入图片描述
在server1中获取server2中的roles

[root@server1 salt]# salt server2 grains.item roles
server2:
    ----------
    roles:
        - apache

在这里插入图片描述
在server3中的/etc/salt/grains中定义:
vim /etc/salt/grains:
roles: nginx
同步数据:
salt server3 saltutil.sync_grains
查询自定义项:
salt server3 grains.item roles

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

(4)编写grains模块

在salt-master端创建_grains目录:
mkdir /srv/salt/_grains
vim /srv/salt/_grains/my_grain.py
def my_grain():
  grains = {}
  grains[‘roles’] = nginx
  grains[‘hello’] = ‘world’
  return grains
salt server2 saltutil.sync_grains #同步grains到minion端

在这里插入图片描述

##在server2中查看文件的父级结构
[root@server2 salt]# pwd
/var/cache/salt
[root@server2 salt]# tree .
.
└── minion
    ├── accumulator
    ├── extmods
    │   └── grains
    │       ├── my_grains.py
    │       └── my_grains.pyc
    ├── files
    │   └── base
    │       ├── apache
    │       │   ├── files
    │       │   │   └── httpd.conf
    │       │   └── install.sls
    │       ├── _grains
    │       │   └── my_grains.py
    │       └── top.sls
    ├── highstate.cache.p
    ├── module_refresh
    ├── pkg_refresh
    ├── proc
    └── sls.p

10 directories, 10 files

(5)grains匹配运用
在target中匹配minion:
salt -G 'roles:apache'test.ping
salt -G 'roles:nginx'test.ping
在这里插入图片描述
在这里插入图片描述
在top文件中匹配:
vim /srv/salt/top.sls
base:
  ‘roles:apache’:
  - match: grain
  - apache.install
  ‘roles:nginx’:
  - match: grain
  - nginx.service
# salt '*' state.highstate ##全部主机推送

[root@server1 salt]# salt -G 'hello:world' test.ping    ##匹配hello:world关键字的主机
server2:
    True
server3:
    True

在这里插入图片描述

3.pillar详解

(1)pillar简介

pillar和grains一样也是一个数据系统,但是应用场景不同。
 pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才可以看到对应的信息。
 pillar更加适合在配置管理中运用。

(2)声明pillar
定义pillar基础目录:
vim /etc/salt/master
pillar_roots:
base:
  - /srv/pillar
mkdir /srv/pillar
重启salt-master服务:
systemctl restart salt-master
在这里插入图片描述

在这里插入图片描述
自定义pillar项

[root@server1 salt]# cd /srv/pillar
[root@server1 pillar]# ls
[root@server1 pillar]# mkdir web
[root@server1 pillar]# cd web
[root@server1 web]# vim vars.sls
[root@server1 web]# cat vars.sls 
{% if grains['fqdn'] == 'server3' %}
webserver: nginx
{% elif grains['fqdn'] == 'server2' %}
webserver: httpd
{% endif %}

[root@server1 web]# vim ../top.sls
[root@server1 web]# cat ../top.sls 
base:
  '*':      ##所有主机都包含vars资源
    - web.vars

在这里插入图片描述
刷新pillar数据:
salt '*' saltutil.refresh_pillar
查询pillar数据:
salt '*' pillar.items
salt server2 pillar.item webserver
salt server3 pillar.item webserver

在这里插入图片描述

4.jinja模板详解

(1)jinja模板简介
Jinja是一种基于python的模板引擎,在SLS文件里可以直接使用jinja模板来做一些操作。
 通过jinja模板可以为不同服务器定义各自的变量。
 两种分隔符: {% … %} 和 {{ … }},前者用于执行诸如 for 循环 或赋值的语句,后者把表达式的结果打印到模板上。

(2)Jinja模板使用方式

Jinja在普通文件的使用:

[root@server1 apache]# cat install.sls 
install-apache:
  pkg.installed:
    - pkgs:
      - httpd

  file.managed: 
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://apache/files/httpd.conf
    - template: jinja    ##使用jinja模板为port赋值
    - context:
      port: 80

  service.running:
    - name: httpd
    - reload: true
    - watch:
      - file: install-apache

在这里插入图片描述
在apache/files下修改httpd.conf
在这里插入图片描述

给server2中推送:
salt server2 state.sls apache.install
在这里插入图片描述
在这里插入图片描述

[root@server1 apache]# vim install.sls 
[root@server1 apache]# cat install.sls 
install-apache:
  pkg.installed:
    - pkgs:
      - httpd

  file.managed: 
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://apache/files/httpd.conf
    - template: jinja
    - context:
      port: 80
      host: 172.25.4.2    ##配置文件中定义主机名

  service.running:
    - name: httpd
    - reload: true
    - watch:
      - file: install-apache

[root@server1 apache]# cd files/
[root@server1 files]# ls
httpd.conf
[root@server1 files]# vim httpd.conf     ##配置文件中修改监听格式
[root@server1 files]# salt server2 state.sls apache.install

在这里插入图片描述
再次进行推送:salt server2 state.sls apache.install
在这里插入图片描述
查看server2中的httpd.conf文件
在这里插入图片描述
(3)使用grains取值方式给模板变量赋值

install-apache:
  pkg.installed:
    - pkgs:
      - httpd

  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://apache/files/httpd.conf
    - template: jinja
    - context:
      port: 80
      host: {{ grains['ipv4'][-1] }}     ##grains取值方式

  service.running:
    - name: httpd
    - reload: true
    - watch:
      - file: install-apache

在这里插入图片描述
进行推送:推送成功

在这里插入图片描述
也可以直接在配置文件中使用grains取值
在这里插入图片描述
进行推送:推送成功

在这里插入图片描述
(4)使用pillar取值方式给模板变量赋值

[root@server1 apache]# cat install.sls 
install-apache:
  pkg.installed:
    - pkgs:
      - httpd

  file.managed: 
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://apache/files/httpd.conf
    - template: jinja
    - context:
      port: 80
      host: {{ pillar['ip'] }}     ##需要在pillar的base目录下的sls文件中指名ip变量

  service.running:
    - name: httpd
    - reload: true
    - watch:
      - file: install-apache

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

将配置文件中监听格式改为原样,并且在/srv/pillar/web/vars.sls文件中,赋值给ip变量

在这里插入图片描述

进行推送:推送成功

在这里插入图片描述

也可以直接在配置文件中使用pillar取值
在这里插入图片描述

进行推送:推送成功

在这里插入图片描述

(5)import方式

import方式,可在state文件之间共享:
定义变量文件:
vim lib.sls
{% set port = 80 %}

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

导入模板文件:
vim httpd.conf
{% from 'apache/lib.sls' import port %}

Listen {{ host }}:{{ prot }}
在这里插入图片描述

进行推送:推送成功
在这里插入图片描述

备注:在/srv/salt/nginx/install.sls文件中可以加入{% set nginx_version = 1.15.8 %},然后在文件中所有使用到版本的时候,都可以直接引用{{ nginx_version }}**

5.高可用keepalived的部署

(1)/srv/salt下建立keepalived子目录,编写install.sls文件

[root@server1 keepalived]# cat install.sls 
install-keepalived:
  pkg.installed:
    - pkgs:
      - keepalived

  file.managed:
    - name: /etc/keepalived/keepalived.conf
    - source: salt://keepalived/files/keepalived.conf
    - template: jinja
    - context:
      STATE: {{ pillar['state'] }}
      VRID: {{ pillar['vrid'] }}
      PRIORITY: {{ pillar['priority'] }}
      

  service.running:
    - name: keepalived
    - watch:
      - file: install-keepalived

在这里插入图片描述
(2)修改files下的keepalived.conf配置文件

[root@server1 keepalived]# cd files/
[root@server1 files]# pwd
/srv/salt/keepalived/files
[root@server1 files]# cp /etc/keepalived/keepalived.conf .
[root@server1 files]# ls
keepalived.conf
[root@server1 files]# vim keepalived.conf 

在这里插入图片描述
(3)pillar的base目录下,为变量赋值

[root@server1 files]# cd /srv/pillar
[root@server1 pillar]# ls
top.sls  web
[root@server1 pillar]# cd web/
[root@server1 web]# vim vars.sls 
[root@server1 web]# cat vars.sls 
{% if grains['fqdn'] == 'server2' %}
ip: 172.25.33.2
state: MASTER
vrid: 4
priority: 100
{% elif grains['fqdn'] == 'server3' %}
state: BACKUP
vrid: 4
priority: 50

在这里插入图片描述

(4)编写top.sls文件:

[root@server1 salt]# cat top.sls 
base:
  'roles:apache':
    - match: grain
    - apache.install
    - keepalived.install
  'roles:nginx':
    - match: grain
    - nginx.service
    - keepalived.install

在这里插入图片描述

(5)进行推送

[root@server1 salt]# salt '*' state.highstate

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

(6)查看server2和3的进程,查看vip是否在server2上,当server2关闭主keepalived服务时,vip能够飘移

[root@server2 conf]# systemctl stop keepalived.service

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

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

6.salt job cache管理

(1)Job简介
 master在下发指令任务时,会附带上产生的jid。
 minion在接收到指令开始执行时,会在本地的/var/cache/salt/minion/proc目录下产生该jid命名的文件,用于在执行过程中master查看当前任务的执行情况。
 指令执行完毕将结果传送给master后,删除该临时文件。

(2)默认JOB CACHE

Job缓存默认保存24小时:
vim /etc/salt/master
keep_jobs: 24
master端Job缓存目录:
/var/cache/salt/master/jobs

(3)把Job存储到数据库
在这里插入图片描述

1.修改master端配置:
vim /etc/salt/master
master_job_cache: mysql
mysql.host: ‘localhost’
mysql.user: ‘salt’
mysql.pass: ‘salt’
mysql.db: ‘salt’
重启salt-master服务:
systemctl restart salt-master
在这里插入图片描述
2.安装mysql数据库:
yum install -y mariadb-server MySQL-python
3.执行数据库初始化脚本:
mysql_secure_installation
在这里插入图片描述
在这里插入图片描述

4.创建数据库授权:
\> grant all on salt.* to salt@localhost identified by 'salt';

在这里插入图片描述

5.导入数据模板:
mysql -p < salt.sql
在这里插入图片描述
6.查看mastere端job缓存目录/var/cache/salt/master/jobs
在这里插入图片描述

7.执行命令,能否保存到数据库:保存成功!
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值