企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品

Saltstack

  • 实验前提
  • saltstack安装及相关内容
  • saltstack远程执行
    • 远程执行shell命令
    • 编写远程之执行模块
  • YAML语法 配置SLS文件
    • 编写一个远程执行安装httpd的sls 为server2安装
    • 编写一个执行安装和配置nginx的sls 为server3安装
      • 安装nginx
      • 安装并配置
  • grains
    • 自定义grains项
    • 编写grains模块
    • grains匹配运用
  • pillar
    • 自定义pillar项
    • jinja模板配合同时为两台主机安装

实验前提

官网:http://www.saltstack.com/
设置官方YUM仓库:yum install http://repo.saltstack.com/yum/redhat/salt-repo-latest.el7.noarch.rpm

saltstack安装及相关内容

yum list salt-* 查看salt的相关安装包

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第1张图片
server1(master端)
下载并开启以及设置开机自启动salt-master服务

yum install salt-master.noarch -y
systemctl enable --now salt-master.service

在这里插入图片描述
在这里插入图片描述
查看端口

4506端口的作用:salt Master Ret接口,支持认证、文件服务、结果收集等功能
4505端口的作用:salt Master pub接口,提供远程执行命令发送功能

在这里插入图片描述
在server2、3(minion端)
下载salt-minion 并修改配置文件 开启并设置开机自启动服务

yum install  salt-minion.noarch
vim /etc/salt/minion
	16 master: 172.25.21.1 #:号后面必须带个空格 master顶格写
systemctl enable --now salt-minion.service

systemctl enable --now salt-minion.service
在这里插入图片描述
注意:如果minion端更改完hostname名后 需要删除/etc/salt/minion_id
否则在master端显示的还是之前的hostname
在这里插入图片描述

到这,minion端则已经设置好

在server1(master端)
进行公钥的相互交换,master端执行命令允许minion连接

salt-key 密钥管理
salt-key -L              ##查看所有minion-key
salt-key -a    ##接受某个minion-key
salt-key -d    ##删除某个minion-key
salt-key -A              ##接受所有的minion-key
salt-key -D              ##删除所有的minion-key

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第2张图片
测试master与minion是否连接成功

salt '*' test.ping #出现true则表示成功

在这里插入图片描述

lsof (list open files)是一个列出当前系统打开文件的工具

yum install -y lsof 
lsof -i :4505
lsof -i :4506

可以看出server1通过4505发送给server2和3
server1通过4506收集server2和3的信息
企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第3张图片
下载python获取进程名字的工具,可以看到运行进程的名字

yum install -y python-setproctitle.x86_64
systemctl restart salt-master.service
ps ax

如下图,可以看到相关进程的名字
企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第4张图片

saltstack远程执行

远程执行shell命令

远程执行命令在matser端输入

salt [options] ''  [arguments]
target:指定哪些minion,默认的规则是使用glob匹配minion id
如:	salt '*' test.ping
	salt -E 'server[1-3]' test.ping
	salt -L 'server2,server3' test.ping
function是module提供的功能,Salt内置了大量有效的functions
如:	salt '*' cmd.run  hostname
	salt '*' cmd.run  'uname -a'
arguments通过空格来界定参数	
如:	salt 'server2' sys.doc pkg 查看pkg模块文档
		salt 'server2' sys.doc service 查看service模块文档

salt内置的执行模块列表
测试master和minion端连接
企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第5张图片
远程执行显示hostname名字
企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第6张图片
远程执行下载安装包的命令模板
在这里插入图片描述
远程执行在server2下载httpd服务

salt 'server2' pkg.install httpd

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第7张图片

远程查看server2的httpd和minion的版本信息

salt 'server2' pkg.version httpd
salt 'server2' pkg.version salt-minion

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第8张图片
远程控制server2的httpd服务开启和关闭

salt 'server2' service.start httpd
salt 'server2' service.stop httpd

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第9张图片

编写远程之执行模块

首先在matser端(server1)

编辑master配置文件(默认base是/srv/salt)
如果你不想修改 可以忽略下面这步操作

vim /etc/salt/master
如果修改了 那就要重启服务salt-master

