Linux系统运维之saltstack 自动化运维管理

saltstack简介

saltstack是一个配置管理系统,能够维护预定义状态的远程节点。
saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。
saltstack是运维人员提高工作效率、规范业务配置与操作的利器。
Salt的核心功能
使命令发送到远程系统是并行的而不是串行的
使用安全加密的协议
使用最小最快的网络载荷
提供简单的编程接口
Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。

saltstack通信机制

SaltStack 采用 C/S模式,minion与master之间通过ZeroMQ消息队列通信,默认监听4505端口。
在这里插入图片描述

Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口。
在这里插入图片描述

saltstack安装与配置

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

master端设置:

#yum install -y salt-master #安装master端
#systemctl enable salt-master #设置master自启动
#systemctl start salt-master #启动master服务

minion端配置:

#yum install -y salt-minion #安装minion端
#vim /etc/salt/minion
master: 172.25.0.1 #设置master主机的ip
#systemctl enable salt-minion
#systemctl start salt-minion

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

插图:

master端测试与minion端的连接

插图:

saltstack远程执行

远程执行shell命令

Salt命令由三个主要部分构成:
salt ‘’ [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			#查看模块文档
#salt 'server2' pkg.install httpd
#salt 'server2' pkg.remove httpd

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

编写远程执行模块

编辑master配置文件:

vim /etc/salt/master

file_roots:
  base:
    - /srv/salt

重启master服务:
systemctl restart salt-master

创建模块目录:

#mkdir /srv/salt/_modules
编写模块文件:
vim /srv/salt/_modules/mydisk.py

def df():
    return __salt__['cmd.run']('df -h')

同步模块:
salt server2 saltutil.sync_modules

运行模块:
#salt server2 mydisk.df

插图:

了解YAML语法

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

  • list_value_one
  • list_value_two

配置管理

创建一个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

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.

grains与pillar详解

grains简介

Grains是SaltStack的一个组件,存放在SaltStack的minion端。

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

信息查询

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

#salt ‘*’ grains.ls

插图:

查看每一项的值:

salt ‘*’ grains.items

插图:

取单项的值:

#salt server3 grains.item ipv4
#salt server3 grains.item fqdn

自定义grains项

在/etc/salt/minion中定义:
#vim /etc/salt/minion
grains:
roles:
- apache
- httpd
重启salt-minion,否则数据不会更新:
#systemctl restart salt-minion

在/etc/salt/grains中定义:
#vim /etc/salt/grains:
deployment: datacenter1
同步数据:
#salt server3 saltutil.sync_grains
查询自定义项:
#salt server3 grains.item deployment

编写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 ‘*’ saltutil.sync_grains #同步grains到minion端

grains匹配运用

在target中匹配minion:
#salt -G roles:apache cmd.run hostname
在top文件中匹配:
#vim /srv/salt/top.sls

base:
  'roles:apache':
    - match: grain
    - apache.install


pillar简介

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

声明pillar

定义pillar基础目录:
#vim /etc/salt/master
pillar_roots:
base:
- /srv/pillar
#mkdir /srv/pillar
重启salt-master服务:
#/etc/init.d/salt-master restart

#vim /srv/pillar/top.sls

base:
  '*':
    - packages

#vim /srv/pillar/apache.sls

{% if grains['fqdn'] == 'server3' %}
package: httpd
{% elif grains['fqdn'] == 'server2' %}
package: mairadb
{% endif %}

刷新pillar数据:
#salt ‘’ saltutil.refresh_pillar
查询pillar数据:
#salt '
’ pillar.items
#salt ‘*’ grains.item roles

命令行中匹配:
#salt -I ‘roles:apache’ test.ping
state系统中使用:
#vim /srv/salt/apache.sls

apache:
  pkg.installed:
    - name: {{ pillar['package'] }}
    - 

Jinja模板

Jinja模板简介

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

Jinja模板使用方式

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

#vim /srv/salt/test.sls
/mnt/testfile:
file.append:

   {% if grains['fqdn'] == 'server2' %}
    - text: server2
    {% elif grains['fqdn'] == 'server3' %}
    - text: server3
    {% endif %}

Jinja在普通文件的使用:

#vim /srv/salt/apache.sls

/etc/httpd/conf/httpd.conf:
  file.managed:
  - source: salt://httpd.conf
  - template: jinja
  - context:
    bind: 172.25.2.2

import方式,可在state文件之间共享:

定义变量文件:

#vim lib.sls
{% set port = 80 %}

导入模板文件:

#vim httpd.conf
{% from ‘lib.sls’ import port %}

Listen {{ prot }}

引用变量

直接引用grains变量:

Listen {{ grains['ipv4'][1] }}

直接引用pillar变量:

Listen {{ pillar['ip'] }}

在state文件中引用:

- template: jinja
    - context:
      bind: {{ pillar['ip'] }}

Job管理

Job简介

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

把Job存储到数据库

在这里插入图片描述

修改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

安装mysql数据库:

#yum install -y mariadb-server MySQL-python

执行数据库初始化脚本:

#mysql_secure_installation

导入数据模板:

在这里插入代码片

#mysql -p < salt.sql
创建数据库授权:

> grant all on salt.* to salt@localhost identified by 'salt';
salt.sql模板内容:
CREATE DATABASE  `salt`
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;
USE `salt`;
DROP TABLE IF EXISTS `jids`;
CREATE TABLE `jids` (
  `jid` varchar(255) NOT NULL,
  `load` mediumtext NOT NULL,
  UNIQUE KEY `jid` (`jid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `salt_returns`;
CREATE TABLE `salt_returns` (
  `fun` varchar(50) NOT NULL,
  `jid` varchar(255) NOT NULL,
  `return` mediumtext NOT NULL,
  `id` varchar(255) NOT NULL,
  `success` varchar(10) NOT NULL,
  `full_ret` mediumtext NOT NULL,
  `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  KEY `id` (`id`),
  KEY `jid` (`jid`),
  KEY `fun` (`fun`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `salt_events`;
CREATE TABLE `salt_events` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`tag` varchar(255) NOT NULL,
`data` mediumtext NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`master_id` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `tag` (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Job管理

查看所有minion当前正在运行的jobs(在所有minions上运行saltutil.running)

salt-run jobs.active

列出当前master jobs cache中所有job

salt-run jobs.list_jobs

从master jobs cache中查询指定jid的运行结果

salt-run jobs.lookup_jid <jid>

salt-ssh与salt-syndic

salt-ssh简介

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

#yum install -y salt-ssh

salt-ssh配置

配置roster文件,默认的本地路径是 /etc/salt/roster:
server2:

host: 172.25.2.2
user: root

测试:
#salt-ssh ‘*’ test.ping -i //询问密码加 -i
#vim ~/.ssh/config

StrictHostKeyChecking no

salt-syndic简介

如果大家知道zabbix proxy的话那就很容易理解了,syndic其实就是个代理,隔离master与minion。
Syndic必须要运行在master上,再连接到另一个topmaster上。
Topmaster 下发的状态需要通过syndic来传递给下级master,minion传递给master的数据也是由syndic传递给topmaster。
topmaster并不知道有多少个minion。
syndic与topmaster的file_roots和pillar_roots的目录要保持一致。

salt-syndic配置

在这里插入图片描述

topmaster端:
#vim /etc/salt/master

order_masters: True	
	#作为顶级master

#systemctl start salt-master

#salt-key -L #查看下级master的连接授权
#salt-key -A

下级master端:
#yum install -y salt-syndic
#vim /etc/salt/master

syndic_master: 172.25.2.4		#指向topmaster

#systemctl restart salt-master
#systemctl start salt-syndic

salt-api配置

salt-ssh可以独立运行的,不需要minion端。
salt-ssh 用的是sshpass进行密码交互的。
以串行模式工作,性能下降。
安装salt-ssh:
#yum install -y salt-ssh

salt-api简介

SaltStack 官方提供有REST API格式的 salt-api 项目,将使Salt与第三方系统集成变得尤为简单。
官方提供了三种api模块:

rest_cherrypy
rest_tornado
rest_wsgi

官方链接:https://docs.saltstack.com/en/latest/ref/netapi/all/index.html#all-netapi-modules

salt-api配置

安装salt-api:

#yum install -y salt-api python-cherrypy
生成证书:
#cd /etc/pki/tls/private
#openssl genrsa 2048 > localhost.key
#cd /etc/pki/tls/certs
#make testcert //根据提示填写相关信息即可

创建用户认证文件:

#useradd -s /sbin/nologin saltapi
#echo westos | passwd --stdin saltapi
#vim /etc/salt/master.d/eauth.conf

external_auth:
  pam:
    saltapi:
      - .*
      - '@wheel'
      - '@runner'

激活rest_cherrypy模块:

#vim /etc/salt/master.d/api.conf
rest_cherrypy:

  host: 172.25.2.1
  port: 8000
  ssl_crt: /etc/pki/tls/certs/localhost.crt
  ssl_key: /etc/pki/tls/private/localhost.key

重启服务:

#systemctl restart salt-master
#systemctl start salt-api

获取认证token:

#curl -sSk https://172.25.2.1:8000/login \

 -H 'Accept: application/x-yaml' \
    -d username=saltapi \
    -d password=westos \
    -d eauth=pam

推送任务:

#curl -sSk https://172.25.0.1:8000 \

 -H 'Accept: application/x-yaml' \
    -H 'X-Auth-Token: 77e2b1de04b0dbc0a4bf11900712b83e4fa2c241'\
    -d client=local \
    -d tgt='*' \
    -d fun=test.ping

token值是上面命令获取的toekn值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值