SaltStack Pillar Walkthrough - 实战演练

Pillar Walkthrough - Pillar 实战演练

注:本演练假定读者已经完成了最初的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方法,如getitems

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等。

猜你喜欢

转载自blog.csdn.net/watermelonbig/article/details/90990909