ptyhon中salt state中使用判断、循环及变量

上篇文章在state文件中使用了jinja模板,提高了书写state文件的灵活性。本篇继续学习state文件的编写。在state文件中可以使用判断、循环及变量,使大大提高了其灵活性,本篇来学习一下这些用法。

在salt state中使用判断

这个示例使用了两个minions,一个名称为stgdc1app01,另一个为stgdc2app01。在“salt的安装和配置”中介绍了如何安装和配置salt的master和minion,这里直接进入state文件的编写。本篇的目标是根据minion的fqdn名称,创建网络的配置文件,配置文件基于模板文件,在创建过程中使用了一些基于Python的操作。下面就看一下具体的操作:

首先需要得到这两个minions的关于网络的grains数据,后面需要用到:

[root@centos7-A ~]# salt \* grains.item ip_interfaces hwaddr_interfaces
stgdc2app01:
    ----------
    hwaddr_interfaces:
        ----------
        eno16777736:
            00:0c:29:62:4d:63
        lo:
            00:00:00:00:00:00
    ip_interfaces:
        ----------
        eno16777736:
            - 192.168.71.169
            - fe80::20c:29ff:fe62:4d63
        lo:
            - 127.0.0.1
            - ::1
stgdc1app01:
    ----------
    hwaddr_interfaces:
        ----------
        eno16777736:
            00:0c:29:94:77:20
        lo:
            00:00:00:00:00:00
    ip_interfaces:
        ----------
        eno16777736:
            - 192.168.71.168
            - fe80::20c:29ff:fe94:7720
        lo:
            - 127.0.0.1
            - ::1
接着在staging的环境下创建netconfig的state,就是在staging的基目录下创建netconfig文件夹,在此文件夹下继续创建一个名为files的文件夹,在files文件夹下创建名为ifcfg-eth0的文件,在netconfig文件夹下创建init.sls文件,最后文件夹的目录结构类似于如下这样:

[root@centos7-A staging]# tree
.
└── netconfig
    ├── files
    │   └── ifcfg-eth0
    └── init.sls

2 directories, 2 files
init.sls文件和ifcfg-eth0文件的内容分别如下:

ifcfg-eth0
DEVICE=eth0
HWADDR={{ hwaddr }}
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
IPADDR={{ ipaddr }}
NETMASK={{ netmask }}
init.sls
{% if grains['id'].startswith('stgdc1') %}
{% set netmask = '255.255.255.0' %}
{% elif grains['id'].startswith('stgdc2') %}
{% set netmask = '255.255.0.0' %}
{% endif %}
network_file:
 file.managed:
- name: /etc/sysconfig/network-scripts/ifcfg-eth0
- source: salt://netconfig/files/ifcfg-eth0
- mode: 644
- template: jinja
- context:
ipaddr: {{ grains['ip_interfaces']['eno16777736'][0] }}
netmask: {{ netmask }}
hwaddr: {{ grains['hwaddr_interfaces']['eno16777736'].upper() }}
文件生成的大部分过程与上篇文章介绍的一致,这里我们主要关心init.sls文件中的第1行和第3行,它使用了判断语句,并且使用了Python的函数startswith,它根据minion名称的不同,设置不同的netmask。另外注意此文件的最后一行使用了Python的函数upper,它将字符串全部转换为大写。完成上述文件的编写后,便可以将state应用到minions上:

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

init.sls
dev_user_list:
optimus:
uid: 7001
passwd: '$1$Dw1TxMI7$pmeYTdmz.rlunqPd7JELR.'
bumblebee:
uid: 7002
passwd: '$1$ZHUeIAfq$6sJl9rHVDX2UjBH1KrPZP1'
ironhide:
uid: 7003
passwd: '$1$rcJAiq7y$bJzv3HzVTbeQlA3cIu1Gb1'
编辑user state的配置文件/opt/salt/staging/user/init.sls,使其具有如下内容:

init.sls
{% for user, details in pillar['dev_user_list'].iteritems() %}
{{ user }}:
 user.present:
- home: /home/{{ user }}
- uid: {{ details['uid'] }}
- password: {{ details['passwd'] }}
- shell: /bin/bash
{% endfor %}
上面文件的第一行和最后一行组成了for循环,pillar[‘dev_user_list’]中保存了一个Python字典,在使用了iteritems函数后,字典中的username保存在user变量中,其它数据保存在details变量中。可以通过和前面一样的方式来应用state到minions上。

在salt state中使用变量

其实在第一小节“在salt state中使用判断”里已经应用到了变量。在state的init.sls文件中,第2行为:

{% set netmask = '255.255.255.0' %},
这里set关键字用来设置变量,netmask作为变量名,变量值为等号后面的部分。

在使用变量时,一定不要在变量名外加引号,就像init.sls文件中第14行那样使用:

