第四话 通过 Jinja2 模板以及 Grain 和 Pillar 扩展主机状态

目录

一、Jinja2 模板语言基础

1、Jinja2 变量

2、流程控制语句

二、Grain 和 Pillar 的概念及设置

1、Grain 的概念

2、Grain 相关的基本命令

3、设置 Grains 数据

3.1 命令行方式

3.2 grains_module 的方式设置

3.3 在 minion 端设置

3.4 删除自定义 Grains

4、Pillar 的概念

5、Pillar 相关的基本命令

5.1 列出对应 minion 上所有 Pillar 的详细信息

5.2 查询 minion 上某一具体 Grain 的值

6、设置 Pillar 数据

6.1 首先建立目录,然后为每个 minion 编写对应的 SLS 文件

6.2 建立入口文件top.sls

6.3 执行命令刷新 Pillar 数据

三、用 Jinja2 配合 Grain 和 Pillar 扩展 SLS 配置文件

1、扩展 apache.sls 配置文件

2、多系统 Vim 安装实例

3、Iptables 配置实例

4、通过 Pillar 扩展 SLS 配置

四、用 Jinja2 配合 Grains 和 Pillar 动态下发配置文件

1、一个简单模板下发实例

1.1 编辑状态文件:

1.2 编辑模板文件

1.3 测试模板文件下发

1.4 查看 syq-snakenx-02 上下发的配置文件

1.5 再加入部分 Jinja2 的逻辑控制功能

1.6 再次测试模板文件下发

1.7 查看 syq-snakenx-02 上下发的配置文件

2、实战 pptp vpn 服务部署

3、实战 sshd 动态白名单部署

4、根据不同操作系统设置内核参数

5、实战批量部署 Nginx 代理服务器


一、Jinja2 模板语言基础

如果遇到一些更复杂的情况,比如对不同操作系统安装软件,根据主机的 CPU 数量、内存等动态生成软件的配置文件等,这一切都需要 Jinja2 以及 Grain 和 Pillar 的辅助。

Jinja2 一个强大的 Python 模板引擎,可以使用代码动态生成内容创建文件内容,其在 Flask 和 Django 框架中的使用最为知名。

Jinja2 官方文档:http://docs.jinkan.org/docs/jinja2/templates.html

1、Jinja2 变量

Jinja2 模板包含变量和表达式:变量用{{}}包围,表达式用{%%}包围。

举个栗子:

vim var.sls

{% set var = 'hello world!' %}

 

test_var:

  cmd.run:

    - name: echo "var is {{ var }}"

运行查看 Jinja2 变量的输出:

# salt 'syq-snakenx-02.lehe.com' state.sls var

syq-snakenx-02.lehe.com:

----------

          ID: test_var

    Function: cmd.run

        Name: echo "var is hello world!"

      Result: True

     Comment: Command "echo "var is hello world!"" run

     Started: 17:40:24.947511

    Duration: 11.034 ms

     Changes:

              ----------

              pid:

                  19803

              retcode:

                  0

              stderr:

              stdout:

                  var is hello world!

 

Summary for syq-snakenx-02.lehe.com

------------

Succeeded: 1 (changed=1)

Failed:    0

------------

Total states run:     1

Total run time:  11.034 ms

2、流程控制语句

For

遍历列表中的每一项。例如,要显示一个由 users 变量提供的用户列表:

{% for user in users %}
 {{ user }}
{% endfor %}

变量字典:

{% for key, value in my_dict.iteritems() %}
  {{ key }}
  {{ value }}
{% endfor %}

与 Python 中不同,模板中的循环内不能有 bread 或 continue。但是可以在迭代中过滤序列来跳过项目。下面的例子中调过来所有影藏的用户:

{% for user in users if not user.hidden %}
 {{ user.username }}
{% endfor %}

if

Jinja2 中的 if 语句类似 Python 中的 if 语句。在最简单的形式中,可以测试一个变量是否未定义,为空或 false:

{% if usesrs %}
  {% for user in users %}
    {% user.username %}
  {% endfor %}
{% endif %}

像在 Python 中一样,用 elif 和 else 来构建多个分支。

{% if kenny.sick %}
  Kenny is sick.
{% elif kenny.dead %}
  You killen Kenny! You bastard!!!
{% else %}
  Kenny looks okay --- so far
{% endif %}

二、Grain 和 Pillar 的概念及设置

1、Grain 的概念

Grains是Saltstack最重要的组件之一,grains的作用是收集被控主机(minion)的基本信息,这些信息通常都是一些静态的数据,包括CPU、内核、操作系统、虚拟化等,在服务器端可以根据这些信息进行灵活定制,管理员可以利用这新信息对不同业务进行个性化配置。

2、Grain 相关的基本命令

master 端列出所有 minion 上的 Grains 项:

