salt state中的require和watch关键字

2016-10-24 10:40:10来源:作者:Andy's Techblog人点击

第七城市

作者:杨冬 欢迎转载,也请保留这段声明。谢谢!

出处: https://andyyoung01.github.io/或 http://andyyoung01.16mb.com/

前面的文章中我们了解了salt中的模块和runners,本篇具体应用一下salt中的个别state模块,然后重点看一下state中的require和watch关键字的用法。

本篇文章中,我们使用了salt中的 cmdstate模块,它用来在minions上执行命令。通过命令的执行,在minions上安装特定版本的ruby语言环境。在安装ruby时,并没有使用操作系统提供的包管理器(如yum或apt-get等),而是通过ruby的RVM程序进行的。在salt的state模块中,也有一个rvm模块,可以使用 salt-call sys.state_doc rvm.installed命令来查看其具体用法。下面来看一下实现上述需求的具体过程:

在staging环境的基目录下创建名为ruby的文件夹,然后在文件夹中新建文件init.sls和子文件夹files,在files子文件夹中创建文件install_rvm,两个文件的内容如下:

init.sls /tmp/install_rvm: file.managed:- source: salt://ruby/files/install_rvm- user: root- group: root- mode: 744install_rvm: cmd.run:- name: /tmp/install_rvm- shell: /bin/bash- require:- file: /tmp/install_rvmruby-2.3.1: rvm.installed:- default: Truerequire:- cmd: install_rvmset_ruby: cmd.wait:- name: 'source /etc/profile.d/rvm.sh; rvm use 2.3.1 --default'- shell: /bin/bash- stateful: False- require:- rvm: ruby-2.3.1- watch:- rvm: ruby-2.3.1 install_rvm #!/bin/shset -o errexitgpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3curl -L https://get.rvm.io | bash -s stableecho "ruby_url=https://cache.ruby-china.org/pub/ruby" > /usr/local/rvm/user/dbsource /etc/profile.d/rvm.sh

首先来分析一下init.sls文件的内容,此state文件使用了 file, cmd和 rvm模块,具体的模块用法可以通过上篇文章介绍的sys.state_doc命令得到。

文件的第一部分/tmp/install_rvm使用了file.managed函数,可以在minion上通过 salt-call sys.list_state_functions file.managed查看此函数的帮助文档,文章中对name,source,user,group和mode都有介绍。这里主要说一下name字段,在此部分中并没有出现,于是salt自动将/tmp/install_rvm指定为name,所以此部分的引用名称和name字段都是/tmp/install_rvm。在state文件中,所有的name字段都可以通过这种方式隐含指定。

文件的第二部分install_rvm使用了cmd模块的run函数,也可以查看帮助文档得到里面各个字段的解释。这里我们主要注意 require关键字。 require使此关键字所在部分定义的功能只在它依赖的部分执行成功后才开始执行,这里只有当第一部分/tmp/install_rvm执行完毕,也就是文件从salt的文件服务器上拷贝到minion上并且命名为/tmp/install_rvm后,才开始执行第二部分install_rvm。

再来看第三部分ruby-2.3.1。它使用了rvm.installed函数。帮助文档中有更详细的解释。rvm模块默认检查它所在minion上是否安装了rvm环境,如果没有安装它会自动安装rvm。我们在前一部分通过install_rvm的bash脚本已经安装了rvm环境,并且修改了一些配置,使得rvm在下载相关文件时可以使用更快速度的源。

最后一部分使用了cmd.wait函数。它的作用是当它依赖的定义文件发生改变后,才执行cmd.wait定义的命令,在这里就是说只有当ruby-2.3.1安装后或者升级后,这里的name部分的命令才会执行。 watch关键字在这里也是必要的,此关键字使set_ruby部分一直监视ruby-2.3.1的状态,如果它发生改变便执行此部分定义的命令。

install_rvm脚本是用来安装rvm环境的。它首先将用于安装rvm的key导入到本地,然后执行安装脚本,再后面是替换rvm的下载源,最后执行rvm的环境设置脚本。

完成所有的配置后,通过如下命令执行state:

