|
这个攻略假设读者已经读过了基本的SaltStack攻略
Salt中的pillar接口是Salt开发中最重要的接口之一。Pillar是用来产生特定于minions的任意数据的接口。pillar中产生的数据几乎可以在Salt的任何组件中使用,用途广泛:
高度敏感的数据:
通过pillar传输的数据会保证只向选定的minions展现,这使得pillar可以作为Salt中管理安全信息的引擎,比如加密的key和密码。
Minion配置:
minion模块,像是execution模块,states,和returner可以通过存储在pillar中的数据配置。
Variables:
特定minions或者groups需要变量可以定义在pillar中,以后可以在sls公式或者模板文件中使用。
任意的数据:
Pillar可以包含任何基础数据结构,像是一个列表的值,键值存储结构都可以定义使得可以在sls公式中简单的遍历一组值。
Pillar是使用Salt时最重要的系统之一,本攻略的目的就是在几分钟内创建并运行一个简单的pillar,然后去深入到pillar的功能和指明pillar的数据在哪里是可用的。
创建一个Pillar
pillar在Salt中已经是默认运行的。minion中的pillars可以通过以下的命令来查看:
salt "*" pillar.items
注意,在0.16.2之前的版本中,这个函数的名字是pillar.data。为了与以前版本兼容,这个函数名仍然是可用的。
默认情况下,master配置文件中的内容是被载入到每个minion的pillar中的。这使得master的配置文件可以作为所有minions的全局配置。
pillar和state tree的建立方式相似,由sls文件组成,并有一个top文件,这和state tree类似。pillar默认的路径是:/srv/pillar。
注意,pillar的位置可以通过master配置见中的pillar_roots配置项来自定义。
要来是建立pillar的话,我们需要/srv/pillar目录已经存在:
mkdir /srv/pillar
现在,一个简单的top文件,和states的top文件一样的格式,需要被创建:
/srv/pillar/top.sls
base:
'*':
- data
这个top文件将所有的minions和data.sls关联起来。现在/srv/pillar/data.sls文件需要被填入一些内容:
/srv/pillar/data.sls
info: some data
现在这个文件已经保存了,minions的pillars将会被更新:
salt '*' pillar.items
info将会出现在返回的pillar数据中。
更复杂一些的数据
Pillar文件是sls文件,和states一样,但是不同于states,它们不需要定义公式,数据可以任意的,这个例子就创建了一个带有UID的用户:
/srv/pillar/users/init.sls
users:
thatch: 1000
shouse: 1001
utahdave: 1002
redbeard: 1003
注意,sates中的目录查询在pillar中也同样适用,所以users/init.sls这个文件可以通过在top文件中指定users来获得引用。
/srv/pillar/top.sls:
base:
'*':
- data
- users
现在,数据对于minions就是可用的了。要在state中使用pillar数据,值需要通过Jinja来访问pillar即可:
/srv/salt/users/init.sls
{% for user, uid in pillar.get('users', {}).items() %}
{{user}}:
user.present:
- uid: {{uid}}
{% endfor %}
这种方法允许用户在pillar中安全地定义数据,然后在sls文件中应用这些数据。
通过pillar来参数化states
pillar中最强大的抽象之一就是将states参数化的能力。不是通过在state上下文中定义宏或者函数,整棵state树都可以自由地根据minion的pillar来参数化。
这种方法使得Salt在拥有了很大灵活性的同时,仍然看上去非常直观。这也意味着,在state树中简单的sls公式可以在不重构state树的前提下直接参数化。
一个非常简单的例子:根据不同的Linux发行版本,映射到不同的包名:
/srv/pillar/pkg/init.sls
pkgs:
{% if grains['os_family'] == 'RedHat' %}
apache: httpd
vim: vim-enhanced
{% elif grains['os_family'] == 'Debian' %}
apache: apache2
vim: vim
{% elif grains['os'] == 'Arch' %}
apache: apache
vim: vim
{% endif %}
新的pkg sls需要更新到top文件中:
/srv/pillar/top.sls
base:
'*':
- data
- users
- pkg
现在minions在pillar中,会自动根据操作系统来确定值,所以sls文件可以被安全地参数化:
/srv/salt/apache/init.sls
apache:
pkg.installed:
- name: {{ pillar['pkgs']['apache'] }}
或者,如果没有找到指定的pillar,也可以使用一个默认值来代替:
/srv/salt/apache/init.sls
apache:
pkg.installed:
- name: {{ salt['pillar.get']('pkgs:apache', 'httpd') }}
在上面的例子中,如果pillar['pkgs']['apache']的pillar值没有指定,那么默认的httpd就会被使用。
Pillar使简单的state可以简单扩展
pillar的设计目标之一就是简单地扩展sls公式到更加灵活的公式,而不会重构或者使state变复杂。
一个简答的公式:
/srv/salt/edit/vim.sls
vim:
pkg:
- installed
/etc/vimrc:
file.managed:
- source: salt://edit/vimrc
- mode: 644
- user: root
- group: root
- require:
- pkg: vim
可以简单地转换成一个强大的、参数化的公式:
/srv/salt/edit/vim.sls
vim:
pkg:
- installed
- name: {{ pillar['pkgs']['vim'] }}
/etc/vimrc:
file.managed:
- source: {{ pillar['vimrc'] }}
- mode: 644
- user: root
- group: root
- require:
- pkg: vim
这是vimrc的src地址现在就可以通过pillar来改变了:
/srv/pillar/edit/vim.sls
{% if grain['id'].startswith('dev') %}
vimrc: salt://edit/dev_vimrc
{% elif grain['id'].startswith('qa') %}
vimrc: salt://edit/qa_vimrc
{% else %}
vimrc: salt://edit/vimrc
{% endif %}
确认正确的vimrc被发送到正确的minion上。
关于Pillar更多
pillar数据是在Salt master上生成的并被安全地分布到minions上。Salt当定义pillar的时候,不必限制在sls文件,也可以从外部资源获得数据。这对于架构信息存储于其它地方的情况下非常有用。
|
|
|
|
|
|
|