# salt 'syq-snakenx-02.lehe.com' grains.ls

syq-snakenx-02.lehe.com:

    - SSDs

    - biosreleasedate

    - biosversion

    - cpu_flags

    - cpu_model

    - cpuarch

    - disks

    - dns

    - domain

    - fqdn

    - fqdn_ip4

    - fqdn_ip6

    - gid

    - gpus

    - groupname

    - host

    - hwaddr_interfaces

    id

    - init

    - ip4_interfaces

    - ip6_interfaces

    - ip_interfaces

    - ipv4

    - ipv6

    - kernel

    - kernelrelease

    - locale_info

    - localhost

    - lsb_distrib_codename

    - lsb_distrib_id

    - lsb_distrib_release

    - machine_id

    - manufacturer

    - master

    - mdadm

    - mem_total

    - nodename

    - num_cpus

    - num_gpus

    - os

    - os_family

    - osarch

    - oscodename

    - osfinger

    - osfullname

    - osmajorrelease

    - osrelease

    - osrelease_info

    - path

    - pid

    - productname

    ps

    - pythonexecutable

    - pythonpath

    - pythonversion

    - saltpath

    - saltversion

    - saltversioninfo

    - selinux

    - serialnumber

    - server_id

    - shell

    - uid

    - username

    - uuid

    - virtual

    - zmqversion

查询 minion 上某一具体 Grain 的值:

master 端

# salt 'syq-snakenx-02.lehe.com' grains.item cpu_model

syq-snakenx-02.lehe.com:

    ----------

    cpu_model:

        Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz

3、设置 Grains 数据

Salt提供了很多默认的 Grains 数据,基本可以满足大多数需求,但是有些场景还是需要用户自定义 Grains 数据,以下是几种常见设置方式:

3.1 命令行方式

单个值设置

# salt 'syq-snakenx-02.lehe.com' grains.setval my_grain bar

syq-snakenx-02.lehe.com:

    ----------

    my_grain:

        bar

多个值设置

# salt 'syq-snakenx-02.lehe.com' grains.setvals "{'key01':'val01','key02':'val02'}"

syq-snakenx-02.lehe.com:

    ----------

    key01:

        val01

    key02:

        val02

列表结构设置

# salt 'syq-snakenx-02.lehe.com' grains.setval my_grain_dict '["one","two","three"]'

syq-snakenx-02.lehe.com:

    ----------

    my_grain_dict:

        - one

        - two

        - three

设置成功后通过下面的命令可进行查询:

# salt 'syq-snakenx-02.lehe.com' grains.item my_grain
syq-snakenx-02.lehe.com:
    ----------
    my_grain:
        bar
# salt 'syq-snakenx-02.lehe.com' grains.item key01
syq-snakenx-02.lehe.com:
    ----------
    key01:
        val01
# salt 'syq-snakenx-02.lehe.com' grains.item key02
syq-snakenx-02.lehe.com:
    ----------
    key02:
        val02
# salt 'syq-snakenx-02.lehe.com' grains.item my_grain_dict
syq-snakenx-02.lehe.com:
    ----------
    my_grain_dict:
        - one
        - two
        - three

查看对应的 minion 的 /etc/salt/grains 可以发现已经写入的 Grains 数据:

# salt 'syq-snakenx-02.lehe.com' cmd.run 'cat /etc/salt/grains'
syq-snakenx-02.lehe.com:
    key01: val01
    key02: val02
    my_grain: bar
    my_grain_dict:
    - one
    - two
    - three

3.2 grains_module 的方式设置

首先在 master 端上建立模块对应的目录:

