自动化运维工具saltstack入门----第一章

实验素材

172.25.10.1---->server1 master端
172.25.10.2 ---->server2 minion
172.2510.3 ---->server3 minion

所有主机关闭火墙,关闭selinux

1.saltstack的简单介绍

来源于百度百科

SaltStack管理工具允许管理员对多个操作系统创建
一个一致的管理系统,包括VMware vSphere环境。 

特 点
管理员能对多个操作系统进行管理
作用对象
仆从和主拓扑

工作原理

SaltStack作用于仆从和主拓扑
SaltStack与特定的命令结合使用
可以在一个或多个下属执行。
实现这一点,此时Salt Master可以发出命令,如salt ‘*’ cmd.run ‘ls -l /’。
除了运行远程命令,````SaltStack允许管理员使用“grain”。grain可以在SaltStack仆从运行远程查询,因此收集仆从的状态信息并允许管理员在一个中央位置存储信息。SaltStack也可以帮助管理员定义目标系统上的期望状态。这些状态在应用时会用到.sls文件,其中包含了如何在系统上获得所需的状态非常具体的要求。
由于它提供了在管理远程系统的灵活性,SaltStack-based产品迅速获得利益。该功能可以对比由状态管理系统提供的功能,如Puppet和Ansible。SaltStack很大程度上得益于快速的采用率,它包括一个在管理系统上运行远程命令的有效方式。

2.saltstack的安装与配置

阿里云的源

sudo yum install https://mirrors.aliyun.com/saltstack/yum/redhat/salt-repo-latest-2.el7.noarch.rpm

sudo sed -i "s/repo.saltstack.com/mirrors.aliyun.com\/saltstack/g" /etc/yum.repos.d/salt-latest.repo

[root@server1 yum.repos.d]# cat salt-latest.repo 
[salt-latest]
name=SaltStack Latest Release Channel for RHEL/Centos $releasever
baseurl=https://mirrors.aliyun.com/saltstack/yum/redhat/7/$basearch/latest
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/saltstack-signing-key

master端: 安装如下软件包后直接重启
server1(主机名)
[root@server1 yum.repos.d]#yum install -y salt-master.noarch

systemctl enable --now salt-master.service

minion端

server2
server3

yum install salt-minion.noarch -y

vim /etc/salt/minion
16 master: 172.25.10.1

systemctl enable --now salt-minion.service

所有主机关闭火墙,selinux

测试:master端执行命令允许minion连接:

master端

salt-key -L
salt-key -A
在这里插入图片描述

端口:

SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队 列通信,默认监听4505端口

Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听 4506端口。

4505
4506
如下,连接正常
在这里插入图片描述

lsof -i :4505
在这里插入图片描述

salt '*' test.ping 测试

在这里插入图片描述

cd /var/cache/salt/master/jobs/ —>所有信息的缓存
[root@server1 jobs]# ls
d3

客户主机 salt-key -L 列出的主机名,就是此文件中的当其主机名更换时,需要删掉此文件,否则列出的仍是之前的主机名
[root@server2 salt]# cat /etc/salt/minion_id
server2[root@server2 salt]#

3.saltstack的远程运行

3.1 远程执行shell命令

salt '*' cmd.run 'uname -a'
salt 'server2' sys.doc pkg 查看模块文档
salt 'server2' pkg.install httpd
salt 'server2' pkg.remove httpd

salt内置的执行模块列表:
http://docs.saltstack.cn/ref/modules/all/index.html

在这里插入图片描述

3.2编写远程执行模块

master 端(server1)

vim /etc/salt/master
在这里插入图片描述

1 建立主目录 mkdir /srv/salt
在主配置目录下建立一个目录,
mkdir /srv/salt/apache
所有的文件以.sls结尾.不能使用tab键

sls文件编写规则

