SaltStack进阶

Posted 码出未来_远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SaltStack进阶相关的知识,希望对你有一定的参考价值。

文章目录

条件判断语句

[root@master salt]# cd /srv/salt/base/
[root@master base]# vim test.sls
[root@master base]# cat test.sls 
% for user in ['test1','test2'] %
 user :
  user.present
% endfor %
[root@master base]# salt minion state.sls test
minion:
----------
          ID: test1
    Function: user.present
      Result: True
     Comment: New user test1 created
     Started: 21:44:54.051295
    Duration: 1728.451 ms
     Changes:   
              ----------
              fullname:
              gid:
                  1000
              groups:
                  - test1
              home:
                  /home/test1
              homephone:
              name:
                  test1
              other:
              passwd:
                  x
              roomnumber:
              shell:
                  /bin/bash
              uid:
                  1000
              workphone:
----------
          ID: test2
    Function: user.present
      Result: True
     Comment: New user test2 created
     Started: 21:44:55.779994
    Duration: 333.946 ms
     Changes:   
              ----------
              fullname:
              gid:
                  1001
              groups:
                  - test2
              home:
                  /home/test2
              homephone:
              name:
                  test2
              other:
              passwd:
                  x
              roomnumber:
              shell:
                  /bin/bash
              uid:
                  1001
              workphone:

Summary for minion
------------
Succeeded: 2 (changed=2)
Failed:    0
------------
Total states run:     2
Total run time:   2.062 s
[root@minion ~]# id test1
uid=1000(test1) gid=1000(test1) groups=1000(test1)
[root@minion ~]# id test2
uid=1001(test2) gid=1001(test2) groups=1001(test2)

判断语句

[root@master base]# vim test.sls
[root@master base]# cat test.sls 
test_nginx_install:
  pkg.installed:
    % if grains['os'] == 'CentOS Stream' %
    - name: httpd
    % elif grains['os'] == 'Ubuntu' %
    - name: apache2
    % endif %
[root@master base]# salt minion state.sls test
minion:
----------
          ID: test_nginx_install
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: All specified packages are already installed
     Started: 21:47:36.506405
    Duration: 2058.35 ms
     Changes:   

Summary for minion
------------
Succeeded: 1
Failed:    0
------------
Total states run:     1
Total run time:   2.058 s

masterless

应用场景
master 与 minion 网络不通或通信有延迟,即网络不稳定
想在 minion 端直接执行状态
传统的 SaltStack 是需要通过 master 来执行状态控制 minion 从而实现状态的管理,但是当网络不稳定的时候,当想在minion本地执行状态的时候,当在只有一台主机的时候,想执行状态该怎么办呢?这就需要用到 masterless 了。

有了masterless,即使你只有一台主机,也能玩saltstack,而不需要你有N台主机架构。

masterless配置
修改配置文件minion
注释master行
取消注释file_client并设其值为local
设置file_roots
设置pillar_roots

# Set the location of the salt master server. If the master server cannot be
# resolved, then the minion will fail to start.
#master: salt
#master: 192.168.207.131   #注释这一行和上面一行
# defined below by setting it to "local". Setting a local file_client runs the
# minion in masterless mode.
#file_client: remote
file_client: local   #取消注释,并且改为local,我这里是在下面加了一行

file_roots:   #设置file_roots的路径和环境,可有多套环境
  base:
    - /srv/salt/base

关闭salt-minion服务
使用 masterless 模式时是不需要启动任何服务的,包括salt-master和salt-minion。

[root@minion ~]# systemctl stop salt-minion
[root@minion ~]# systemctl disable salt-minion
Removed /etc/systemd/system/multi-user.target.wants/salt-minion.service.

salt-call
masterless模式执行模块或状态时需要使用salt-call命令,而不再是salt或者salt-ssh。需要注意的是要使用salt-call的–local选项。

[root@minion ~]# salt-call --local cmd.run 'uptime'
local:
     21:50:36 up 2 days, 17:37,  1 user,  load average: 0.09, 0.03, 0.01