netmask: {{ netmask }}
这里前面的netmask是在context下,表示模板ifcfg-eth0中的netmask的值是从这里得到的。后面的netmask是state文件中的变量,由set关键字指定,值是等号后面的部分。

本篇学习了salt state中判断、循环及变量的使用。下篇看一下salt中指定minion的各种方式。

时间: 2024-10-30 06:37:38

ptyhon中salt state中使用判断、循环及变量的相关文章

c++-C++循环体中的局部变量怎样在每次循环后内存清零,进行下次循环的时候再重新赋值

问题描述 C++循环体中的局部变量怎样在每次循环后内存清零,进行下次循环的时候再重新赋值 在做一道题 依次输入每个人的名字然后输入成绩,每个名字后面都跟着每个人的成绩,不是把人名输完再输成绩. 然后要求统计每个人几次成绩的和,依次输出每个人姓名以及他们的总成绩.这个怎么做? #include #include #include using namespace std; int main() { int r; vector name; cout<<"人数:"; cin>

一列一列向access表中插入数据,列数是一个变量,用循环,用什么sql语句

问题描述 一列一列向access表中插入数据,列数是一个变量,用循环,用什么sql语句 用sql语句向ACCESS的一张表中添加数据,因为具体的列数还不清楚,所以想用循环一列一列向ACCESS表中插入数据,采用insert,为什么插入30行数据(即一列),当插第二列数据时就从第31行,第二列开始了(应该是第一行第二列开始).如果不用insert,用update那语句怎么写,一直出错. 解决方案 你的数据库表结构有问题.你应该把你的列作为行来插入.数据库中的表,列就应该是确定的. 解决方案二: 你

特别着急-JS中的按钮问题,判断他是否失效

问题描述 JS中的按钮问题,判断他是否失效 各位前辈:如何实现一个按钮在一天最多只能点击一次,再次点击都无效.不管页面是否从新加载或者刷新,都只能被点击一次,谢谢大师求解. 解决方案 状态记录到后端,加载页面的时候读取按钮状态,根据是否有效设置按钮可用不可用就可以了 解决方案二: 楼上正解, 其实记录cookie也可以,只不过清掉cookie 就失灵了 解决方案三: 楼上:如何写源代码呢?我对代码一点不懂. 解决方案四: 如果要严格的控制,就得必须用户登录,然后用户点击后再后台记录,再次加载页面

javascript-js中,ajax嵌套的for循环问题

问题描述 js中,ajax嵌套的for循环问题 代码是 utils.Ajax(url, dataObject, {showLoad:true}, function(data, textStatus, jqXHR) { if(data.success){ parseList(data.returnDTO.list); }else{ toastr.error(data.errorString); } },function(jqXHR, textStatus, errorThrown){ toastr

hashtable-link中如何使用HashTable来提高循环的效率?

问题描述 link中如何使用HashTable来提高循环的效率? link中如何使用HashTable来提高循环的效率? 解决方案 HashTable通过key访问就行了,如果是为了遍历,那谈不到效率,数组列表都可以遍历,HashTable方便在于牺牲空间换换时间,根据key值查找value快

shell编程中if [[ ! ${a} =~ ^[0-9]+ ]]条件判断式如何工作的?

问题描述 shell编程中if [[ ! ${a} =~ ^[0-9]+ ]]条件判断式如何工作的? if [[ ! ${a} =~ ^[0-9]+ ]]这个语句具体是怎么工作的?我只知道这个好像是如果变量a不是以数字开头就执行if语句,但是特别的: =~是什么意思? ^[0-9]+ 是什么意思?另外这个判断使用的是扩展正则表达式? 解决方案 这里只有^[0-9]+是正则表达式,表示一个数字,别的都不是正则. 解决方案二: 只是原样的字符 解决方案三: =~意思是匹配后面的正则式,^是匹配开头,

java i o流 文本框-java中文本框信息的判断 初学。。。

问题描述 java中文本框信息的判断 初学... java 中 用I/O流的操作 map方法将账号和密码等信息写入记事本中怎么在JFram文本框中判断信息是存在记事本中的 并且判断账号和密码对应 新手求指导....拜托了

在wpf中如何让MediaElement的视频循环播放

原文:在wpf中如何让MediaElement的视频循环播放 MediaElement原始的播放是只播放一遍:如何设置让MediaElement播放 的视频或者音频循环播放,解决如下: 修改MediaElement模版  <MediaElement  Name="myMediaElement" Margin="13,35,14,0"  Height="100" VerticalAlignment="Top">   

评价函数-函数图像中,正负无穷的取值判断

问题描述 函数图像中,正负无穷的取值判断 用函数求得了对于投资资金的动向判断值fx 以盈亏平衡,f (x)=0为中心,当-∞转向+∞,x 等于负数时,是看上限还是下限?等于正数时:又是何解? 相反的,当+∞转向-∞.等于正负值是,分别做何解? 比如下图得出的结果