SaltStack多Master与多环境

Posted DevOps

tags:

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


如何建立多Master的SaltStack环境

0.16.0版本的发布,带来了minion可以连接多Master的特性. 这种方式称为多master( multi-master )配置, 使环境中的冗余。在这种配置下,Salt Minions将连接所有配置的Salt Master. 本文将带你了解如何建立多Master的环境.

 

Master Keys

在建立多Master的配置中,主要的一点就是所有的Master使用同样的private key. 这些key将在Master第一次启动时自动生成。 因此在多Master环境建立时,需要从原始的(original) Master上拷贝其private key至第二个Master以提供它启动时自动生成的那个, 以此类推.

Master的private key存储在Master本地的 pki_dir 目录下. 默认的目录是 /etc/salt/pki/master/master.pem . 将该key拷贝到新增的master上. 需要注意的是,在拷贝的时候,需要确保新增的master上并没有minion连接进来.

 

Configure Minions

下边是一个多Master的配置例子:

1

2

3

master:

  - master1.example.tld

  - master2.example.tld

配置完毕后,需要重启Minion以确保配置生效. 此时所有的Master均可以控制你的minions.

 

Sharing Files Between Masters

Salt并不会自动在Master间共享文件. 本小节将带你了解Master间哪些文件需要同步以保持一致.

 

Minion Keys

Minion的keys需要每个Master都进行accept. 可以使用 salt-key 手动接接受minion的key, 也可以在Master间保持key目录的同步. 需要同步的目录有:

/etc/salt/pki/master/minions
/etc/salt/pki/master/minions_pre
/etc/salt/pki/master/minions_rejected

[warning]直接共享 /etc/salt/master 目录是强烈反对的. 允许外部访问 master.pem key将带来严重的安全风险.[/warning]

 

file_roots

file_roots 的内容需要在Master间同步以保持一致. 这里存放Salt State配置管理文件. 推荐同步内容使用 gitfsbackend,或者直接将 file_roots 存储在共享存储上.

 

pillar_roots

同理,对于 pillar_roots 也是如此,需要保持Pillar数据一致.

 

Master Configuration

最后你需要确保有关Master的配置选项在所有Master间是同步的. 除非你知道你不需要这么做,你需要保证以下的设置Master间是同步的:

external_auth
client_acl
peer
peer_run

 

Conslusion

多Master环境配置提供了控制Minions的冗余性,配置相当简单. 只需要保证key及State文件在你的多Master间是同步的,你就可以透明的在多Master上控制你的Minions。


多环境

今天在进行 saltstack 多环境的时候,遇到一个问题,最终得到解决,好记性不如烂笔头,记录。

首先,我在 salt master 服务器上对 /etc/salt/master 配置文件进行多环境配置,配置文件如下:

file_roots:  base:    - /srv/salt/base  dev:    - /srv/salt/dev  prod:    - /srv/salt/prod  test:    - /srv/salt/test

然后在分别建立配置文件所配置的目录。
其中我的 
/srv/salt/prod 的目录树如下:

/srv/salt/prod |-- nginx|   `-- stock.sls|-- stock.prod.com|   `-- nginx|       `-- stock.prod.com`-- top.sls

我做这个主要是为了对集群中的 nginx 的配置文件进行批量管理,当配置文件变更后,能进行批量推送。

弄完以上后,执行命令让其生效:

sudo salt -N STOCK  state.highstate -v

执行完毕,能成功生效,但是突然想到个问题,这个是全局的所有的环境的所有的状态生效,如果我要只对 prod 环境的某一个状态生效呢,或者是其他的环境。于是查看官方文档,发现了可以使用 state.sls 来指定特定的进行处理,当时也没有细看,就直接执行命令:

sudo salt -N STOCK state.sls nginx.stock

结果执行报错,告诉我在 base 下面没有匹配到 nginx.stock

当时想,不应该是,我不是定义了么,开始是以为 state.sls 和 state.highstate 一样,会对所有的环境遍历。
有问题,就 google 呗,然后 google 了下没有出来,啃官方文档去,找到 
state.sls 的那段,发现定义如下:

salt.modules.state.sls(mods,saltenv='base',test=None,exclude=None,queue=False,env=None,concurrent=False,**kwargs)

从上面可以看出, state.sls 默认的运行环境是 base,另外通过查看了下 saltstack 的 google groups ,发现绿肥也对这个解答了下, state.sls 并不读取 top.sls,所以 state.sls 需要单独执行哪些 sls 的话,需要你自定义。
绿肥解答的连接请

注:由于万恶的长城的存在,请准备梯子。

经过上面的查看,因此,修正执行命令

 sudo salt -N STOCK state.sls  saltenv='prod' nginx.stock

多加一个参数 saltenv,问题解决。更详细的内容请看官方的文档介绍 - 



欢迎关注运维自研堂订阅号,运维自研堂是一个技术分享平台,主要是运维自动化开发:linux、python、django、saltstack、tornado、bootstrap、redis、golang、docker、etcd等经验分享。




牛人并不可怕,可怕的是牛人比我们还努力!






以上是关于SaltStack多Master与多环境的主要内容,如果未能解决你的问题,请参考以下文章

一次saltstack环境变量的坑

SaltStack部署

SaltStack之编译安装LNMP环境

saltstack(master迁移)

SaltStack 配置管理

Saltstack实战之无master和多master