Salt 状态系统的核心是SLS,
或者叫SaLt State 文件。
• SLS表示系统将会是什么样的
一种状态,而且是以一种
很简单的格式来包含这些数据,
• sls文件命名:
sls文件以”.sls”后缀结尾,
但在调用写此后缀
使用子目录来做组织是个很好的选择。
init.sls在一个子目录里面表示引导文件,
也就表示子目录本身, 所以apache/init.sls
就是表示apache.
如果同时存在apache.slsapache/init.sls,apache/init.sls 被忽略,apache.sls将被用来表示apache

[root@server1 apache]# ls
index.html install.sls

install.sls ------>安装httpd.php .....配置apache的测试页
[root@server1 apache]# cat install.sls
apache:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
file.managed:
- source: salt://apache/index.html
- name: /var/www/html/index.html
service.running:
- name: httpd

解释
apache:                 # ID declaration 声明
  pkg:                  # state declaration  
    - installed         # function declaration

运行
[root@server1 apache]# salt server2 state.sls apache.install

salt 'server2' sys.doc pkg | grep pkg.install查看帮助
salt server2 cmd.run 'rpm -q httpd' 在远端调用
server2:
httpd-2.4.6-88.el7.x86_64

效果检测

[root@server1 apache]# md5sum index.html 文件的md5码一样
e8b32bc4d7b564ac6075a1418ad8841e index.html
[root@server2 html]# md5sum index.html
e8b32bc4d7b564ac6075a1418ad8841e index.html

官方手册

http://docs.saltstack.cn/ref/states/all/index.html
crtl+f查找关键字

[root@server1 apache]# ls
httpd.conf index.html install.sls
[root@server1 apache]# cat install.sls
apache:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
file.managed:
- source: salt://apache/index.html
- name: /var/www/html/index.html
service.running:
- name: httpd
- enable: true
- watch: 监控的是file : 文件名就是声明
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/httpd.conf

[root@server1 apache]#salt server2 state.sls apache.install

[root@server1 apache]# cat install.sls
apache: 一个声明下的模块是唯一的
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
file.managed:
- source: salt://apache/httpd.conf
- name: /etc/httpd/conf/httpd.conf
service.running:
- name: httpd
- enable: true
- watch:
- file: apache ##监控会去找相应声明下的file模块的文件名字

#/etc/httpd/conf/httpd.conf:
# file.managed:
#   - source: salt://apache/httpd.conf
#

init.sls文件:引导文件,可以直接找到,无需路径

[root@server1 apache]#mv install.sls init.sls
[root@server1 apache]# ls
httpd.conf index.html init.sls
[root@server1 apache]# pwd
/srv/salt/apache
salt server2 state.sls apache

[root@server1 salt]# pwd
/srv/salt
[root@server1 salt]# ls
apache
[root@server1 salt]# vim apache.sls
[root@server1 salt]# ls
apache apache.sls
[root@server1 salt]# salt server3 state.sls apache 直接匹配的是/srv/salt/apache.sls(其优先级高与apache目录下的init.sls文件)

远程执行模块

master端配置

mkdir /srv/salt/_modules创建模块目录
vim /srv/salt/_modules/mydisk.py编写模块文件
def df():
return salt[‘cmd.run’](‘df -h’) 去同步端执行df -h命令

salt server2 saltutil.sync_modules 同步
在这里插入图片描述

minion端

在这里插入图片描述

4. grains

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

4.1信息查询

查询minion 端的信息
默认可用的grains

salt server2 grains.item ipv4 取指定值

salt server2 grains.ls | 列出所有可以查询的键值
salt server2 grains.items | 列出所有键值及其信息

4.2自定义grains项

第一种

在minion端服务的主配置文件操作。同步到master端

eg:server2中
vim /etc/salt/minion 编辑主配置文件
在这里插入图片描述
systemctl restart salt-minion.service 重启服务

测试,可以在minion端做好配置后,master端得到grains的值
在这里插入图片描述

第二种方式

在server端编写/etc/salt/grains文件,定义,在master端同步

server3主机
3 主机写的是Nginx

vim /etc/salt/grains

roles:
- nginx

在master端进行同步
salt server3 saltutil.sync_grains
salt server3 grains.item roles

在这里插入图片描述

在这里插入图片描述

第三种

