Pillar Walkthrough - Pillar 实战演练
- Setting Up Pillar-设置Pillar
- Parameterizing States With Pillar-使用Pillar对States进行参数化配置
- Pillar Makes Simple States Grow Easily-Pillar让简单的States变得更灵活、强大
- Setting Pillar Data on the Command Line-在命令行中设置Pillar数据
- More On Pillar-Pillar的更多知识
- Minion Config in Pillar-使用Pillar定义Minion配置文件
注:本演练假定读者已经完成了最初的Salt演练。
关于Pillar的演练,大家也可以参考这份技术资料:Pillar Walkthrough - Pillar 实战演练
Pillar是在Salt Master上定义的树状数据结构,并传递给minions使用。 它们允许将机密的或有针对性的数据安全地发送给相关的minions。
注:Grains和Pillar有时会混淆,只需要记住这一点,Grains是关于一个minion的信息,是一份由minion负责储存或生成的数据。 这就是为什么在Grains中可以找到OS和CPU类型等信息的原因。 Pillar是在Salt Master上存储或生成的关于minion或许多minions的信息。
Pillar 的典型使用场景有:
- 高度敏感的数据: 通过pillar传输的信息保证仅提供给目标对象,使Pillar适合管理安全信息,如加密密钥和密码。
- Minion 配置: Minion模块,例如执行模块、状态和returners之类的通常可以通过存储在pillar中的数据来配置。
- 使用变量: 需要分配给特定minions或minions组的变量可以在pillar中定义,然后在sls公式和模板文件中访问。
- 任意数据: Pillar可以包含字典格式的任何基本数据结构,因此可以定义一组键/值存储,然后在sls公式中轻松迭代它。
因此,Pillar是使用Salt时最重要的系统之一。 本演练旨在让Pillar在几分钟内启动并运行,然后深入了解Pillar的功能以及可用的数据存放位置。
SETTING UP PILLAR
默认情况下,pillar已经在Salt中运行。 查看minion的pillar数据的方法是:
salt '*' pillar.items
注:在版本0.16.2之前,此函数名为
pillar.data
。 此功能名称仍支持向后兼容性。
默认情况下,master配置文件的内容不会加载到minions的pillar中。 这可以通过pillar_opts
设置,该选项默认为False
。
Master配置文件的内容可用于配置minion的pillar文件。 这使得对服务和系统的全局配置变得非常容易,但请注意,如果在master配置文件中存储了敏感数据,则可能不适合这样做。 要使master配置文件内容可用于minion的pillar文件,请在minion配置文件中将pillar_opts
设置为True
。
与state状态树类似,pillar由sls文件组成,并具有top file文件。 Pillar文件的默认存放位置是/srv/pillar。
注:可以通过master配置文件中的
pillar_roots
选项配置pillar文件的位置。 但它不能位于state状态树或file_roots
的子目录中。 如果pillar位于file_roots
之下,任何pillar目标都会被minions跳过。
现在开始配置pillar,确认/srv/pillar
目录已经创建好了:
mkdir /srv/pillar
创建一个简单的top file文件,其格式与state状态使用的top file文件相同:
/srv/pillar/top.sls
:
base:
'*':
- data
在这个top.sls文件中将data.sls文件与所有minions进行了关联。
现在需要填充/srv/pillar/data.sls
文件:
/srv/pillar/data.sls
:
info: some data
为了确保minions拥有新的pillar数据,向他们发出命令,要求他们从master那里获取并刷新他们的pillar数据:
salt '*' saltutil.refresh_pillar
现在,在minions侧就已经有了更新后的pillar数据了,可以通过下面的方法访问到:
salt '*' pillar.items
我们定义的key info
现在应该出现在返回的pillar数据中了。
MORE COMPLEX DATA
与state状态不同的是,pillar文件不需要定义公式。 下面示例使用UID来设置用户数据:
/srv/pillar/users/init.sls
:
users:
thatch: 1000
shouse: 1001
utahdave: 1002
redbeard: 1003
注:在state状态中和在pillar中存在相同的配置目录,因此可以使用top file文件中的
users
引用users/init.sls
文件。
需要更新top file文件以包含此sls文件:
/srv/pillar/top.sls
:
base:
'*':
- data
- users
现在这些数据将供给minions使用。 要在state状态中引用pillar数据,可以使用Jinja模板和变量:
/srv/salt/users/init.sls
:
{% for user, uid in pillar.get('users', {}).items() %}
{{user}}:
user.present:
- uid: {{uid}}
{% endfor %}
这是一种建议的,在pillar中安全地定义用户数据,然后将用户数据应用于sls文件中的使用方法。
PARAMETERIZING STATES WITH PILLAR
可以在state状态文件中访问pillar数据,以定制每个minion的行为。适用于每个minion的所有pillar(和grain)数据,在运行之前通过模板替换为最终可执行的state状态文件。比较典型的用途包括设置适合minion的配置目录和跳过不适用的states状态。
一个简单的示例是为不同的的Linux发行版设置pillar名称的映射:
/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 %}
我们看到,在定义pillar时,我们可以通过grains变量为minions动态定义pillar数据。
需要把pkg
sls添加到 top file 中:
/srv/pillar/top.sls
:
base:
'*':
- data
- users
- pkg
现在,minions在pillar内部根据各个操作系统的属性信息自动映射为正确的值,因此可以安全地在sls文件中引用这些pillar数据参数了:
/srv/salt/apache/init.sls
:
apache:
pkg.installed:
- name: {{ pillar['pkgs']['apache'] }}
或者,如果没有可用的pillar数据,也可以指定一个默认值,像下面这样使用:
注:此示例中使用的函数
pillar.get
已添加到版本0.14.0中的Salt
/srv/salt/apache/init.sls
:
apache:
pkg.installed:
- name: {{ salt['pillar.get']('pkgs:apache', 'httpd') }}
在上面的例子中,如果pillar数值 pillar['pkgs']['apache']
并没有在minion的pillar中做配置,那么将会使用默认的值httpd
。
注:在各种salt封装之下,pillar实际上只是一个Python字典,因此可以使用Python dict方法,如
get
和items
。
PILLAR MAKES SIMPLE STATES GROW EASILY
Pillar的设计目标之一是使简单的sls公式容易地变成更灵活的公式,而不需要重构或使状态复杂化。
一个简单的公式:
/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
可以使用pillar将这个公式变幻成更灵活、参数化的公式:
/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
现在可以继续通过pillar更改vimrc源文件的位置:
/srv/pillar/edit/vim.sls
:
{% if grains['id'].startswith('dev') %}
vimrc: salt://edit/dev_vimrc
{% elif grains['id'].startswith('qa') %}
vimrc: salt://edit/qa_vimrc
{% else %}
vimrc: salt://edit/vimrc
{% endif %}
确保是将正确的vimrc发送给了正确的minions。
Pillar top file文件中必须包含对新sls pillar文件的引用:
/srv/pillar/top.sls
:
base:
'*':
- pkg
- edit.vim
SETTING PILLAR DATA ON THE COMMAND LINE
运行state.apply <salt.modules.state.apply_()
时,可以在命令行上设置pillar数据,如下所示:
salt '*' state.apply pillar='{"foo": "bar"}'
salt '*' state.apply my_sls_file pillar='{"hello": "world"}'
嵌套的pillar值也可以通过命令行设置:
salt '*' state.sls my_sls_file pillar='{"foo": {"bar": "baz"}}'
可以通过命令行pillar数据传递列表,如下所示:
salt '*' state.sls my_sls_file pillar='{"some_list": ["foo", "bar", "baz"]}'
注:如果在minion上已存在的一个键值,同时又在命令行上传递了一个相同的键,则传入的键值将覆盖该键的整个值,而不是进行合并。
下面的示例将在先前指定的列表中将vim的值与telnet交换,请注意嵌套的pillar dict:
salt '*' state.apply edit.vim pillar='{"pkgs": {"vim": "telnet"}}'
这将尝试在你的minion上安装telnet,在你测试时可以放心地卸载软件包或用其他任何东西替换telnet值进行测试。
注意:当通过命令行中的pillar发送敏感数据时,所有minions都将收到包含该数据的发布,并且不会限制为目标minions。 在某些情况下,这可能意味着存在安全问题。
MORE ON PILLAR
Pillar数据在Salt master上生成并安全地分发给minions。 在定义pillar时,Salt不限于仅能使用pillar sls文件,还可以从外部源检索数据。 当有关基础架构的信息存储在单独的位置时,这可能会很有用。
有关pillar和外部pillar接口的参考信息可以在Salt文档中找到:Pillar
MINION CONFIG IN PILLAR
可以通过pillar设置Minion的配置选项。 不过你要修改的任何minion配置选项都应位于pillar的第一级,与配置文件中的选项相同。 例如,要配置MySQL Salt执行模块使用的MySQL root密码:
mysql.pass: hardtoguesspassword
当你需要动态变更配置信息时,这非常方便。 例如,如果你这样做,有一个鸡和鸡蛋问题:
mysql-admin-passwd:
mysql_user.present:
- name: root
- password: somepasswd
mydb:
mysql_db.present
第二个状态将失败,因为你更改了mysql root密码并且minion没有注意到它。 这时,通过在pillar中设置mysql.pass
将有助于解决问题。 但总是需要首先更改mysql root管理员密码。
这对于需要凭据来应用状态更改的任何模块都非常有用:mysql,keystone等。