SaltStack配置管理学习笔记-States基础和编写技巧 – 21运维
通知: .-...

SaltStack配置管理学习笔记-States基础和编写技巧

saltstack 21运维 2700浏览 0评论

前边文章写了一个《Saltstack配置管理学习笔记:配置管理概述》基本上对Saltstack的强大配置管理功能做了一个系统了解,后期笔记将重要写一些配置管理细节。今天再写一个state基础和编写技巧的笔记,先写一些基础,后边设置一个批量修改/etc/resolv.conf案例说明补充。
1,首先设置启用入口文件。file_roots 我们这里就不操作了,之前已经启用并根据上线流程,我们预设了开发环境、测试环境以及预生产环境,都是/srv/salt下创建。
state_top: top.sls
vi /etc/salt/master 找到top.sls并取消注释。设置以后需重启master生效。
329 state_top: top.sls
2,sls文件编写,sls是配置管理核心state模块的核心,这个需要大量的练习。
2.1 YAML是什么。 sls文件采用的是YAML写法,这里简单对YAML做个小说明:

YAML 的意思其实是:”Yet Another Markup Language”(仍是一种置标语言) ,这里建议去百度搜索YAML了解更为具体内容。这里简单说一点:

功能

YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表,标量等资料形态、。
它使用空白符号缩排和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种设定档、倾印除错内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。
尽管它比较适合用来表达阶层式(hierarchical model)的数据结构,不过也有精致的语法可以表示关联性(relational model)的资料。
由于YAML使用空白字符和分行来分隔资料,使的他特别适合用grep、Python、Perl、Ruby操作。
其让人最容易上手的特色是巧妙避开各种封闭符号,如:引号、各种括号等,这些符号在嵌套结构中会变得复杂而难以辨认。

格式

house:
  family:
    name: Doe
    parents:
      - John
      - Jane
    children:
      - Paul
      - Mark
      - Simone
  address:
    number: 34
    street: Main Street
    city: Nowheretown
    zipcode: 12345

多行缩进

数据结构可以用类似大纲的缩排方式呈现,结构通过缩进来表示,连续的项目通过减号“-”来表示,map结构里面的key/value对用冒号“:”来分隔。样例如下:

 注意:
  1. 字串不一定要用双引号标识;
  2. 在缩排中空白字符的数目并不是非常重要,只要相同阶层的元素左侧对齐就可以了(不过不能使用TAB字符);
  3. 允许在文件中加入选择性的空行,以增加可读性;
  4. 在一个档案中,可同时包含多个文件,并用“——”分隔;
  5. 选择性的符号“…”可以用来表示档案结尾(在利用串流的通讯中,这非常有用,可以在不关闭串流的情况下,发送结束讯号)。
单行缩写

YAML也有用来描述好几行相同结构的数据的缩写语法,数组用'[]’包括起来,hash用'{}’来包括。因此,上面的这个YAML能够缩写成这样:

house:
  family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }

2.2  编写技巧。 上边从百度copy了一些YAML的说明以及写法介绍,看资料等总结了无非就是三个技巧
(1)缩进  YAML使用一个固定的缩进风格表示数据层级关系,每个缩进需要有两个空格,一级没有,二级两个,三级四个,四级六个。。。
比如:

/etc/resolv.conf:
  file.managed:
    - source: salt://init/resolv.conf
    - user: root
    - group: root
    - mode: 644

(2)冒号 map结构里面的key/value键值对用冒号“:”来分隔。 比如上边的案例代码。
(3)短横线  连续的项目通过短横线“-”来表示,每个短横线右边都有一个空格。比如上边的案例代码。

3,实际案例。我们写一个批量同步所有minion端的dns,进行一个简单初始化配置。
(1)首先,我们top.sls入口文件的环境、操作对象以及要sls文件指定:

base:
  '*'
    - init.dns

如上代码我们设置了环境:base(/serv/salt)  操作对象target* 所有客户端,sls文件,init目录下的dns.sls文件
(2)init目录我们需要在/srv/salt创建一个init,然后进入这个目录以后vim dns.sls 写入如下内容:

/etc/resolv.conf:    要操作的目标对象
  file.managed:      采用的组件state.file和方法managed,核实文件存在对应状态   ,不一致就修改。
    - source: salt://init/resolv.conf    指定对比文件source路径,和谁对比。salt:// 是以当前base为根,如果有其他目录,需要加上对应路径。
    - user: root
    - group: root
    - mode: 644 

我们需要在init目录下在copy一个resolv.conf过来,cp /etc/resolv.conf ./ 然后编辑,我们设置namesever 为223.5.5.5 以及180.76.76.76
nameserver 223.5.5.5
nameserver 180.76.76.76
可以我们之前dns设置的是:

[[email protected] ~]# cat  /etc/resolv.conf
nameserver 1.2.3.4
nameserver 8.8.8.8

(3)执行结果。 我们执行下salt  ‘*’ state.highstate

[[email protected] init]# salt  '*' state.highstate
Master:
----------
          ID: /etc/resolv.conf
    Function: file.managed
      Result: True
     Comment: File /etc/resolv.conf updated
     Started: 17:04:25.392629
    Duration: 24.466 ms
     Changes:   
              ----------
              diff:
                  ---  
                  +++  
                  @@ -1,2 +1,2 @@
                  -nameserver 1.2.3.4
                  -nameserver 8.8.8.8
                  +nameserver 223.5.5.5
                  +nameserver 180.76.76.76
省略一万行。。。。。

可以看到已经成功执行,下边我们看下所有服务器的dns设置结果,执行 salt ‘*’ cmd.run ‘cat /etc/resolv.conf’

[[email protected] init]# salt  '*' cmd.run  'cat  /etc/resolv.conf'
Master:
    nameserver 223.5.5.5
    nameserver 180.76.76.76
aliserver:
    nameserver 223.5.5.5
    nameserver 180.76.76.76
HK-VPN:
    Minion did not return. [Not connected]  香港这个服务器机房网络蹦了,可以不管这结果。

转载请注明:21运维 » SaltStack配置管理学习笔记-States基础和编写技巧

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址