在master端创建_grains目录 编辑文件同步到minion

mkdir /srv/salt/_grains
vim /srv/salt/_grains/mygrains.py
def my_grain():
grains = {}
grains[‘salt’] = ‘stack’
grains[‘hello’] = ‘world’
return grains

salt '*' saltutil.sync_grains 同步grains到minion端

在这里插入图片描述

缓存放在/var/cache/salt/minion目录下

4.3grains匹配运用

grains定义生效后才能在top.sls中应用

1.在target中匹配minion

salt -G roles:apache test.ping

在这里插入图片描述

2.top 文件中匹配

grains定义生效后才能在top.sls中应用
在这里插入图片描述
gains被定义好后,用top匹配
server2去执行apache ,server3去执行nginx

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

apache

[root@server1 apache]# cat init.sls 
apache:    
  pkg.installed:
    - pkgs:
      - httpd
      - php
      - php-mysql
  file.managed:
    - source: salt://apache/httpd.conf
    - name: /etc/httpd/conf/httpd.conf
  service.running:
    - name: httpd
    - enable: true
    - watch:
      - file: apache  
/var/www/html/index.html:
  file.managed:
    - source: salt://apache/index.html

nginx.conf文件当解压后就有


[root@server1 nginx]# cat init.sls
include:
  - nginx.install     #####将文件包函进去,即nginx目录下的install.sls

/usr/local/nginx/conf/nginx.conf:    目的文件路径
  file.managed:
    - source: salt://nginx/nginx.conf

nginx-service:
  user.present:
    - name: nginx
    - shell: /sbin/nologin
    - home: /usr/local/nginx
    - createhome: false
  file.managed:
    - source: salt://nginx/nginx.service
    - name: /usr/lib/systemd/system/nginx.service
  service.running:
    - name: nginx
    - enable: true
    - reload: true
    - watch:
      - file: /usr/local/nginx/conf/nginx.conf
 			
[root@server1 nginx]# cat install.sls     ####声明++模块+++++模块下的操作
nginx-install:
 pkg.installed:
   - pkgs:
     - gcc
     - pcre-devel
     - openssl-devel
 file.managed:
   - source: salt://nginx/nginx-1.18.0.tar.gz
   - name: /mnt/nginx-1.18.0.tar.gz
 cmd.run:
   - name: cd /mnt && tar zxf nginx-1.18.0.tar.gz && cd nginx-1.18.0 && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make &> /dev/null && make install &> /dev/null
   - creates: /usr/local/nginx
了解基本用法查找内置模块帮助
http://docs.saltstack.cn ------>salt Module  Reference -------->所有内置的state模块列表------> crtl +f 查找关键字
++++-creates  ---Only run if the file specified by creates does not exist, in this case touch /tmp/foo if it does not exist.+++
cmd.run 
name :要执行的命令,记住该命令将会在salt-minion的路径和权限下执行
[root@server1 nginx]# 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

#################
不同的主机去执行所定义的操作
2 主机写的是apache
3 主机写的是Nginx
#################

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

在这里插入图片描述

5.pillar

piiar和grains一样也是一个数据系统,但两者应用场景不同
pillar: 是将信息动态存放在master端,主要存放私密信息,而且可以指定某一个minion才可以看到相应的信息
pillar更加时和在配置管理中应用

5.1声明pillar

定义pillar基础目录

master端
vim /etc/salt/master
在这里插入图片描述
mkdir /srv/pillar
systemctl restart salt-master

5.2自定义pillar项

vim /srv/pillar/top.sls
base:
‘*’:
- package

vim /srv/pillar/package.sls
{% if grains[‘fqdn’] == ‘server3’ %}
package: nginx
{% elif grains[‘fqdn’] == ‘server2’ %}
port: 80
bind: 172.25.10.2
{% endif %}
在这里插入图片描述

刷新pillar数据:
salt '*' saltutil.refresh_pillar
在这里插入图片描述

查询pillar数据:
salt ‘’ pillar.items
salt '
’ pillar.item roles
在这里插入图片描述

5.3 pillar数据匹配

