salt state中的require和watch关键字

目录

作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/http://andyyoung01.16mb.com/

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

本篇文章中,我们使用了salt中的cmd state模块,它用来在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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/tmp/install_rvm:
file.managed:
- source: salt://ruby/files/install_rvm
- user: root
- group: root
- mode: 744
install_rvm:
cmd.run:
- name: /tmp/install_rvm
- shell: /bin/bash
- require:
- file: /tmp/install_rvm
ruby-2.3.1:
rvm.installed:
- default: True
require:
- cmd: install_rvm
set_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
1
2
3
4
5
6
7
#!/bin/sh
set -o errexit
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
curl -L https://get.rvm.io | bash -s stable
echo "ruby_url=https://cache.ruby-china.org/pub/ruby" > /usr/local/rvm/user/db
source /etc/profile.d/rvm.sh

首先来分析一下init.sls文件的内容,此state文件使用了file,cmdrvm模块,具体的模块用法可以通过上篇文章介绍的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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
[root@centos7-A ruby]# salt 'stgdc1web01' state.sls ruby saltenv=staging
stgdc1web01:
----------
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.1
Summary
------------
Succeeded: 4 (changed=4)
Failed: 0
------------
Total states run: 4

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

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