saltstack进阶

1. masterless

1.1 应用场景

  • master 与 minion 网络不通或通信有延迟,即网络不稳定
  • 想在 minion 端直接执行状态

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

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

1.2 masterless配置

1.2.1 修改配置文件minion

  • 注释master行
  • 取消注释file_client并设其值为local
  • 设置file_roots
  • 设置pillar_roots
[root@node2 ~]# vim /etc/salt/minion

# resolved, then the minion will fail to start.
# master: salt      //注释此行

file_client: local  //取消此行注释并将值设为local

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

1.2.2 关闭salt-minion服务

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

[root@node2 ~]# systemctl stop salt-minion
[root@node2 ~]# systemctl disable salt-minion
Removed symlink /etc/systemd/system/multi-user.target.wants/salt-minion.service.
[root@node2 ~]# systemctl status salt-minion
● salt-minion.service - The Salt Minion
   Loaded: loaded (/usr/lib/systemd/system/salt-minion.service>
   Active: inactive (dead)
     Docs: man:salt-minion(1)
           file:///usr/share/doc/salt/html/contents.html
           https://docs.saltproject.io/en/latest/contents.html

11月 02 15:09:47 node2 salt-minion[443952]: To repair this iss>
11月 02 15:09:47 node2 salt-minion[443952]: Or restart the Sal>
11月 02 15:10:06 node2 systemd[1]: salt-minion.service: Main p>
11月 02 15:10:06 node2 systemd[1]: salt-minion.service: Failed>
11月 02 15:13:24 node2 systemd[1]: Starting The Salt Minion...
11月 02 15:13:24 node2 systemd[1]: Started The Salt Minion.
11月 29 22:35:49 node2 systemd[1]: Stopping The Salt Minion...
11月 29 22:35:49 node2 salt-minion[451713]: [WARNING ] Minion >
11月 29 22:35:50 node2 salt-minion[451713]: The Salt Minion is>
11月 29 22:35:50 node2 systemd[1]: Stopped The Salt Minion.

1.2.3 salt-call

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

[root@node2 ~]# salt-call --local cmd.run 'df -h'
local:
    Filesystem             Size  Used Avail Use% Mounted on
    devtmpfs               1.9G     0  1.9G   0% /dev
    tmpfs                  1.9G  600K  1.9G   1% /dev/shm
    tmpfs                  1.9G  9.0M  1.9G   1% /run
    tmpfs                  1.9G     0  1.9G   0% /sys/fs/cgroup
    /dev/mapper/rhel-root   17G  2.7G   15G  16% /
    /dev/sda1             1014M  179M  836M  18% /boot
    tmpfs                  376M     0  376M   0% /run/user/0

1.2.3 salt-call

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

[root@node2 base]# salt-call --local state.sls test
local:
----------
          ID: yang_useradd
    Function: user.present
        Name: yang
      Result: True
     Comment: New user yang created
     Started: 23:14:36.388461
    Duration: 259.236 ms
     Changes:   
              ----------
              fullname:
              gid:
                  1001
              groups:
                  - yang
              home:
                  /home/yang
              homephone:
              name:
                  yang
              other:
              passwd:
                  x
              roomnumber:
              shell:
                  /bin/bash
              uid:
                  1001
              workphone:

Summary for local
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time: 259.236 ms
[root@node2 base]# 

salt-master高可用


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

/etc/salt/master配置文件

/etc/salt/pki目录下的所有key

/srv/下的salt和pillar目录下的所有文件

保障这些数据同步的方案有:


nfs挂载

rsync同步

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

环境说明:

主机名 ip 职责
master 192.168.75.128 主master
node2 192.168.75.142 备master
node1 192.168.75.150 minion

salt-master高可用配置

我们需要用salt来管理公司的所有机器,那么salt的master就不能宕机,否则就会整个瘫痪,所以我们必须要对salt进行高可用。salt的高可用配置非常简单,只需要改一下minion配置文件,将master用列表的形式列出即可。

在node2上安装salt-master(matser上已安装salt-master,node1上已安装salt-minion)

[root@masters ~]# rpm --import https://repo.saltproject.io/py3/redhat/8/x86_64/latest/SALTSTACK-GPG-KEY.pub
[root@masters ~]# curl -fsSL https://repo.saltproject.io/py3/redhat/8/x86_64/latest.repo | tee /etc/yum.repos.d/salt.repo


[root@masters ~]# yum -y install  salt-master

修改node1的minion配置文件

[root@node1 ~]# vim /etc/salt/minion
#master: salt
master: 192.168.75.128  //指定主master

[root@node1 ~]# systemctl restart salt-minion

minion生成证书并授权给master

[root@master ]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
node1
Rejected Keys:

[root@master ]# salt-key -ya
The following keys are going to be accepted:
Unaccepted Keys:
node1
Key for minion node1 accepted.

[root@master ]# salt-key -L
Accepted Keys:
node1
Denied Keys:
Unaccepted Keys:
Rejected Keys:

[root@master ]# salt 'node1' test.ping
node1:
    True

传输证书给node2

[root@master ~]# scp /etc/salt/master 192.168.75.142:/etc/salt/master

[root@master ~]# scp /etc/salt/master 192.168.75.142:/etc/salt/master

[root@master ~]# scp -r /srv/salt 192.168.75.142:/srv/

修改minion的配置文件,使其与node2建立连接

[root@node1 ~]# vim /etc/salt/minion
#master: salt
master: 192.168.75.142  //指定主master

[root@node1 ~]# systemctl restart salt-minion


[root@node2 ]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
node1
Rejected Keys:

[root@node2 ]# salt-key -ya
The following keys are going to be accepted:
Unaccepted Keys:
node1
Key for minion node1 accepted.

[root@node2 ]# salt-key -L
Accepted Keys:
node1
Denied Keys:
Unaccepted Keys:
Rejected Keys:

[root@node2 ]# salt 'node1' test.ping
node1:
    True

进行高可用设置,修改minion配置文件

[root@node1 ~]# vim /etc/salt/minion
#master: salt
master: 
  - 192.168.75.128
  - 192.168.75.142

人为设置故障测试

[root@node1 ~]# vim /etc/salt/minion

# beacons) without a master connection
master_type: failover
----------
# connection events.
#
master_alive_interval: 3

[root@node1 ~]# systemctl restart salt-minion

在两台master上测试

[root@master ~]# salt 'node1' test.ping
node1:
    True


[root@node2 ~]# salt 'node1' test.ping
web:
    Minion did not return. [No response]
    The minions may not have all finished running and any remaining minions will return upon completion. To look up the return data for this job later, run the following command:
    
    salt-run jobs.lookup_jid 20211129114455692315
ERROR: Minions returned with non-zero exit code

停止主master服务,在node2上ping

[root@master ~]# systemctl status salt-master
● salt-master.service - The Salt Master Server
   Loaded: loaded (/usr/lib/systemd/system/salt-master.service>
   Active: inactive (dead) since Mon 2021-11-29 23:55:12 CST; >
     Docs: man:salt-master(1)
           file:///usr/share/doc/salt/html/contents.html
           https://docs.saltproject.io/en/latest/contents.html
  Process: 1035 ExecStart=/usr/bin/salt-master (code=exited, s>
 Main PID: 1035 (code=exited, status=0/SUCCESS)

11月 29 23:17:54 master systemd[1]: Starting The Salt Master S>
11月 29 23:18:07 master systemd[1]: Started The Salt Master Se>
11月 29 23:55:12 master systemd[1]: Stopping The Salt Master S>
11月 29 23:55:12 master salt-master[1035]: [WARNING ] Master r>
11月 29 23:55:12 master salt-master[1035]: The salt master is >
11月 29 23:55:12 master systemd[1]: Stopped The Salt Master Se>

[root@noded2 ~]# salt 'node1' test.ping
node1:
    True

上一篇:.net core 和 WPF 开发升讯威在线客服系统:调用百度翻译接口实现实时自动翻译


下一篇:re模块