1.命令行中匹配:``
salt -I ‘package:nginx’ test.ping

在这里插入图片描述

2.state系统中使用:
vim /etc/httpd/conf/httpd.conf
{% from 'apache/lib.sls' import port %} jinja模板的import方式
Listen { { bind }}:{ { port }}

在这里插入图片描述

[root@server1 pillar]# salt server2 state.sls apache

在这里插入图片描述

6.jinja模板

在上面的案例中,在使用变量的时候也采用了jinja模板
jinja模板的基础应用
两种分隔符: {% … %} 和 { { … }},前者用于执行诸如 for 循环 或
赋值的语句,后者把表达式的结果打印到模板上。Jinja模板使用方式

Jinja最基本的用法是使用控制结构包装条件:

1.如上实验中的package.sls
2.在上饰演中的apache/init.sls 文件中的使用
3。如上实验中的httpd.conf文件中导入的方式(定义变量文件lib.sls,导入模板文件)

7.应用案例:

应用一.配置keepalived

在这里插入图片描述

[root@server1 keepalived]# cat init.sls 
kp-install:
  pkg.installed:
    - name: keepalived
  file.managed:
    - name: /etc/keepalived/keepalived.conf
    - source: salt://keepalived/files/keepalived.conf
    - template: jinja
    - context:
      STATE: {
    
    {
    
     pillar['state'] }}
      VRID: {
    
    {
    
     pillar['vrid'] }}
      PRI: {
    
    {
    
     pillar['pri'] }}
  service.running:
    - name: keepalived
    - enable: true
    - reload: true
    - watch:
      - file: kp-install
[root@server1 keepalived]# cat files/keepalived.conf 
! Configuration File for keepalived

