saltstack
- 实验素材
- 1.saltstack的简单介绍
- 来源于百度百科
- 工作原理
- 2.saltstack的安装与配置
- 测试:master端执行命令允许minion连接:
- 3.saltstack的远程运行
- 3.1 远程执行shell命令
- 3.2编写远程执行模块
- sls文件编写规则
- 远程执行模块
- 4. grains
- 4.1信息查询
- 4.2自定义grains项
- 第一种
- 第二种方式
- 第三种
- 4.3grains匹配运用
- 1.在target中匹配minion
- 2.top 文件中匹配
- 5.pillar
- 5.1声明pillar
- 定义pillar基础目录
- 5.2自定义pillar项
- 5.3 pillar数据匹配
- 6.jinja模板
- 7.应用案例:
- 应用一.配置keepalived
- 应用二,配置zabbix,
- 8.job管理
- 8.1job的基本了解
- 8.2把job存储到数据库
- 第一种:在minion端操作,--->master数据库中
- 第二种
- 9.salt-ssh
- 10.salt-syndic
- 10.1salt-syndic的配置
实验素材
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.sls
和apache/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配置