Linux(企业级)——SaltStack自动化运维

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.slsapache/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

测试:在这里插入图片描述

7. ==

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值