在salt state中使用grains
作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/
在上篇中,我们了解salt中的grains,知道了grains是存储在minions上的关于系统属性的一些信息。本篇就来在salt的state中使用grains提供的信息,同时了解一下jinja模板的使用。
本篇的环境继续使用“salt的环境、pillar和states”文章中创建的环境。
首先,可以使用grains.items得到所有的grains数据:
[root@centos7-A ~]# salt \* grains.items
...
此命令使用了通配符*作为minion的目标,表示所有的minion,由于我们目前只配置了一个minion,所以此命令会返回该minion下的所有grains,由于内容很多,省略了输出。
下面我们关心grains中的两个后面要使用到的数据,使用如下命令得到:
[root@centos7-A ~]# salt \* grains.item ip_interfaces fqdn
minion:
----------
fqdn:
centos7-B
ip_interfaces:
----------
eno16777736:
- 192.168.71.168
- fe80::20c:29ff:fe94:7720
lo:
- 127.0.0.1
- ::1
接下来就该创建state文件了。这个state的目的是根据minion上grains的信息来管理针对于此minion的配置文件。接下来就来看一下具体的步骤:
要创建的state的名称为appenv,要在staging的环境下创建。所以进入staging环境的基目录,创建appenv文件夹,在该文件夹内创建init.sls,该文件内包含state的具体内容。还是在staging环境的基目录下,创建另外一个名为files的文件夹,在此文件夹内创建文件environment。创建完毕后的文件夹结构如下:
[root@centos7-A staging]# tree
.
└── appenv
├── files
│ └── environment
└── init.sls
2 directories, 2 files
编辑init.sls文件和environment文件,使其具有以下内容:
|
|
创建完成后,测试一下这个state的执行能否成功:
[root@centos7-A appenv]# salt 'minion' state.sls appenv saltenv=staging test=True
minion:
----------
ID: appenv_file
Function: file.managed
Name: /etc/environment
Result: None
Comment: The file /etc/environment is set to be changed
Started: 18:23:54.284163
Duration: 119.162 ms
Changes:
----------
diff:
---
+++
@@ -0,0 +1,2 @@
+primary_interface: 192.168.71.168
+node_name: centos7-B
Summary
------------
Succeeded: 1 (unchanged=1, changed=1)
Failed: 0
------------
Total states run: 1
注意上述命令的最后一个参数为test=True,它可以测试state而不实际将其应用到minion上。通过测试运行的输出,是想要的结果,可以实际应用此state。这次执行命令时将test=True参数去掉:
[root@centos7-A appenv]# salt 'minion' state.sls appenv saltenv=staging
...
在minion上查看文件的内容:
[yangdong@centos7-B ~]$ cat /etc/environment
primary_interface: 192.168.71.168
node_name: centos7-B
可见,命令执行后在minion上生成了environment文件,而且文件的内容是由master上的模板environment和名为appenv的state共同生成的。模板实际使用的是Python中的jinja模板引擎。
回顾一下此文件生成的整个过程:文件是从master上复制到minion上,在复制的同时,替换了environment文件中由双大括号包含的部分;双大括号内的内容由state文件context部分下的变量提供。
本篇学习了如何在state中使用grains,并且应用了jinja的模板。下篇看一下在state中怎样使用条件、循环及变量。