Saltstack自动化(八)在salt state中使用判断、循环及变量
一、在salt state中使用判断
这个示例使用了两个minions,一个名称为stgdc1app01,另一个为stgdc2app01。本篇的目标是根据minion的fqdn名称,创建网络的配置文件,配置文件基于模板文件,在创建过程中使用了一些基于Python的操作。下面就看一下具体的操作:
首先需要得到这两个minions的关于网络的grains数据,后面需要用到:
1[root@centos7-A ~]# salt \* grains.item ip_interfaces hwaddr_interfaces
2stgdc2app01:
3 ----------
4 hwaddr_interfaces:
5 ----------
6 eno16777736:
7 00:0c:29:62:4d:63
8 lo:
9 00:00:00:00:00:00
10 ip_interfaces:
11 ----------
12 eno16777736:
13 - 192.168.71.169
14 - fe80::20c:29ff:fe62:4d63
15 lo:
16 - 127.0.0.1
17 - ::1
18stgdc1app01:
19 ----------
20 hwaddr_interfaces:
21 ----------
22 eno16777736:
23 00:0c:29:94:77:20
24 lo:
25 00:00:00:00:00:00
26 ip_interfaces:
27 ----------
28 eno16777736:
29 - 192.168.71.168
30 - fe80::20c:29ff:fe94:7720
31 lo:
32 - 127.0.0.1
33 - ::1
接着在staging的环境下创建netconfig的state,就是在staging的基目录下创建netconfig文件夹,在此文件夹下继续创建一个名为files的文件夹,在files文件夹下创建名为ifcfg-eth0的文件,在netconfig文件夹下创建init.sls文件,最后文件夹的目录结构类似于如下这样:
1[root@centos7-A staging]# tree
2.
3└── netconfig
4 ├── files
5 │ └── ifcfg-eth0
6 └── init.sls
72 directories, 2 files
init.sls文件和ifcfg-eth0文件的内容分别如下:
1# ifcfg-eth0内容如下
2DEVICE=eth0
3HWADDR={{ hwaddr }}
4TYPE=Ethernet
5ONBOOT=yes
6NM_CONTROLLED=no
7BOOTPROTO=none
8IPADDR={{ ipaddr }}
9NETMASK={{ netmask }}
init.sls内容如下:
1{% if grains['id'].startswith('stgdc1') %}
2{% set netmask = '255.255.255.0' %}
3{% elif grains['id'].startswith('stgdc2') %}
4{% set netmask = '255.255.0.0' %}
5{% endif %}
6network_file:
7 file.managed:
8 - name: /etc/sysconfig/network-scripts/ifcfg-eth0
9 - source: salt://netconfig/files/ifcfg-eth0
10 - mode: 644
11 - template: jinja
12 - context:
13 ipaddr: {{ grains['ip_interfaces']['eno16777736'][0] }}
14 netmask: {{ netmask }}
15 hwaddr: {{ grains['hwaddr_interfaces']['eno16777736'].upper() }}
文件生成的大部分过程与上篇文章介绍的一致,这里我们主要关心init.sls文件中的第1行和第3行,它使用了判断语句,并且使用了Python的函数startswith,它根据minion名称的不同,设置不同的netmask。另外注意此文件的最后一行使用了Python的函数upper,它将字符串全部转换为大写。完成上述文件的编写后,便可以将state应用到minions上:
1[root@centos7-A netconfig]# salt -L 'stgdc1app01,stgdc2app01' state.sls netconfig saltenv=staging
在应用state到minions上时,这里使用了-L命令行选项来指定应用到的minion。-L选项的意义是使用列表来指定minion,下篇会学习各种指定minions的方式。
二、在salt state中使用循环
仍然使用上面的minions,在staging环境中,编辑pillar文件/opt/salt/pillar/staging/user/init.sls,使其具有以下内容:
1dev_user_list:
2 optimus:
3 uid: 7001
4 passwd: '$1$Dw1TxMI7$pmeYTdmz.rlunqPd7JELR.'
5 bumblebee:
6 uid: 7002
7 passwd: '$1$ZHUeIAfq$6sJl9rHVDX2UjBH1KrPZP1'
8 ironhide:
9 uid: 7003
10 passwd: '$1$rcJAiq7y$bJzv3HzVTbeQlA3cIu1Gb1'
编辑user state的配置文件/opt/salt/staging/user/init.sls,使其具有如下内容:
1{% for user, details in pillar['dev_user_list'].iteritems() %}
2{{ user }}:
3 user.present:
4 - home: /home/{{ user }}
5 - uid: {{ details['uid'] }}
6 - password: {{ details['passwd'] }}
7 - shell: /bin/bash
8{% endfor %}
上面文件的第一行和最后一行组成了for循环,pillar[‘dev_user_list’]中保存了一个Python字典,在使用了iteritems函数后,字典中的username保存在user变量中,其它数据保存在details变量中。可以通过和前面一样的方式来应用state到minions上。
三、在salt state中使用变量
其实在第一小节“在salt state中使用判断”里已经应用到了变量。在state的init.sls文件中,第2行为:
1{% set netmask = '255.255.255.0' %}
这里set关键字用来设置变量,netmask作为变量名,变量值为等号后面的部分。在使用变量时,一定不要在变量名外加引号,就像init.sls文件中第14行那样使用:
1netmask: {{ netmask }}
这里前面的netmask是在context下,表示模板ifcfg-eth0中的netmask的值是从这里得到的。后面的netmask是state文件中的变量,由set关键字指定,值是等号后面的部分。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/sls-for-if-variable/5578.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.