在这里插入图片描述
默认情况下/srv里面没有salt目录,需要自己建立

mkdir /srv/salt

创建模块目录

mkdir /srv/salt/_modules

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第10张图片
编写模块文件

vim /srv/salt/_modules/my_disk.py
def df():
	return __salt__['cmd.run']('df -h')
#df 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计

在这里插入图片描述

同步模块

salt server2 saltutil.sync_modules
会同步到server2的/var/cache/salt/minion/files/base

如下图,显示同步成功
在这里插入图片描述

在master运行模块

salt server2 my_disk.df

则显示了server2的文件系统磁盘使用情况统计

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第11张图片

YAML语法 配置SLS文件

YAML语法

规则一: 缩进
Salt需要每个缩进级别由两个空格组成,不要使用tabs。
规则二: 冒号
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。
my_key: my_value
规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。
  - list_value_one
  - list_value_two
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.

编写一个远程执行安装httpd的sls 为server2安装

首先在base(也就是/srv/salt)下建立目录apache,在这个目录下建立init.sls,编写内容如下
文件意思大致:下载安装包httpd和php,运行、开机自启动、刷新httpd服务,watch的作用:运行中的 httpd 服务将会关注/etc/httpd/conf/httpd.conf文件的变化,如果发生变化,将会触发重启服务的操作 file.managed可以把自己修改的httpd.conf模板同步到你下载的httpd主机

apache:
  pkg.installed:
    - pkgs:
      - httpd
      - php
  service.running:
    - name: httpd
    - enable: true
    - reload: true
    - watch:
      - file: /etc/httpd/conf/httpd.conf

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

需要在base下的apache下有一个httpd.conf的配置文件,这个可以自己修改自己所需的内容,在远程执行安装时候会将这个httpd.conf的配置文件模板填入到你安装的机器的httpd.conf的配置文件中

salt server2 state.sls apache在master端运行这条命令,即可为server2远程安装httpd服务

编写一个执行安装和配置nginx的sls 为server3安装

安装nginx

首先在base(也就是/srv/salt)下建立目录nginx,在这个目录下建立init.sls,编写内容如下
文件意思大致:安装nginx的依赖性问题,同步base下nginx目录中的nginx压缩包到远程安装主机的/mnt目录下,然后命令运行,进入/mnt—>解压缩nginx压缩包–>进入解压后的目录–>将debug注释掉(在解压后目录的auto/cc/gcc文件中)–>进行源代码安装三部曲
- creates: /usr/local/nginx 这句话的作用是判定有没有/usr/loacl/nginx存在 避免二次安装 如果存在这个目录 则不会执行操作

nginx-install:
  pkg.installed:
    - pkgs:
      - gcc
      - pcre-devel
      - openssl-devel
  file.managed:
    - name: /mnt/nginx-1.20.1.tar.gz
    - source: salt://nginx/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

需要提前将nginx压缩包放入到base下nginx目录中

salt server3 state.sls nginx在master端运行这条命令,即可为server3远程安装nginx服务

安装并配置

拷贝一个nginx.conf配置文件模板到base下nginx目录中,并进行修改

vim nginx.conf

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第12张图片

拷贝一个nginx.service配置文件模板到base下nginx目录中,保证在安装nginx的主机可以通过systemctl来控制
文件内容大致跟上面httpd内容一致,唯一的不同就是这个嵌套了nginx的安装,第一二行表示调用nginx,也就是上面写的远程执行安装nginx服务,剩下的行则是远程配置nginx

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

curl server3 可以查看nginx是否开启成功

grains

grains简介
Grains是SaltStack的一个组件,存放在SaltStack的minion端。
当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
由于grains是静态数据,因此不推荐经常去修改它。

salt server* grains.item ipv4  获取server2的ipv4

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第13张图片

自定义grains项

两种设置minion端roles的方式

第一种:server2中设置roles

vim /etc/salt/minion
grains:
    roles: apache
systemctl restart salt-minion.service 重启salt-minion,否则数据不会更新

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第14张图片

第二种:server3中设置roles

vim grains
	roles: nginx
salt server3 saltutil.sync_grains 同步数据,否则数据不会更新

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第15张图片

server1(master):
在server1下查询