[root@minion base]# vim wget.sls
[root@minion base]# cat wget.sls 
test_wget:
  pkg.installed:
    - name: wget
[root@minion1 base]# salt-call --local state.sls wget
local:
----------
          ID: test_wget
    Function: pkg.installed
        Name: wget
      Result: True
     Comment: All specified packages are already installed
     Started: 09:53:57.723269
    Duration: 1264.517 ms
     Changes:   

Summary for local
------------
Succeeded: 1
Failed:    0
------------
Total states run:     1
Total run time:   1.263 s

salt-master高可用

salt-master高可用配置
官方文档—salt的高可用

我们需要用salt来管理公司的所有机器,那么salt的master就不能宕机,否则就会整个瘫痪,所以必须要对salt进行高可用。

通过在 minion 端的配置文件 minion 中将 master 参数配置为所有可用主服务器的YAML列表,Salt minions可以同时连接多个主服务器。默认情况下,所有master都是启动的,这意味着任何主服务器都可以将命令指向Salt基础设施

在多主机配置中,每个 master 主机必须具有相同的加密密钥,并且必须分别接受所有 master 主机上的小密钥。file_root 和 pillar_root 的内容也需要与Salt之外的进程保持同步

多master故障转移:

将master_type参数从str更改为failover将导致 minion 连接到 master 列表中第一个响应的 master 服务器。

每隔master_alive_interval参数指定的秒数 minion 将检查,以确保当前的 master 仍在响应。如果 master 服务器没有响应,minion 将尝试连接到列表中的下一个 master 服务器。如果 minion 的 master 用完了,当挂掉的 master 被恢复时,列表将被回收。注意,master_alive_interval参数必须出现在 minion 配置中,否则检查主从状态的循环作业将不会被调度。

salt-master高可用之数据同步
涉及到高可用时,数据的同步是个永恒的话题,我们必须保证高可用的2个master间使用的数据是一致的,包括:

/etc/salt/master配置文件
/etc/salt/pki目录下的所有key
/srv/下的salt和pillar目录下的所有文件
保障这些数据同步的方案有:

nfs挂载
rsync同步
使用gitlab进行版本控制
安全相关:
为保证数据的同步与防止丢失,可将状态文件通过gitlab进行版本控制管理。

配置salt-master高可用

主机名称ip
master1192.168.207.131
master2192.168.207.136
minion1192.168.207.137

修改minion端的minion配置文件

node01和node02上必须都安装了salt-master且保证服务都是正常状态

[root@minion1 ~]# vim /etc/salt/minion
....
master: 
  - 192.168.207.131
  - 192.168.207.136

同步配置和数据

[root@master1 ~]# scp /etc/salt/master 192.168.207.136:/etc/salt/master
[root@master1 ~]# scp -r /etc/salt/pki 192.168.207.136:/etc/salt/
[root@master1 ~]# scp -r /srv/salt 192.168.207.136:/srv/
[root@master1 ~]# salt-key -ya minion1
[root@master2 ~]# salt-key -ya minion1

配置故障转移

[root@minion1 ~]# vim /etc/salt/minion
....
# beacons) without a master connection
# master_type: str
master_type: failover
....
# of TCP connections, such as load balancers.)
# master_alive_interval: 30
master_alive_interval: 3   #当master1挂掉后,minion在3秒后自动切换master为master2
[root@minion1 ~]# systemctl restart salt-minion

测试

[root@master1 ~]# salt '*' test.ping
minion1:
    True
[root@master2 ~]# salt '*' test.ping
minion1:
    Minion did not return. [No response]
[root@master1 ~]# systemctl stop salt-master
[root@master2 ~]# salt '*' test.ping
minion1:
    True

以上是关于SaltStack进阶的主要内容,如果未能解决你的问题,请参考以下文章

SaltStack进阶

SaltStack进阶

Linux学习总结(七十三)自动化运维之saltstack

自动化运维工具saltstack

SaltStack与Python配合实现系统用户自动化管理

用开源自动化运维工具 SaltStack 在云平台中实现各主机统一配置管理