# mkdir -pv /srv/salt/_grains
mkdir: created directory `/srv/salt/_grains'

然后写入一个 简单的模块,和之前自定义模块的编写方法一下:

vim /srv/salt/_grains/my_grain_mod.py

#!/usr/bin/env python

 

import time

def now():

  grains = {}

  grains['now'] = time.time()

  return grains

然后同步模块到 minion:

# salt 'syq-snakenx-02.lehe.com' saltutil.sync_all
syq-snakenx-02.lehe.com:
    ----------
    beacons:
    engines:
    grains:
        - grains.my_grain_mod
    log_handlers:
    modules:
    output:
    proxymodules:
    renderers:
    returners:
    sdb:
    states:
    utils:

重载一次模块:

# salt 'syq-snakenx-02.lehe.com' sys.reload_modules
syq-snakenx-02.lehe.com:
    True

查看新设置的 Grains:

# salt 'syq-snakenx-02.lehe.com' grains.item now
syq-snakenx-02.lehe.com:
    ----------
    now:
        1560257343.479697

3.3 在 minion 端设置

vim /etc/salt/minion.d/grain.conf

grains:

  new_grain: bar

  new_grain_dict:

    - one

    - two

    - three

然后重启 salt-minion 加载新配置文件:

minion 端

# service salt-minion restart

Stopping salt-minion daemon:                               [  OK  ]

Starting salt-minion daemon:                               [  OK  ]

查看 Grains:

master 端

# salt 'syq-snakenx-02.lehe.com' grains.item new_grain

syq-snakenx-02.lehe.com:

    ----------

    new_grain:

        bar

# salt 'syq-snakenx-02.lehe.com' grains.item new_grain_dict

syq-snakenx-02.lehe.com:

    ----------

    new_grain_dict:

        - one

        - two

        - three

3.4 删除自定义 Grains

通过 grains.setval 设置的 Grain 可以直接通过下面的命令删除:

# salt 'syq-snakenx-02.lehe.com' cmd.run 'cat /etc/salt/grains'
syq-snakenx-02.lehe.com:
    key01: val01
    key02: val02
    my_grain: bar
    my_grain_dict:
    - one
    - two
    - three
# salt 'syq-snakenx-02.lehe.com' grains.delval my_grain
syq-snakenx-02.lehe.com:
    None
# salt 'syq-snakenx-02.lehe.com' cmd.run 'cat /etc/salt/grains'
syq-snakenx-02.lehe.com:
    key01: val01
    key02: val02
    my_grain: null
    my_grain_dict:
    - one
    - two
    - three
# salt 'syq-snakenx-02.lehe.com' grains.delval key01
syq-snakenx-02.lehe.com:
    None
# salt 'syq-snakenx-02.lehe.com' cmd.run 'cat /etc/salt/grains'
syq-snakenx-02.lehe.com:
    key01: null
    key02: val02
    my_grain: null
    my_grain_dict:
    - one
    - two
    - three
# salt 'syq-snakenx-02.lehe.com' grains.delval key02
syq-snakenx-02.lehe.com:
    None
# salt 'syq-snakenx-02.lehe.com' cmd.run 'cat /etc/salt/grains'
syq-snakenx-02.lehe.com:
    key01: null
    key02: null
    my_grain: null
    my_grain_dict:
    - one
    - two
    - three
# salt 'syq-snakenx-02.lehe.com' grains.delval my_grain_dict
syq-snakenx-02.lehe.com:
    None
# salt 'syq-snakenx-02.lehe.com' cmd.run 'cat /etc/salt/grains'
syq-snakenx-02.lehe.com:
    key01: null
    key02: null
    my_grain: null
    my_grain_dict: null

其它方式设置的 Grains 可以通过与添加过程相反的操作来删除。

4、Pillar 的概念

Grains 很强大,但缺点是这些数据相对来说是静态数据。

Pillar 数据存储在 master 端上,指定的 minion 只能查看自己的 Pillar 数据,其它的 minion 看不到任何 Pillar 数据,这一点与状态文件正好相反。所有通过认证的 minion 都可以获取状态文件,但是每个 minion 却都有自己的一套 Pillar 数据,而且每台 minion 的 Pillar 都进行了加密,所以很适合用于敏感数据。

5、Pillar 相关的基本命令

5.1 列出对应 minion 上所有 Pillar 的详细信息

# salt 'syq-snakenx-02.lehe.com' pillar.item
syq-snakenx-02.lehe.com:
    ----------

5.2 查询 minion 上某一具体 Grain 的值

# salt 'syq-snakenx-02.lehe.com' pillar.item foo
syq-snakenx-02.lehe.com:
    ----------
    foo:

6、设置 Pillar 数据

6.1 首先建立目录,然后为每个 minion 编写对应的 SLS 文件

master 端

# mkdir -pv /srv/pillar/

mkdir: created directory `/srv/pillar/'

# cd /srv/pillar/

# vim minion_one_key.sls

  private_key: minion_one_key

6.2 建立入口文件top.sls

master 端

# vim top.sls

base:

  'syq-snakenx-02.lehe.com':

    - minion_one_key

6.3 执行命令刷新 Pillar 数据

master 端

# salt 'syq-snakenx-02.lehe.com' saltutil.refresh_pillar

syq-snakenx-02.lehe.com:

    True

6.4 查看所有 Pillar 数据

master 端

# salt 'syq-snakenx-02.lehe.com' pillar.item

syq-snakenx-02.lehe.com:

    ----------

# salt 'syq-snakenx-02.lehe.com' pillar.item private_key

syq-snakenx-02.lehe.com:

    ----------

    private_key:

        minion_one_key

可以看到不同的 minion 获取了自己私有的字符串,这就完成了 Pillar 下发敏感数据的过程,通信加密,切 minion 之间互相不可见。

三、用 Jinja2 配合 Grain 和 Pillar 扩展 SLS 配置文件

1、扩展 apache.sls 配置文件

把 Jinja2 以及 Grain 和 Pillar 应用到状态文件 SLS 上面,让状态控制拥有逻辑能力,可以根据不同的情况作出动态的配置。

