这个攻略假设读者已经读过了基本的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
默认情况下,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
/srv/pillar/top.sls base: '*': - data
/srv/pillar/data.sls info: some data
salt '*' pillar.items
info将会出现在返回的pillar数据中。
更复杂一些的数据
Pillar文件是sls文件,和states一样,但是不同于states,它们不需要定义公式,数据可以任意的,这个例子就创建了一个带有UID的用户:
/srv/pillar/users/init.sls users: thatch: 1000 shouse: 1001 utahdave: 1002 redbeard: 1003
/srv/pillar/top.sls: base: '*': - data - users
/srv/salt/users/init.sls {% for user, uid in pillar.get('users', {}).items() %} {{user}}: user.present: - uid: {{uid}} {% endfor %}
通过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 %}
/srv/pillar/top.sls base: '*': - data - users - pkg
/srv/salt/apache/init.sls apache: pkg.installed: - name: {{ pillar['pkgs']['apache'] }}
/srv/salt/apache/init.sls apache: pkg.installed: - name: {{ salt['pillar.get']('pkgs:apache', '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
/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 %}
关于Pillar更多
pillar数据是在Salt master上生成的并被安全地分布到minions上。Salt当定义pillar的时候,不必限制在sls文件,也可以从外部资源获得数据。这对于架构信息存储于其它地方的情况下非常有用。