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文件,也可以从外部资源获得数据。这对于架构信息存储于其它地方的情况下非常有用。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值