之前写过一篇关于saltstack安装配置的博文,由于最近忙着辞职,一直没有更新。我为自己难过,但我说过我会坚持下去。这篇博文要记录的是saltstack作为文件服务器的功能,把文件从主人分发到爪牙。我们知道,在安装配置hadoop、hbase、zookeeper等分布式系统相关组件时,往往会在一个节点上修改配置文件,然后由scp远程复制到其他节点。如果你有10个节点,同样的远程复制命令需要执行多次,这显然不是一个好办法。那么问题来了,自动化运维文件的远程分发,哪家更强?哈哈,自然是神器saltstack!我们需要saltstack来实现从master到minions推送文件的需求。
Saltstack内置了一个简单的文件服务器,供master向minions分发文件。这个文件服务器是基于zeroMQ消息队列实现的,文件服务器上的所有客户端 *** 作都封装在cp模块中。
先看环境:
hadoop0.updb.com192.168.0.100 *** 作系统:CentOS6.5角色:主
uadoop2.updb.com192.168.0.202 *** 作系统:CentOS6.5角色:宠臣
uadoop3.updb.com192.168.0.203 *** 作系统:CentOS6.5角色:宠臣
在开始saltstack的配置管理之前,您应该首先指定saltstack的所有状态文件的根目录,并在master上执行以下 *** 作
## 首先修改master的配置文件,指定根目录,注意缩进全部使用两个空格来代替Tab(python规范) [root@hadoop0 ~]# vi /etc/salt/master file_roots: base: - /srv/salt dev: - /srv/salt/dev ## 确定指定的目录是否存在,如果不存在,需要手动来创建目录 [root@hadoop0 ~]# ls /srv/salt/ -ld drwxr-xr-x 2 root root 4096 Nov 6 23:54 /srv/salt/ [root@hadoop0 ~]# ls /srv/salt/dev/ -ld drwxr-xr-x 2 root root 4096 Nov 7 00:36 /srv/salt/dev/ ## 重启master服务 [root@hadoop0 ~]# /etc/init.d/salt-master restart Stopping salt-master daemon: [ OK ] Starting salt-master daemon: [ OK ]首先介绍cp.get_file,用于从主端下载文件到minion的指定目录,如下
## 在master上创建测试用的文件 [root@hadoop0 ~]# echo 'this is test file with module of cp.get_file!' > /opt/getfile.txt ## 拷贝测试文件到master配置的根目录下 [root@hadoop0 ~]# cp /opt/getfile.txt /srv/salt/ ## 在master执行文件的分发 [root@hadoop0 ~]# salt 'uadoop2' cp.get_file salt://getfile.txt /opt/getfile.txt uadoop2: /opt/getfile.txt ## 分发成功,在minion上查看文件是否已经发送到uadoop2上了 [root@uadoop2 ~]# cat /opt/getfile.txt this is test file with module of cp.get_file!使用cp.get_file分发文件时,还可以指定是否压缩分发的文件,如下所示
## 使用gzip的方式进行压缩,数字越大,压缩率就越高,9代表最大的压缩率 [root@hadoop0 ~]# salt 'uadoop2' cp.get_file salt://getfile.txt /opt/getfile.txt gzip=9 uadoop2: /opt/getfile.txt ## 分发成功,在minion上查看文件是否已经发送到uadoop2上了 [root@uadoop2 ~]# cat /opt/getfile.txt this is test file with module of cp.get_file!当minion上的目标目录不存在时,可以使用makedirs参数创建目标目录,如下所示
[root@hadoop0 ~]# salt 'uadoop2' cp.get_file salt://getfile.txt /opt/test/getfile.txt makedirs=True uadoop2: /opt/test/getfile.txt ## 分发成功,在minion上查看文件是否已经发送到uadoop2上了 [root@uadoop2 ~]# cat /opt/test/getfile.txt this is test file with module of cp.get_file!在开始下一个例子之前,我们先介绍一下谷物。这个接口的作用是在minion端的minion服务启动时调用这个接口,收集minion端的信息。这些信息数据可以直接用于salt的其他模块。需要注意的是,这个接口只在minion端的minion服务启动时调用一次,所以采集的数据是静态的,不会改变,除非你重启minion服务。在这方面,
Grains Static bits of information that a minion collects about the system when the minion first starts. The grains interface is made available to Salt modules and components so that the right salt minion commands are automatically available on the right systems. It is important to remember that grains are bits of information loaded when the salt minion starts, so this information is static. This means that the information in grains is unchanging, therefore the nature of the data is static. So grains information are things like the running kernel, or the operating system.谷物的基本用法
好了,介绍完了grains接口,我们来看看如何在cp模块中简单的使用grains数据。
## 首先在状态配置文件的根目录下创建一个CentOS目录,然后将位于根目录下的getfile.txt测试文件 mv到CentOS目录下 [root@hadoop0 ~]# mkdir /srv/salt/CentOS/ [root@hadoop0 ~]# mv /srv/salt/getfile.txt /srv/salt/CentOS/ ## 然后执行文件分发的命令,注意这里要使用salt内置模版jinja才能分发成功 [root@hadoop0 ~]# salt 'uadoop2' cp.get_file "salt://`grains`.`os`/getfile.txt" /opt/getfile.txt template=jinja uadoop2: /opt/getfile.txt然后介绍cp.get_dir。get_dir非常类似于get_file,用于将整个目录分发给minions。
## 创建测试目录 [root@hadoop0 ~]# mkdir /srv/salt/test_dir ## 创建测试文件 [root@hadoop0 ~]# echo 'hello a !' > /srv/salt/test_dir/a.txt [root@hadoop0 ~]# echo 'hello b !' > /srv/salt/test_dir/b.txt ## 执行目录文件的分发,并使用压缩传输 [root@hadoop0 ~]# salt 'uadoop2' cp.get_dir salt://test_dir /opt/ gzip=9 uadoop2: - /opt//test_dir/a.txt - /opt//test_dir/b.txt ## 分发成功,验证 [root@uadoop2 ~]# ls /opt/test_dir/ a.txt b.txt [root@uadoop2 ~]# cat /opt/test_dir/a.txt hello a ! [root@uadoop2 ~]# cat /opt/test_dir/b.txt hello b !在继续之前,我们先来介绍一下salt的支柱接口。pillar是salt的重要组成部分,有点类似于grains,但pillar比grains更灵活、更动态,如果你愿意,数据可以随时更新。当minion启动时,Grains只收集一次数据。pillar官网描述如下。只是简单的翻译,但是翻译不保证。意味着pillar是salt实现部署功能最重要的组件,它可以为Minion生成非常灵活的数据,这些数据可以被salt的其他组件使用。
The pillar interface inside of Salt is one of the most important components of a Salt deployment. Pillar is the interface used to generate arbitrary data for specific minions. The data generated in pillar is made available to almost every component of Salt.支柱的基本用途
## 使用pillar之前要在master中配置pillar的工作目录,将下面三行的注释打开 [root@hadoop0 ~]# vi /etc/salt/master pillar_roots: base: - /srv/pillar ## 重启master服务 [root@hadoop0 ~]# /etc/init.d/salt-master restart Stopping salt-master daemon: [ OK ] Starting salt-master daemon: [ OK ] ## 创建所需目录 [root@hadoop0 ~]# mkdir /srv/pillar/ ## 该目录用来测试使用 [root@hadoop0 ~]# mkdir /srv/pillar/user ## 首先在/srv/pillar目录中要有一个入口文件top.sls [root@hadoop0 pillar]# vi top.sls base: 'uadoop2': - data ## 为uadoop2定义了一个属性数据,引用了跟top.sls同目录下的data.sls 'uadoop3': - webserver ## 为uadoop3定义了一个属性数据,引用了跟top.sls同目录下的web.sls '*': - user ## 为所有节点定义了一个属性数据,引用了/srv/pillar/user/init.sls ## 这里指定的是一个目录,salt会自动在top.sls文件中的引用目录中寻找状态文件 ## 因此会找到位于user目录中的init.sls文件 ## 编写在top.sls文件中引用的状态文件 [root@hadoop0 pillar]# vi data.sls data: some data [root@hadoop0 pillar]# vi webserver.sls webserver: test_dir [root@hadoop0 pillar]# vi user/init.sls users: kora: 1000 kadefor: 1100 foway: 1200 ## 接着将master上定义的属性同步到对应的minion上去 [root@hadoop0 pillar]# salt '*' pillar.items uadoop3: ---------- master: ---------- auth_mode: 1 auto_accept: False .............省略N行.............. worker_threads: 5 webserver: test_dir users: ---------- foway: 1200 kadefor: 1100 kora: 1000 uadoop2: ---------- data: some data master: ---------- auth_mode: 1 .............省略N行.............. worker_threads: 5 users: ---------- foway: 1200 kadefor: 1100 kora: 1000 ## 在master上远程获取刚刚定义的属性 [root@hadoop0 pillar]# salt 'uadoop2' pillar.item data uadoop2: ---------- data: some data [root@hadoop0 pillar]# salt 'uadoop3' pillar.item webserver uadoop3: ---------- webserver: test_dir [root@hadoop0 pillar]# salt '*' pillar.item users uadoop2: ---------- users: ---------- foway: 1200 kadefor: 1100 kora: 1000 uadoop3: ---------- users: ---------- foway: 1200 kadefor: 1100 kora: 1000 ## 可以看到刚刚为不同的minion定义的属性已经同步到了各个minion上,从这个测试可以看出,使用pillar ## 我们可以为不同的minion或者不同的minion组定义不同的属性,极其灵活。好了,介绍完pillar接口,我们来看看如何在cp模块中简单使用pillar定义的属性数据。
## 我们可以利用之前定义的属性来匹配不同的minion [root@hadoop0 pillar]# salt -I 'users:kora:1000' test.ping uadoop2: True uadoop3: True [root@hadoop0 pillar]# salt -I 'data:*some*' test.ping uadoop2: True [root@hadoop0 pillar]# salt -I 'webserver:test_dir' test.ping uadoop3: True ## 匹配uadoop3,然后在master上远程分发文件到uadoop3上去 [root@hadoop0 pillar]# salt -I 'webserver:test_dir' cp.get_dir "salt://`pillar`.`webserver`" /opt/ gzip=9 template=jinja uadoop3: - /opt//test_dir/a.txt - /opt//test_dir/b.txt从远程执行的结果来看,文件已经成功分发。上面的例子演示了cp模块中pillar接口定义的属性的简单使用。我们可以通过pillar为不同的爪牙指定的属性和值来匹配对应的爪牙,非常灵活。
好了,这就是关于salt文件服务器的全部内容。虽然只是简单体验了一下,但还是被salt作为文件服务器的强大功能所震撼。有了salt的文件分发功能,真的是鸟q换炮。当然,你不需要使用很多scp命令。你只需要写好配置文件,分组,发一个命令就可以完成所有节点的文件分发。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)