前面我们研究了远程执行现在我们就来看看配置管理方面的东西,以前研究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'] }} 两边有空格