坏气十足 发表于 2015-11-26 11:16:33

SaltStack Pillar攻略

  这个攻略假设读者已经读过了基本的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文件,也可以从外部资源获得数据。这对于架构信息存储于其它地方的情况下非常有用。
  


  
页: [1]
查看完整版本: SaltStack Pillar攻略