salt server? grains.item roles

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第16张图片

编写grains模块

在salt-master端创建_grains目录
mkdir /srv/salt/_grains
vim /srv/salt/_grains/grains.py

#!/usr/bin/env python
def grains():
     # initialize a grains dictionary
     grains = {}
     # Some code for logic that sets grains like
     grains['hello'] = 'world'
     grains['salt'] = 'stack'
     return grains

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第17张图片

salt '*' saltutil.sync_grains 同步grains到minion端
查看hello和salt的信息

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第18张图片

grains匹配运用

在target中匹配minion
salt -G ‘roles:apache’ cmd.run hostname
-G 'roles:apache’可以匹配为server2 (由于在上面的设置)

命令显示结果为 在远程执行获取server2的hostname名
企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第19张图片

在top文件中匹配
vim /srv/salt/top.sls

base:
  'roles:apache':
    - match: grain
    - apache
  'roles:nginx':
    - match: grain
    - nginx.service

在这里插入图片描述

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第20张图片
上图文件内容大致为 roles匹配到apache时,执行apache 匹配到nginx时,执行nginx.service

salt '*' state.highstate    ###state.highstate 这个是全局的所有的环境的所有的状态生效

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第21张图片

pillar

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

定义pillar基础目录
编辑master配置文件(默认base是/srv/pillar)
如果你不想修改 可以忽略下面这步操作

vim /etc/salt/master

在这里插入图片描述

mkdir /srv/pillar
systemctl restart salt-master.service

在这里插入图片描述

自定义pillar项

vim /srv/pillar/pkgs.sls
{% if grains['fqdn'] == 'server2' %}
package: httpd
{% elif grains['fqdn'] == 'server3' %}
package: nginx
{% endif %}

vim top.sls
base:
  '*':
    - pkgs

如果grains的fqdn信息为server2 则pillar下package的信息为httpd
如果grains的fqdn信息为server3 则pillar下package的信息为nginx
企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第22张图片
调用pkgs.sls
在这里插入图片描述

salt '*' saltutil.refresh_pillar #刷新pillar数据
salt '*' pillar.items  #查询pillar数据

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第23张图片

远程执行pillar下package信息为httpd的主机运行hostname
salt -I ‘package:httpd’ cmd.run hostname

在这里插入图片描述

jinja模板配合同时为两台主机安装

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

修改之前的 /srv/pillar/pkgs.sls
如果grains的fqdn信息为server2 则pillar下package的信息为httpd port的信息为80
如果grains的fqdn信息为server3 则pillar下package的信息为httpd port的信息为8080

vim /srv/pillar/pkgs.sls
{% if grains['fqdn'] == 'server2' %}
package: httpd
port: 80
{% elif grains['fqdn'] == 'server3' %}
package: httpd
port: 8080
{% endif %}

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第24张图片

修改之前apache目录下的init.sls文件
vim /srv/salt/apache/init.sls

在这里插入图片描述
- {{ pillar['package'] }} 填入pillar的package信息
http_port: {{ pillar['port'] }}填入pillar的port信息
http_host: {{ grains['ipv4'][-1] }} 填入grains的ipv4的最后一条信息
apache:
pkg.installed:
- pkgs:
- {{ pillar[‘package’] }}
service.running:
- name: httpd
- enable: true
- reload: true
- watch:
- file: /etc/httpd/conf/httpd.conf

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://apache/httpd.conf
    - template: jinja
    - context:
      http_port: {{ pillar['port'] }}
      http_host: {{ grains['ipv4'][-1] }}

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第25张图片

下载httpd后的同步的httpd.conf模板格式

vim /srv/salt/apache/httpd.conf
Listen {{ http_host }}:{{ http_port }}

在这里插入图片描述

运行命令 salt '*' state.sls apache
如下图,运行成功
企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第26张图片
企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第27张图片

企业运维实战(Saltstack的安装、远程执行、YAMY语法、grains、pillar、Jinja模板)图文解析,包看包会,卧龙出品,必是精品_第28张图片

查看效果:
server2的http.conf
在这里插入图片描述
server3的http.conf
在这里插入图片描述

你可能感兴趣的:(笔记,企业运维实战,运维,python)