第三话中用 apache.sls 状态文件部署 Apache 软件,apache.sls 文件如下:

(CentOS)vim apache.sls

install_httpd:

  pkg.installed:

    - name: httpd

上面的 SLS 文件仅适用于 CentOS 系统下安装 apache,更严格一点说是适合用于 Redhat 系的 Linux 系统。那么如果 Ubuntu 系统呢?难道需要再写一个 SLS 文件?

(Ubuntu)vim apache.sls

install_apache:

  pkg.installed:

    - name: apache2

上面的这种情况抽象出来就是根据 minion 的不同属性,SLS 文件需要有逻辑判断来进行不同操作。这种需求恰好有 Jinja2 和 Grains 配合可以完美解决,因为 Grains 是描述 minion 固有属性的数据,而 Jinja2 可以做流程和逻辑控制,解决方案如下:

vim apache.sls

install_apache:

  pkg.installed:

{% if grains['os_family'] == 'Debian' %}

    - name: apache2

{% elif grains['os_family'] == 'RedHat' %}

    - name: httpd

{% endif %}

测试:

# salt 'ninion-one,minion-two' state.sls apache

2、多系统 Vim 安装实例

3、Iptables 配置实例

4、通过 Pillar 扩展 SLS 配置

四、用 Jinja2 配合 Grains 和 Pillar 动态下发配置文件

1、一个简单模板下发实例

1.1 编辑状态文件:

# vim template.sls

template_test:

  file.managed:

    source: salt://test.j2

    - name: /tmp/test.conf

    - user: root

    - group: root

    - mode: 644

    - template: jinja

1.2 编辑模板文件

vim test.j2

cpu_num = {{ grains['num_cpus'] }}

mem_total = {{ grains['mem_total'] }}

hostname = {{ grains['host'] }}

user = {{ pillar['user'][0] }}

1.3 测试模板文件下发

master 端

# salt 'syq-snakenx-02.lehe.com' state.sls template

syq-snakenx-02.lehe.com:

----------

          ID: template_test

    Function: file.managed

        Name: /tmp/test.conf

      Result: True

     Comment: File /tmp/test.conf updated

     Started: 12:57:51.121229

    Duration: 108.927 ms

     Changes:

              ----------

              diff:

                  New file

              mode:

                  0644

 

Summary for syq-snakenx-02.lehe.com

------------

Succeeded: 1 (changed=1)

Failed:    0

------------

Total states run:     1

Total run time: 108.927 ms

1.4 查看 syq-snakenx-02 上下发的配置文件

master 端

# salt 'syq-snakenx-02.lehe.com' cmd.run 'cat /tmp/test.conf'

syq-snakenx-02.lehe.com:

    cpu_num = 24

    mem_total = 64258

    hostname = syq-snakenx-02

    private_key = minion_one_key

配置文件内容已经被替换成了对应的值。

1.5 再加入部分 Jinja2 的逻辑控制功能

vim test.j2

{% if grains['num_cpus'] >= 8 %}

cpu_num = {{ grains['num_cpus'] }}

{% endif %}

{% if grains['mem_total'] <= 512 %}

mem_total <= 512

{% elif grains['mem_total'] >= 1024 %}

mem_total >= 1024

{% endif %}

hostname = {{ grains['host'] }}

private_key = {{ pillar['private_key'] }}

1.6 再次测试模板文件下发

master 端

# salt 'syq-snakenx-02.lehe.com' state.sls template

syq-snakenx-02.lehe.com:

----------

          ID: template_test

    Function: file.managed

        Name: /tmp/test.conf

      Result: True

     Comment: File /tmp/test.conf updated

     Started: 14:54:16.884999

    Duration: 114.474 ms

     Changes:

              ----------

              diff:

                  ---

                  +++

                  @@ -1,4 +1,8 @@

                  +

                   cpu_num = 24

                  -mem_total = 64258

                  +

                  +

                  +mem_total >= 1024

                  +

                   hostname = syq-snakenx-02

                   private_key = minion_one_key

 

Summary for syq-snakenx-02.lehe.com

------------

Succeeded: 1 (changed=1)

Failed:    0

------------

Total states run:     1

Total run time: 114.474 ms

1.7 查看 syq-snakenx-02 上下发的配置文件

master 端

# salt 'syq-snakenx-02.lehe.com' cmd.run 'cat /tmp/test.conf'

syq-snakenx-02.lehe.com:

 

    cpu_num = 24

 

 

    mem_total >= 1024

 

    hostname = syq-snakenx-02

    private_key = minion_one_key

2、实战 pptp vpn 服务部署

3、实战 sshd 动态白名单部署

4、根据不同操作系统设置内核参数

5、实战批量部署 Nginx 代理服务器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值