[root@centos7-A ruby]# salt 'stgdc1web01' state.sls ruby saltenv=stagingstgdc1web01:---------- ID: /tmp/install_rvm Function: file.managed Result: True Comment: File /tmp/install_rvm updated Started: 20:36:46.015186 Duration: 44.59 ms Changes: ---------- mode: 0744---------- ID: install_rvm Function: cmd.run Name: /tmp/install_rvm Result: True Comment: Command "/tmp/install_rvm" run Started: 20:36:46.065109 Duration: 172070.053 ms Changes: ---------- pid: 18127 retcode: 0 stderr: gpg: requesting key D39DC0E3 from hkp server keys.gnupg.net gpg: key D39DC0E3: "Michal Papis (RVM signing) <mpapis@gmail.com>" not changed gpg: Total number processed: 1 gpg: unchanged: 1 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 100 184 100 184 0 0 54 0 0:00:03 0:00:03 --:--:-- 54 100 184 100 184 0 0 54 0 0:00:03 0:00:03 --:--:-- 54 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 8 22865 8 1968 0 0 158 0 0:02:24 0:00:12 0:02:12 483 20 22865 20 4727 0 0 351 0 0:01:05 0:00:13 0:00:52 1147 20 22865 20 4727 0 0 327 0 0:01:09 0:00:14 0:00:55 1011 20 22865 20 4727 0 0 306 0 0:01:14 0:00:15 0:00:59 1125 44 22865 44 10245 0 0 606 0 0:00:37 0:00:16 0:00:21 1922 44 22865 44 10245 0 0 589 0 0:00:38 0:00:17 0:00:21 1658 57 22865 57 13004 0 0 709 0 0:00:32 0:00:18 0:00:14 1687 57 22865 57 13004 0 0 672 0 0:00:34 0:00:19 0:00:15 1687 57 22865 57 13004 0 0 639 0 0:00:35 0:00:20 0:00:15 1687 68 22865 68 15593 0 0 718 0 0:00:31 0:00:21 0:00:10 1113 68 22865 68 15593 0 0 678 0 0:00:33 0:00:22 0:00:11 953 68 22865 68 15593 0 0 652 0 0:00:35 0:00:23 0:00:12 466 68 22865 68 15593 0 0 626 0 0:00:36 0:00:24 0:00:12 466 68 22865 68 15593 0 0 602 0 0:00:37 0:00:25 0:00:12 466 68 22865 68 15593 0 0 583 0 0:00:39 0:00:26 0:00:13 0 80 22865 80 18352 0 0 651 0 0:00:35 0:00:28 0:00:07 529 92 22865 92 21111 0 0 740 0 0:00:30 0:00:28 0:00:02 1198 100 22865 100 22865 0 0 785 0 0:00:29 0:00:29 --:--:-- 1728 gpg: Signature made Tue Mar 29 21:49:47 2016 CST using RSA key ID BF04FF17 gpg: Good signature from "Michal Papis (RVM signing) <mpapis@gmail.com>" gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: 409B 6B17 96C2 7546 2A17 0311 3804 BB82 D39D C0E3 Subkey fingerprint: 62C9 E5F4 DA30 0D94 AC36 166B E206 C29F BF04 FF17 In case of problems: https://rvm.io/help and https://twitter.com/rvm_io * No new notes to display. stdout: Downloading https://github.com/rvm/rvm/archive/1.27.0.tar.gz Downloading https://github.com/rvm/rvm/releases/download/1.27.0/1.27.0.tar.gz.asc GPG verified '/usr/local/rvm/archives/rvm-1.27.0.tgz' Upgrading the RVM installation in /usr/local/rvm/ Upgrade of RVM in /usr/local/rvm/ is complete. # Administrator, # # Thank you for using RVM! # We sincerely hope that RVM helps to make your life easier and more enjoyable!!! # # ~Wayne, Michal & team. Upgrade Notes:---------- ID: ruby-2.3.1 Function: rvm.installed Result: True Comment: Successfully installed ruby. Started: 20:39:38.135938 Duration: 1695951.112 ms Changes: ---------- ruby-2.3.1: Installed---------- ID: set_ruby Function: cmd.wait Name: source /etc/profile.d/rvm.sh; rvm use 2.3.1 --default Result: True Comment: Command "source /etc/profile.d/rvm.sh; rvm use 2.3.1 --default" run Started: 21:07:54.120649 Duration: 7428.983 ms Changes: ---------- pid: 33903 retcode: 0 stderr: stdout: Using /usr/local/rvm/gems/ruby-2.3.1Summary------------Succeeded: 4 (changed=4)Failed: 0------------Total states run: 4

经过漫长地等待后,终于通过salt完成了ruby环境的配置。

本篇综合应用了一下state中的各种模块,学习了require和watch关键字的使用,下篇了解一下salt的orchestrate runner。

第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台