在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文件,使其具有以下内容:

init.sls
1
2
3
4
5
6
7
8
9
appenv_file:
file.managed:
- name: /etc/environment
- source: salt://appenv/files/environment
- template: jinja
- mode: 644
- context:
ipaddress: {{ grains['ip_interfaces']['eno16777736'][0] }}
hostname: {{ grains['fqdn'] }}

environment
1
2
primary_interface: {{ ipaddress }}
node_name: {{ hostname }}

创建完成后,测试一下这个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中怎样使用条件、循环及变量。