SaltStack配置管理(5) – JINJA

salt引入了Jinja2模板引擎,可用于salt state文件,salt pillar文件和其它由salt管理的文件。
salt允许你使用Jinja访问minion配置值,grains和salt pillar数据,和调用salt执行模块。这些是除了Jinja提供的标准控制结构和Python数据类型之外的功能。

条件语句

Jinja最常用的功能是在salt pillar文件中插入控制声明语句。
由于许多发行版本有不同的包名称,你可以使用os grain来设置平台特定的路径,软件包名称和其它值。
例如:

  1. {% if grains[‘os_family’] == ‘RedHat’ %}
  2. apache: httpd
  3. git: git
  4. {% elif grains[‘os_family’] == ‘Debian’ %}
  5. apache: apache2
  6. git: git-core
  7. {% endif %}

如你所见,salt grains跟salt pillar的数据字典都是字典。这个示例检查salt grain值来设置操作系统特定的salt pillar键值。
保存上面的代码到saltstack/pillar/common.sls文件,然后运行如下命令来刷新和列出每一个minions的salt pillar值:

  1. salt ‘*’ saltutil.refresh_pillar
  2. salt ‘*’ pillar.items

设置这些值后,当应用如下salt state:

  1. install apache:
  2.   pkg.installed:
  3.     – name: {{ pillar[‘apache’] }}

httpd软件包安装在RedHat,apache2安装在Debian系统。

循环语句

在salt state中创建多个用户和目录使用循环语句会很方便。

  1. {% for usr in [‘moe’,’larry’,’curly’] %}
  2. {{ usr }}:
  3.   user.present
  4. {% endfor %}
  1. {% for DIR in [‘/dir1′,’/dir2′,’/dir3’] %}
  2. {{ DIR }}:
  3.   file.directory:
  4.     – user: root
  5.     – group: root
  6.     – mode: 774
  7. {% endfor %}

一般来说,你应该努力保持你的salt state足够简单。如果你发现你必须编写复杂的Jinja才能实现功能,你应该考虑把一个任务分割为多个salt state文件,或者编写一个自定义的salt执行模块。

使用salt获取数据

你可以在Jinja中调用salt执行函数来实时获取数据。

  1. {{ salt.cmd.run(‘whoami’) }}