global_defs {
    
    
notification_email {
    
    
 root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    
    
 state {
    
    {
    
     STATE }}
 interface eth0
 virtual_router_id {
    
    {
    
     VRID }}
 priority {
    
    {
    
     PRI }}
 advert_int 1
 authentication {
    
    
     auth_type PASS
     auth_pass 1111
 }
 virtual_ipaddress {
    
    
 172.25.10.100
 }
}

salt '*' state.sls keepalived
或者加进top 文件中 ,一起运行

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

在这里插入图片描述

应用二,配置zabbix,

数据库的配置,及导入数据到数据库中
在这里插入图片描述

[root@server1 mysql]# cat init.sls 
mysql-install:
  pkg.installed:
    - pkgs:
      - mariadb-server
      - MySQL-python
  file.managed:
    - name: /etc/my.cnf
    - source: salt://mysql/files/my.cnf
  service.running:
    - name: mariadb
    - enable: true
    - watch:
      - file: mysql-install

mysql-config:
  mysql_database.present:
    - name: zabbix
  mysql_user.present:
    - name: zabbix
    - host: '%'
    - password: "westos"
  mysql_grants.present:
    - grant: all privileges
    - database: zabbix.*
    - user: zabbix
    - host: '%'
  file.managed:
    - name: /mnt/create.sql
    - source: salt://mysql/files/create.sql
  cmd.run:
    - name: mysql zabbix < /mnt/create.sql && touch /mnt/zabbix.lock
    - creates: /mnt/zabbix.lock

先安装完数据库就会生成/etc/my.cnf文件 .复制后添加

[root@server1 files]# vim my.cnf  先执行前面,安装完就会生成此文件,添加
 10 log-bin=mysql-bin
 11 character-set-server=utf8

先执行zabbix-server的安装,当安装完成后就会出现此文件
[root@server2 zabbix-server-mysql-4.0.5]# scp /etc/zabbix/zabbix-server-mysql-4.0.5/create.sql.gz server1:/srv/salt/mysql/files/

gunzip create.sql.gz ----->create.sql

在这里插入图片描述


[root@server1 zabbix-server]# cat init.sls 
zabbix-server:
  pkgrepo.managed:
    - name: zabbix
    - humanname: zabbix 4.0
    - baseurl: http://172.25.254.250/pub/docs/zabbix/4.0
    - gpgcheck: 0
  pkg.installed:
    - pkgs:
      - zabbix-server-mysql
      - zabbix-agent
      - zabbix-web-mysql
  file.managed:
    - name: /etc/zabbix/zabbix_server.conf
    - source: salt://zabbix-server/files/zabbix_server.conf
  service.running:
    - name: zabbix-server
    - enable: true
    - watch:
      - file: zabbix-server

zabbix-agent:
  service.running

zabbix-web:
  file.managed:
    - name: /etc/httpd/conf.d/zabbix.conf
    - source: salt://zabbix-server/files/zabbix.conf
  service.running:
    - name: httpd
    - enable: true      ???###触发
    - watch:
      - file: zabbix-web

/etc/zabbix/web/zabbix.conf.php:
  file.managed:
    - source: salt://zabbix-server/files/zabbix.conf.php

zabbix.conf    {/etc/http/conf.d/}   ----->重启httpd
 20         php_value date.timezone Asia/Shanghai

zabbix_server.conf   {/etc/zabbix/}
91 DBHost=172.25.10.3
100 DBName=zabbix
116 DBUser=zabbix
124 DBPassword=westos
zabbix.conf.php   {/etc/zabbix/web}
当在页面中完成初始化操作,此文件会记录,删掉,需重新初始化
在做初始化操作的时候

在这里插入图片描述

检查是否触发重启httpd.否则无法进入初始化页面
在这里插入图片描述

8.job管理

8.1job的基本了解

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

Job cache

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

8.2把job存储到数据库

两种方式

第一种:在minion端操作,—>master数据库中

minion 端

上面实验的server3 已经安装过了数据库
rpm -q MySQL-python
MySQL-python-1.2.5-1.el7.x86_64

[root@server3 mnt]# vim /etc/salt/minion
在这里插入图片描述

systemctl restart salt-minion.service

master端。只需要安装mariadb-server
启动数据库
[root@server1 ~]#vim salt.sql
配置文件帮助,及 salt.sql 文件
http://docs.saltstack.cn/ref/returners/all/salt.returners.mysql.html#module-salt.returners.mysql

删掉此行CREATE INDEX jid ON jids(jid) USING BTREE;

mysql < salt.sql 导入数据

mysql
MariaDB [(none)]> grant all on salt.* to salt@‘localhost’ identified by ‘westos’;
[root@server1 ~]# mysql -u salt salt -p
在这里插入图片描述

在这里插入图片描述

第二种

在master端

yum install MySQL-python mariadb-server

vim /etc/salt/master
在这里插入图片描述

systemctl restart salt-master

在这里插入图片描述

mysql -u salt salt -p
数据库有信息返回
在这里插入图片描述

9.salt-ssh

salt-ssh 结构

结构特点
salt-ssh可以独立运行的,不需要minion端。
salt-ssh 用的是sshpass进行密码交互的。
以串行模式工作,性能下降

[root@server1 ~]#

vim /etc/saltroster
在这里插入图片描述

[root@server2 yum.repos.d]# systemctl stop salt-minion.service 关掉
测试

server1中 yum install -y salt-ssh

在这里插入图片描述

10.salt-syndic

当有多台minion时。一台master无法很好的工作,syndic类似与代理,,隔离master与minion
Syndic必须要运行在master上,再连接到另一个topmaster上。
代理,隔离master与minion。
Topmaster 下发的状态需要通过syndic来传递给下级master,minion
topmaster并不知道有多少个minion。
syndic与topmaster的file_roots和pillar_roots的目录要保持一致。

10.1salt-syndic的配置

topmaster端(server4):

yum insatll salt-master -y
vim /etc/salt/master

在这里插入图片描述

systemctl start salt-master

下级master端: 1中

yum install -y salt-syndic
vim /etc/salt/master
在这里插入图片描述
systemctl restart salt-master
systemctl start salt-syndic
#指向topmaster

测试

• # salt-key -L
• # salt-key -A
#作为顶级master
#查看下级master的连接授权salt-syndic配置
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ninimino/article/details/112898252