saltstack-配置管理-yaml与jinja

前面我们研究了远程执行现在我们就来看看配置管理方面的东西,以前研究saltstatck研究完远程执行就完了。现在我们来看看配置管理,当然配置管理也是saltstack的核心系统
以下是官网翻译介绍:
Salt包含了一个强壮且灵活的配置管理框架,它建立在远程执行的核心功能之上。这个框架在minion上执行,通过渲染语言(rendering language)指定states文件,可轻松配置上万台主机。
states文件?这是什么鬼

OK,其它states是saltstack当中的配置语言,我们如果需要实现一些功能的话就需要去编写states sls文件,(states sls 描述状态配置的文件)。辨析sls文件都是YAML语法也支持python语法。

查看所有的states列表
[root@localhost salt]# salt '*' sys.list_state_modules
client1.roddypy.com:
    - acl
    - alias
    - alternatives
    - archive
    - artifactory
    - at
    - blockdev
    - buildout
    - cloud
    - cmd
    - composer
    - cron
    - disk
    - environ
    - event
    - file
查看具体的function用法
[root@localhost salt]# salt '*' sys.list_state_functions iptables
client1.roddypy.com:
    - iptables.append
    - iptables.chain_absent
    - iptables.chain_present
    - iptables.delete
    - iptables.flush
    - iptables.insert
    - iptables.mod_aggregate
    - iptables.set_policy
[root@localhost salt]#
查看具体function配置方法

这个就是一个好的样例,我们编写states文件可以参考这个来操作

[root@localhost salt]# salt '*' sys.state_doc iptables
client1.roddypy.com:
    ----------
    iptables:
         
        Management of iptables
        ======================
         
        This is an iptables-specific module designed to manage Linux firewalls. It is
        expected that this state module, and other system-specific firewall states, may
        at some point be deprecated in favor of a more generic `firewall` state.
         
            httpd:
              iptables.append:
                - table: filter
                - chain: INPUT
                - jump: ACCEPT
                - match: state
                - connstate: NEW
                - dport: 80
                - proto: tcp
                - sport: 1025:65535
                - save: True
配置主机hosts并分发到所有的minion
[root@localhost salt]# mkdir /etc/salt/states
[root@localhost salt]#cd  /etc/salt/states
[root@localhost states]# cp /etc/hosts ./
[root@localhost states]# vim  hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.22  www.baidu.com
192.168.2.22  www.roddypy.com
[root@localhost states]# vim hosts_file.sls 
  /etc/hosts:
    file.managed:
      - source: salt://states/hosts
      - user: root
      - group: root
      - mode: 644
      - backup: minion       是否备份\不写就不备份
[root@localhost states]#
[root@localhost states]# salt '*' state.sls states.hosts_file
client1.roddypy.com:
----------
          ID: /etc/hosts
    Function: file.managed
      Result: True
     Comment: File /etc/hosts updated
     Started: 22:25:48.197580
    Duration: 11.568 ms
     Changes:   
              ----------
              diff:
                  ---  
                  +++  
                  @@ -1,2 +1,4 @@
                   127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
                   ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
                  +192.168.1.22  www.baidu.com
                  +192.168.2.22  www.roddypy.com
 
Summary
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1

在minion上查看hosts文件及备份情况

1
2
3
4
5
[root@localhost ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.22  www.baidu.com
192.168.2.22  www.roddypy.com
[root@localhost etc]# pwd
/var/cache/salt/minion/file_backup/etc        备份的默认路径,备份会以文件名+时间的方式进行备份
[root@localhost etc]# ll
总用量 8
-rw-r--r-- 1 root root 158 12月  8 22:25 hosts_Tue_Dec_08_22:25:48_208084_2015
-rw-r--r-- 1 root root 216 12月  8 22:29 hosts_Tue_Dec_08_22:29:26_774690_2015
[root@localhost etc]#

Ok,我们的最步就先了解到这边,当然还可以通过前面我们了解到的模块 salt的cp模块也可以完成文件传输。但是我们现在是基于states来传递的
好了,再来看看YAML,我们前面也多次提到了YAML。MD,我以前就是搞不懂这YAML是什么玩意,然后就写不来。后来发现,其实挺简单的。

什么是YAML?

维基上第一句话说的是“是一个可读性高,用来表达资料序列的格式。” OH ,其实就是一种格式,说白一点就像你写一个配置文件一样如"file:/etc/passwd"类似
YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递回缩写。这点和GNU一样

编写YAML

初期对于新手来说,这个最要命。不注意以下操作就要出错,本人以前是经常犯错。

  • 1.缩进要用2个空格,不能用tab,更不能tab和空格混用。以前写Python tab顺手了,就常犯错。

  • 2.YAML是用空格来表示分层结构的,如第一层,(前面2个空格) 第二层,(前面4个空格)

  • 3.YAML的冒号是用来表示一个K/V的字典的。

例: file: roddyname 就表示 {'file':'roddyname'}

还可以写成

file:
roddyname

4.YAML使用短横线表示列表。

例:

  • -user1
  • -user1
  • -user3

对应的表示就是['user1','user2','user3']
如果看到这种表达方式

username:

  • -user1
  • -user1
  • -user3

对应的表示就是{'username':['user1','user2','user3']}

我靠,好清晰,对了撒。这下子搞懂了,唉,以前不晓得杂个写。呵呵

什么是jinja?

尼玛,我就觉得这个名字有点日怪,以前读的时候扭捏了半天。这又是个什么鬼?
jinja是一种模板引擎,是基于Python的,相当于php 的 smarty。哦,基本上了解了。可以基于这个引擎提前做一些操作嘛

salt默认是用的yaml_jinja的渲染器。

工作流程:
  • 1.通过jinjia2模板引擎处理SLS
  • 2.调用YAML解析器
如何使用:

在salt中 ,files和templates都使用了file这个states模块。但是是通过template这个标识来指明是模板还是普通文件。
OK。看个他的样例

[root@localhost states]# salt '*' sys.state_doc file | more
        client1.roddypy.com:
            ----------
            file:
             
            Operations on regular files, special files, directories, and symlinks
            =====================================================================
             
            Salt States can aggressively manipulate files on a system. There are a number
            of ways in which files can be managed.
             
            Regular files can be enforced with the :mod:`file.managed
            ` state. This state downloads files from the salt
            master and places them on the target system. Managed files can be rendered as a
            jinja, mako, or wempy template, adding a dynamic component to file management.
            An example of :mod:`file.managed ` which makes use of
            the jinja templating system would look like this:
             
                /etc/http/conf/http.conf:
                  file.managed:
                - source: salt://apache/http.conf
                - user: root
                - group: root
                - mode: 644
                - template: jinja
                - defaults:                       指定变量
                    custom_var: "default value"
                    other_var: 123
                {% if grains['os'] == 'Ubuntu' %}     就是jinja的if判断方法
                - context:
                    custom_var: "override"
                {% endif %}
jinja的使用方法:
  • 1.在file模块sls文件中使用template :- template: jinja
  • 2.在模板文件里面使用变量{{变量名}}
  • 3.指定变量列表:

"- defaults:
SERVER:'192.168.1.2'
PORT: '22'
"

使用grains: {{grains['hostname']}}

使用模块: {{ salt'network.hw_addr' }}

使用pillar: {{ pillar['apache']['port'] }} 两边有空格

你可能感兴趣的:(saltstack-配置管理-yaml与jinja)