Saltstackのmulti-master
15069 ワード
一、実験環境:
1、saltバージョン:
2、システムバージョン:
二、Salt構築マスター
1、新しいマスターサーバをインストールする
2、copy master keysから新しいmasterに対応するディレクトリ(master.pemとmaster.pub)
3、新しいマスタープロセスを起動する
4、minionsプロファイルの構成
5、Restart minions
6、新しいマスターでaccept keys
7、二つのsalt-master対salt-minionのtestをテストする.ping
コメント:
Multi-masterの構成の主な問題は、masterごとに同じprivate keyを使用することです.Private keyは、masterの最初の起動時に自動的に生成されます(注意:multi-masterを構成する場合は、必ず新しいmasterを起動する前に古いmasterのprivate key copyを対応ディレクトリに送信してください).
minionプロファイルを変更するには、次の手順に従います.
master
-saltmaster1.example.com
-saltmaster2.example.com
三、出会った問題:
1、minion側でsalt-callテストを行った場合(前提条件はメインマスターstopを)、発見:
2、masterデータ共有問題:
masters間では情報は共有されません.public keysは各masterでacceptする必要があります.ファイル共有は手動で行う必要があります.gitツールのようにfile_を確保する必要があります.rootsディレクトリファイルが一致しています.
同期が必要なディレクトリは次のとおりです.
Minion keys:/etc/salt/pki/master/minions /etc/salt/pki/master/minions_pre /etc/salt/pki/master/minions_rejected
メモ:直接共有/etc/salt/masterディレクトリは強く反対します.外部アクセスを許可するmaster.pem keyは深刻なセキュリティリスクをもたらします.
4、minion keysは参考にして使用できる:
シナリオ1:
*/10 * * * * rsync -av --progress --delete --timeout=30 [email protected]:/etc/salt/pki/master/minions//etc/salt/pki/master/minions/
シナリオ2:salt-keyのソースコードを変更する:
マスターマスターマスターがacceptを持っているときにマスターに同期し、プロファイルにバックアップIPを配置し、両側の同期に成功してこそ成功する.
minionを削除するときはsalt-key-dで削除するか、rsyncに合わせてrmでminionを削除するのを防止します.
5、file_rootsとpillar_rootsなどのファイルはgitに置くことができます.
なお,本実験のsaltバージョンはminionを修正する必要がある.pyファイル:
minion登録するときはIPの小さい機器に先に登録するので、あなたが指定したIP順で登録することはできません.
修正コードは次のとおりです.
minionからpyコードでfor master in set(self.opts['master']):を表示します.
1、saltバージョン:
[root@master master]# salt --versions-report
Salt: 2015.5.10
Python: 2.7.5 (default, Nov 6 2016, 00:28:07)
Jinja2: 2.7.2
M2Crypto: 0.21.1
msgpack-python: 0.4.8
msgpack-pure: Not Installed
pycrypto: 2.6.1
libnacl: Not Installed
PyYAML: 3.10
ioflo: Not Installed
PyZMQ: 14.3.1
RAET: Not Installed
ZMQ: 3.2.5
Mako: Not Installed
Tornado: Not Installed
timelib: Not Installed
dateutil: Not Installed
2、システムバージョン:
[root@master master]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
二、Salt構築マスター
1、新しいマスターサーバをインストールする
2、copy master keysから新しいmasterに対応するディレクトリ(master.pemとmaster.pub)
3、新しいマスタープロセスを起動する
4、minionsプロファイルの構成
5、Restart minions
6、新しいマスターでaccept keys
7、二つのsalt-master対salt-minionのtestをテストする.ping
[root@master master]# salt -L 192.168.163.13 test.ping
192.168.163.13:
True
[root@standby minions]# salt -L 192.168.163.13 test.ping
192.168.163.13:
True
コメント:
Multi-masterの構成の主な問題は、masterごとに同じprivate keyを使用することです.Private keyは、masterの最初の起動時に自動的に生成されます(注意:multi-masterを構成する場合は、必ず新しいmasterを起動する前に古いmasterのprivate key copyを対応ディレクトリに送信してください).
minionプロファイルを変更するには、次の手順に従います.
master
-saltmaster1.example.com
-saltmaster2.example.com
三、出会った問題:
1、minion側でsalt-callテストを行った場合(前提条件はメインマスターstopを)、発見:
[root@standby salt]# salt-call test.ping
[INFO ] SaltReqTimeoutError: after 60 seconds. (Try 1 of 4)
[INFO ] SaltReqTimeoutError: after 60 seconds. (Try 2 of 4)
[INFO ] SaltReqTimeoutError: after 60 seconds. (Try 3 of 4)
[INFO ] SaltReqTimeoutError: after 60 seconds. (Try 4 of 4)
[WARNING ] Attempted to authenticate with master 192.168.199.39 and failed
[WARNING ] Master ip address changed from 192.168.199.39 to 192.168.163.13
local:
True
---- minion auth_tries 4, 7.
3 , master :
[root@standby minion]# salt-call test.ping
[INFO ] SaltReqTimeoutError: after 60 seconds. (Try 1 of 3)
[INFO ] SaltReqTimeoutError: after 60 seconds. (Try 2 of 3)
[INFO ] SaltReqTimeoutError: after 60 seconds. (Try 3 of 3)
[WARNING ] Attempted to authenticate with master 192.168.199.39 and failed
[WARNING ] Master ip address changed from 192.168.199.39 to 192.168.163.13
[INFO ] SaltReqTimeoutError: after 60 seconds. (Try 1 of 3)
[INFO ] SaltReqTimeoutError: after 60 seconds. (Try 2 of 3)
[INFO ] SaltReqTimeoutError: after 60 seconds. (Try 3 of 3)
[WARNING ] Attempted to authenticate with master 192.168.163.13 and failed
[ERROR ] An un-handled exception was caught by salt's global exception handler:
AttributeError: 'SMinion' object has no attribute 'functions'
Traceback (most recent call last):
File "/usr/bin/salt-call", line 11, in <module>
salt_call()
File "/usr/lib/python2.7/site-packages/salt/scripts.py", line 227, in salt_call
client.run()
File "/usr/lib/python2.7/site-packages/salt/cli/call.py", line 71, in run
caller.run()
File "/usr/lib/python2.7/site-packages/salt/cli/caller.py", line 236, in run
ret = self.call()
File "/usr/lib/python2.7/site-packages/salt/cli/caller.py", line 107, in call
if fun not in self.minion.functions:
AttributeError: 'SMinion' object has no attribute 'functions'
Traceback (most recent call last):
File "/usr/bin/salt-call", line 11, in <module>
salt_call()
File "/usr/lib/python2.7/site-packages/salt/scripts.py", line 227, in salt_call
client.run()
File "/usr/lib/python2.7/site-packages/salt/cli/call.py", line 71, in run
caller.run()
File "/usr/lib/python2.7/site-packages/salt/cli/caller.py", line 236, in run
ret = self.call()
File "/usr/lib/python2.7/site-packages/salt/cli/caller.py", line 107, in call
if fun not in self.minion.functions:
AttributeError: 'SMinion' object has no attribute 'functions'
2、masterデータ共有問題:
masters間では情報は共有されません.public keysは各masterでacceptする必要があります.ファイル共有は手動で行う必要があります.gitツールのようにfile_を確保する必要があります.rootsディレクトリファイルが一致しています.
同期が必要なディレクトリは次のとおりです.
Minion keys:
メモ:直接共有/etc/salt/masterディレクトリは強く反対します.外部アクセスを許可するmaster.pem keyは深刻なセキュリティリスクをもたらします.
4、minion keysは参考にして使用できる:
シナリオ1:
*/10 * * * * rsync -av --progress --delete --timeout=30 [email protected]:/etc/salt/pki/master/minions//etc/salt/pki/master/minions/
シナリオ2:salt-keyのソースコードを変更する:
マスターマスターマスターがacceptを持っているときにマスターに同期し、プロファイルにバックアップIPを配置し、両側の同期に成功してこそ成功する.
minionを削除するときはsalt-key-dで削除するか、rsyncに合わせてrmでminionを削除するのを防止します.
5、file_rootsとpillar_rootsなどのファイルはgitに置くことができます.
なお,本実験のsaltバージョンはminionを修正する必要がある.pyファイル:
minion登録するときはIPの小さい機器に先に登録するので、あなたが指定したIP順で登録することはできません.
修正コードは次のとおりです.
minionからpyコードでfor master in set(self.opts['master']):を表示します.
class MultiMinion(MinionBase):
'''
Create a multi minion interface, this creates as many minions as are
defined in the master option and binds each minion object to a respective
master.
'''
# timeout for one of the minions to auth with a master
MINION_CONNECT_TIMEOUT = 5
def __init__(self, opts):
super(MultiMinion, self).__init__(opts)
def minions(self):
'''
Return a dict of minion generators bound to the tune_in method
dict of master -> minion_mapping, the mapping contains:
opts: options used to create the minion
last: last auth attempt time
auth_wait: time to wait for next auth attempt
minion: minion object
generator: generator function (non-blocking tune_in)
'''
if not isinstance(self.opts['master'], list):
log.error(
'Attempting to start a multimaster system with one master')
sys.exit(salt.defaults.exitcodes.EX_GENERIC)
ret = {}
# master
for master in self.opts['master']:
# for master in set(self.opts['master']):
s_opts = copy.deepcopy(self.opts)
s_opts['master'] = master
s_opts['multimaster'] = True
ret[master] = {'opts': s_opts,
'last': time.time(),
'auth_wait': s_opts['acceptance_wait_time']}
try:
minion = Minion(
s_opts,
self.MINION_CONNECT_TIMEOUT,
False,
'salt.loader.{0}'.format(master))
ret[master]['minion'] = minion
ret[master]['generator'] = minion.tune_in_no_block()
except SaltClientError as exc:
log.error('Error while bringing up minion for multi-master. Is master at {0} responding?'.format(master))
return ret