假设公司有多个分支,每个分支有多台机器需要管理,这个时候最好的办法就是在每个分子创建一台proxy去管理本分支内的机器,同时在总部有一台中心master连接到每个分支的proxy进行统一管理。这种proxy在saltstack里面叫做syndic。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
原先的拓扑为minion1和minion2都连接到master,现在将minion1更改为syndic节点,minion2连接到syndic,syndic再连接到master。
root@saltmaster:/home/vagrant# salt-key -D
首先停掉salt-minion
服务
root@minion1:/etc/salt# systemctl stop salt-minion
修改id为syndic
root@minion1:/etc/salt# cat minion | grep ^id
id: syndic
需要注意的是这个在/etc/salt/minion
配置的id是syndic服务和minion服务共享的。
安装之前minion1做为一个纯粹的minion,只有salt-minion
这一个服务在跑,能配置的配置项也只有/etc/salt/minion
这一个选项。
直接一键安装salt-syndic
root@minion1:/etc/salt# apt-get install -y salt-syndic
之后多出来了salt-master
和 salt-syndic
两个服务
root@minion1:/etc/salt# systemctl list-unit-files | grep salt
salt-master.service enabled
salt-minion.service enabled
[email protected] disabled
salt-syndic.service enabled
配置项也多了/etc/salt/master
修改syndic机器上的/etc/salt/master
,配置master的地址
root@minion1:/etc/salt# cat master | grep ^syndic
syndic_master: 192.168.50.10
这个地址是原先master的地址
停掉minion2的salt-minion
服务
root@minion2:/home/vagrant# systemctl stop salt-minion
删除master在minion2上保存的key
root@minion2:/etc/salt/pki/minion# rm minion_master.pub
修改master的地址为syndic的地址
root@minion2:/etc/salt# cat minion | grep ^master
master: 192.168.50.11
原master的地址为192.168.50.10
修改/etc/salt/master
root@saltmaster:/etc/salt# cat master | grep ^order
order_masters: True
重启salt-master
服务
root@saltmaster:/etc/salt# systemctl restart salt-master
syndic机器重启salt-syndic
服务
root@minion1:/etc/salt# systemctl restart salt-syndic
minion2上启动salt-minion
服务
root@minion2:/etc/salt# systemctl start salt-minion
分别在master机器和syndic机器上接受key即可
root@saltmaster:/etc/salt# salt-key -A
root@minion1:/etc/salt/pki# salt-key -A
按照上述步骤操作以后,尝试在master上验证连通性,发现没有返回
salt '*' test.ping
在syndic上查看日志,日志的目录在/var/log/salt
root@minion1:/etc/salt/pki# tail -f /var/log/salt/syndic
2020-02-02 13:19:35,021 [salt.minion :3116][CRITICAL][18165] Unable to call _fire_master on any masters!
2020-02-02 13:19:39,255 [salt.crypt :757 ][ERROR ][18165] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before attempting to re-authenticate
2020-02-02 13:19:45,019 [salt.minion :3102][ERROR ][18165] Unable to call _fire_master on 192.168.50.10, that syndic is not connected
2020-02-02 13:19:45,022 [salt.minion :3116][CRITICAL][18165] Unable to call _fire_master on any masters!
2020-02-02 13:19:49,270 [salt.crypt :757 ][ERROR ][18165] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before attempting to re-authenticate
2020-02-02 13:19:55,018 [salt.minion :3102][ERROR ][18165] Unable to call _fire_master on 192.168.50.10, that syndic is not connected
2020-02-02 13:19:55,022 [salt.minion :3116][CRITICAL][18165] Unable to call _fire_master on any masters!
2020-02-02 13:19:59,290 [salt.crypt :757 ][ERROR ][18165] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before attempting to re-authenticate
2020-02-02 13:20:05,018 [salt.minion :3102][ERROR ][18165] Unable to call _fire_master on 192.168.50.10, that syndic is not connected
2020-02-02 13:20:05,021 [salt.minion :3116][CRITICAL][18165] Unable to call _fire_master on any masters!
显示是因为认证问题导致。等待几秒钟,然后重新在master上添加以下syndic的key解决了这个问题。
这个时候如果在master去验证连通性的话,只会发现minion2会返回,注意syndic并没有返回,下面会介绍如何让syndic也能够被管理
root@saltmaster:/etc/salt/pki/master/minions# salt '*' test.ping
minion2:
True
关于key的管理,我的另一篇博客《Saltstack入门到精通教程(九):key管理和id修改》写的比较详细,这里针对syndic的情况做一个补充。
master
会存储syndic的public key,在/etc/salt/pki/master/minions/
syndic
会存储master的public key,在/etc/salt/pki/minion/minion_master.pub
会存储底下minion的public key,在/etc/salt/pki/master/minions/
minion
会存储syndic的public key,在/etc/salt/pki/minion/minion_master.pub
如果把syndic上的salt-minion
服务也启动的话,这时候不需要再在master上接受key就可以直接去管理syndic机器了
root@saltmaster:/etc/salt/pki/master# salt '*' test.ping
syndic:
True
minion2:
True
这个是重点!
如果只是从master去经过syndic连接的minion简单远程执行命令就跟直连没啥区别,但是假如我们试试从master上下发pillar到minion2。首先创建/srv/pillar/syndic_test.sls
name: xiaofu
sex: male
然后在top.sls
里面进行分配
base:
'minion2':
- syndic_test
刷新pillar以后发现根本没有起作用
root@saltmaster:/etc/salt/pki/master# salt '*' saltutil.refresh_pillar
syndic:
True
minion2:
True
root@saltmaster:/etc/salt/pki/master# salt 'minion2' pillar.items
minion2:
----------
这就说到syndic架构的一个重点了,minion只能从直接相连的master获得file_roots以及pillar_roots里面的内容,被syndic控制的minion只能从syndic的文件系统获得文件。
那么利用rsync将master上的/srv/pillar
文件夹同步到syndic上试试看。因为我们用的是vagrant账号进行同步,首先在syndic机器上创建/srv
目录并更改权限为777
root@minion1:/# chmod 777 srv
root@minion1:/# ll -d srv
drwxrwxrwx 2 root root 4096 Feb 2 18:02 srv/
然后从master进行整个文件夹的同步
root@saltmaster:/srv# rsync -avzr pillar [email protected]:/srv
如果你和我一样用的官方演示环境,默认密码为vagrant
成功同步后再试着进行pillar下发,发现成功了
root@saltmaster:/srv# salt '*' saltutil.refresh_pillar
syndic:
True
minion2:
True
root@saltmaster:/srv# salt 'minion2' pillar.items
minion2:
----------
name:
xiaofu
sex:
male
我们经常会用到的state配置管理也是一样!
这就需要我们在master上维护一个脚本,一键同步file_roots
和pillar_roots
对应的两个文件夹到所有的syndic。在salt操作之前首先进行文件同步。
相信接触过zabbix-proxy的朋友对syndic的使用会有种似曾相识的感觉。syndic的配置并不难,主要是在于文件系统,是重点需要掌握的部分。