Linux(企业级)——SaltStack自动化运维
saltstack是一个配置管理系统,能够维护预定义状态的远程节点,也是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据等。
1. SaltStack安装与启用
- master 端
yum install -y salt-master #安装master端
systemctl enable --now salt-master #设置master自启动并开启
- mionin端
yum install -y salt-minion
vim /etc/salt/minion
systemctl enable --now salt-minion
master: 172.25.52.1 #设定master端IP
#冒号后有空格
- 在master端操作连接minion端:
查看可连接主机列表;添加所有列表中的主机;
salt-key -L #查看主机列表
salt-key -A #接入所有主机
添加完成后,再次查看主机列表:
2. 远程执行命令与远程执行模块
- 远程执行命令
salt 'service2' sys.doc pkg #查看模块文档
salt 'service2' cmd.run 'hostname' #运行hostname
-
远程执行模块(Python)
支持自定义python编程模块;
master端存放目录在配置文件/etc/salt/master中,注意缩进两个空格,默认存在目录为:file_roots: base: - /srv/salt
创建模块目录并添加自定义py文件:
mkdir /srv/salt/_modules
vim /srv/salt/_modules/mydisk.py
部署更新至minon端并运行:
salt service2 saltutil.sync_modules
salt service2 mydisk.df
- 远程执行模块(State)
以”.sls”后缀结尾,但在调用是不用写后缀,init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以apache/init.sls
表示apache
.如果同时存在apache.sls
和apache/init.sls
,则apache/init.sls
被忽略,pache.sls
将被用来表示apache
.
在master端创建sls文件:
vim /srv/salt/apache/init.sls
apache:
pkg.installed: #安装httpd与php
- pkgs:
-httpd
-php
file.managed: #更新文件 salt表示master:/srv/salt
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/httpd.conf
service.running:
- name: httpd
- enable: true
- reload: true
- watch:
- file: apache #检测文件改动,改动后reload
master文件结构:
运行命令推送:
salt service2 state.sls apache
nginx master端:
vim /srv/salt/nginx/init.sls #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
vim /srv/salt/nginx/service.sls #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
部署nginx:
所需要发布nginx.conf的配置内容修改:
启动运行:
测试nginx:
3. grains与pillar
-
grains
Grains是SaltStack的一个组件,存放在SaltStack的minion端。当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
查看默认可用的grains:
查看单项值:
修改grains值:
– 在minon端minon文件中直接声明,注意缩进grains: roles: - apache - httpd
– 在master端在/etc/salt/grains中定义,并进行同步
vim /etc/salt/grains: deployment: datacenter1 salt service2 saltutil.sync_grains
– 编写grains模块,在salt-master端创建_grains目录:
–在top文件中匹配改动:vim /srv/salt/top.sls base: 'roles:apache': - match: grain - apache.install
– grains匹配:
salt -G roles:apache cmd.run hostname
- pillar
pillar将信息动态的存放在master端,可以指定某一个minion才可以看到对应的信息。
–自定义pillar项:
创建pillar文件夹以及top文件:
mkdir /srv/pillar
vim /srv/pillar/top.sls
###############################
base:
'*':
- packages
vim /srv/pillar/packages.sls
###########################
{% if grains['fqdn'] == 'server3' %}
package: httpd
port: 8080
{% elif grains['fqdn'] == 'server2' %}
package: httpd
port: 80
{% endif %}
刷新pillar数据,验证查询所设定的pillar值:
salt '*' saltutil.refresh_pillar
– pillar 匹配:
salt -I 'port:80' test.ping
4. Jinja
通过jinja模板可以为不同主机定义各自的变量。{% … %}用于 循环 或赋值的语句;{{ … }}用于表达式的结果显示出来。
-
变量引用
直接引用grains变量: Listen {{ grains['ipv4'][1] }} 直接引用pillar变量: Listen {{ pillar['ip'] }} 在state文件中引用: - template: jinja - context: bind: {{ pillar['ip'] }}
-
控制结构包装条件:
vim /srv/salt/test.sls
/mnt/testfile:
file.append:
{% if grains['fqdn'] == 'server2' %}
- text: server2
{% elif grains['fqdn'] == 'server3' %}
- text: server3
{% endif %}
推送sls至minon端:
测试:
案例:控制apache根据主机名切换监听端口:
在配置好pillar的基础上,修改之前的apache.sls
:
apache:
pkg.installed:
- pkgs:
- {{ pillar['package']}}
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/httpd.conf
- template: jinja
- context:
http_port: {{ pillar['port'] }}
http_host: {{ grains['ipv4'][-1] }}
service.running:
- name: httpd
- enable: true
- reload: true
- watch:
- file: apache
修改前文中的httpd.conf
,监听端口处设置引用变量:
Listen {{ http_host }}:{{ http_port }}
将修改后的apache.sls
推送给minon;
两个minon的 httpd切换端口并成功重启;
案例:远程配置keepalived
模块
在做完appache端口切换的基础上,建立keepalived
模块目录,并添加init.sls
kp-install:
pkg.installed:
- name: keepalived
file.managed:
- name: /etc/keepalived/keepalived.conf
- source: salt://keepalived/keepalived.conf
- template: jinja
- context:
STATE: {{ pillar['state'] }}
VID: {{ pillar['vid'] }}
PRI: {{ pillar['pri'] }}
service.running:
- name: keepalived
- reload: true
- watch:
- file: kp-install
在pillar中新建kp.sls模块,设定变量值:
复制keepalived的配置文件至模块目录下,修改指定变量为pillar中引用变量,以实现不同主机的keepalived配置。
! 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 {{ VID }} #VRID 设置为变量
priority {{ PRI }} # 优先级设置为变量
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.52.100 #指定VIP
}
}
推送至minon端:
测试:访问VIP,得到appache默认发布内容。
5. job 缓存
saltstcak提供两种常用的job返回数据存入mysql的方式。
1. mysql安装在master端,在minon端部署使job的运行结果直接远程存入master端的mysql
2. mysql安装在master端,在master端部署接受返回值后存入本机的mysql
- 方式1:
在master端安装mariadb-server,并初始化,创建salt所需数据库。
yum install mariadb-server -y
systemctl start mariadb.service
mysql_secure_installation
vim test.sql # 内容在下方
mysql -pwestos < test.sql
CREATE DATABASE `salt`
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
USE `salt`;
--
-- Table structure for table `jids`
--
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;
#CREATE INDEX jid ON jids(jid) USING BTREE;
--
-- Table structure for table `salt_returns`
--
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;
--
-- Table structure for table `salt_events`
--
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;
在数据库中允许salt用户远程访问salt数据库:
grant all on salt.* to salt@'%' identified by 'salt';
在minon端安装python支持,并saltstack配置文件中修改指定返回值存储有关数据,并重启:
yum install MySQL-python
vim /etc/salt/minion
systemctl restart salt-minion.service
return: mysql
mysql.host: '172.25.52.1'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
mysql.port: '3306'
测试,带返回参数运行测试命令:
查询mysql中job_return表内容:
- 方式2:
与方式1相同,在master端配置数据库,由于是master端自行存储到本机的mysql,所以需要在数据库增加salt用户的本地授权以及安装python支持。
yum install MySQL-python
grant all on salt.* to salt@'localhost' identified by 'salt';
在master端开启sql缓存设置:
vim /etc/salt/master
master_job_cache: mysql
mysql.host: 'localhost'
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
mysql.port: '3306'
重启master端:
systemctl restart salt-master.service
在minon端无需修改默认部署,无需改动;测试:
查看所有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>
6. salt-ssh与salt-syndic
- ssh
salt-ssh可以独立运行的,不需要minion端。salt-ssh 用的是sshpass进行密码交互的。以串行模式工作,性能下降。安装ssh插件
yum install -y salt-ssh
配置roster文件,默认的本地路径/etc/salt/roster
server2:
host: 172.25.52.2
user: root
password: westos
- syndic
#在下级master端:
yum install -y salt-syndic
vim /etc/salt/master
systemctl restart salt-master
systemctl start salt-syndic
#指向topmaster
syndic_master: 172.25.52.4
在topmaster端:
vim /etc/salt/master
systemctl start salt-master
#设定为顶级master
order_masters: True
测试: