zoukankan      html  css  js  c++  java
  • Saltstack_使用指南12_配置管理-jinja模板

    1. 说明

    下文的案例是根据上一篇文章进行的修改。因此请优先读取上一章博文内容《Saltstack_使用指南11_配置管理-状态之间依赖关系

    2. 主机规划

    salt 版本

    1 [root@salt100 ~]# salt --version
    2 salt 2018.3.3 (Oxygen)
    3 [root@salt100 ~]# salt-minion --version
    4 salt-minion 2018.3.3 (Oxygen)

    salt jinja 文档

    https://docs.saltstack.com/en/latest/topics/jinja/index.html

    Jinja2 文档

    1 http://docs.jinkan.org/docs/jinja2/    
    2 http://docs.jinkan.org/docs/jinja2/templates.html

    注意事项

    修改了master或者minion的配置文件,那么必须重启对应的服务。

     

    3. jinja 用法

    1 # 注意有空格
    2 这里有两种分隔符: {% ... %} 和 {{ ... }} 。前者用于执行诸如 for 循环 或赋值的语句,后者把表达式的结果打印到模板上。
    3 {# ... #} 为注释语法

    jinja 在 状态中的使用

     1 3步走:
     2     1、告诉File模块,你要使用jinja
     3         - template: jinja
     4     2、列出参数列表
     5         - defaults:
     6             HttpPort: 88
     7     3、模板引用
     8         {{ HttpPort }}
     9 
    10 模板里面支持:salt 远程执行、grains 和 pillar 进行赋值

    4. 案例

    对上一章案例内容进行改造。

    添加 jinja 信息。

    添加了 jinja 的好处:

    1、  可以把 mariadb.sls 也规整到 init.sls;

    2、  这样就是一个 SLS 文件对外,而不是多个 SLS;

    3、  在执行 SLS 的时候,直接整体/分批执行,而不是选定某个或某些 minion 执行;不需要指定 minion 目标,减少人为出错的可能性;

    4、  后期维护方便

    4.1. 部署架构

    4.2. 本章涉及的 pillar 的信息

    可参见:《Saltstack_使用指南05_数据系统-Pillar

     1 [root@salt100 pillar]# pwd
     2 /srv/pillar
     3 [root@salt100 pillar]# cat top.sls 
     4 base:
     5   '*':
     6     - web_pillar.service_appoint
     7 
     8 # 下面的跟本章节无关,可以不管
     9   # 使用通配符
    10   'salt0*':
    11     - web_pillar.apache
    12     - web_pillar.user # 引用
    13   # 指定具体minion
    14   'salt03':
    15     - web_pillar.apache
    16     - web_pillar.user # 引用
    17 [root@salt100 pillar]# cat web_pillar/service_appoint.sls  # pillar 的 SLS
    18 {% if (grains['ip4_interfaces']['eth0'][0] == '172.16.1.11' and grains['host'] == 'salt01') 
    19    or (grains['ip4_interfaces']['eth0'][0] == '172.16.1.12' and grains['host'] == 'salt02')
    20    or (grains['ip4_interfaces']['eth0'][0] == '172.16.1.13' and grains['host'] == 'salt03')
    21 %}
    22 # 注释信息 需要顶格书写
    23 service_appoint: www
    24 {% elif grains['ip4_interfaces']['eth0'][0] == '172.16.1.100' %}
    25 service_appoint: mariadb
    26 {% endif %}

    使 pillar 生效

     1 [root@salt100 pillar]# salt '*' saltutil.refresh_pillar  # 刷新
     2 [root@salt100 pillar]# salt '*' pillar.item service_appoint  # 查看 pillar 中 service_appoint 的信息
     3 salt03:
     4     ----------
     5     service_appoint:
     6         www
     7 salt02:
     8     ----------
     9     service_appoint:
    10         www
    11 salt100:
    12     ----------
    13     service_appoint:
    14         mariadb
    15 salt01:
    16     ----------
    17     service_appoint:
    18         www

    4.3. 配置文件 httpd.conf 修改

     1 [root@salt100 file]# pwd
     2 /srv/salt/lamp2/file
     3 [root@salt100 file]# vim httpd.conf
     4 # Listen 80
     5 # 下面的是本次修改的部分 ★★★★★
     6 Listen {{ HttpPort }}
     7 ………………
     8 # If your host doesn't have a registered DNS name, enter its IP address here.
     9 #
    10 #ServerName www.example.com:80
    11 # 下面的是本次修改的部分 ★★★★★
    12 # 格式  ServerName 本机内网IP:Port
    13 # 这样的话,在 apache.sls 文件中就不用写规则获取 minion的内网IP了,
    14 # 因为在状态执行的时候,就会根据下文的 grains 规则得到对应 minion 的内网IP
    15 # ServerName {{ grains['ip4_interfaces']['eth0'][0] }}:{{ HttpPort }}
    16 
    17 # 这里是一个变量,如此的话,在 apache.sls 中需要写规则获取 minion 的内网IP
    18 # 优先这种写法,后期改变时,直接改 sls 文件即可。而不用改变该配置文件
    19 ServerName {{ LocalInnerIP }}:{{ HttpPort }}
    20 
    21 # 「#」 注释,只是针对 httpd 服务,对于 jinja 仍然是可用的 ★★★★★
    22 # salt 模块 支持
    23 # hw_addr_eth0={{ HwAddr_eth0 }}
    24 # grains 支持
    25 # ip6_interfaces_eth0={{ IP6_Interface_eth0 }}
    26 # pillar 支持
    27 # pillar_user={{ Pillar_User }}

    4.4. apache.sls 文件修改

     1 [root@salt100 lamp2]# pwd
     2 /srv/salt/lamp2
     3 [root@salt100 lamp2]# ll
     4 total 16
     5 -rw-r--r-- 1 root root 747 Jan  1 14:17 apache.sls
     6 drwxr-xr-x 2 root root  75 Jan  1 14:33 file
     7 -rw-r--r-- 1 root root 209 Jan  1 14:04 init.sls
     8 -rw-r--r-- 1 root root 563 Dec 31 15:42 mariadb.sls
     9 -rw-r--r-- 1 root root 346 Dec 31 15:31 php.sls
    10 [root@salt100 lamp2]# cat apache.sls 
    11 apache-service:
    12   pkg.installed:
    13     - name: httpd
    14 
    15   file.managed:
    16     - name: /etc/httpd/conf/httpd.conf
    17     - source: salt://lamp2/file/httpd.conf
    18     - user: root
    19     - gourp: root
    20     - mode: 644
    21     - backup: minion
    22     - require:    # 我依赖谁
    23       - pkg: apache-service   # 依赖 apache-service 中 pkg 的安装包
    24     # 新加 jinja 内容  # 本次修改内容 ★★★★★
    25     - template: jinja
    26     - defaults:
    27       LocalInnerIP: {{ grains['ip4_interfaces']['eth0'][0] }}
    28       HttpPort: 8088
    29       # salt远程执行模块 支持  ★★★★★
    30       HwAddr_eth0: {{ salt['network.hw_addr'] ('eth0') }}  # 注意 ] ( 之间的空格
    31       # grains 支持 【其实 defaults 下的第一行就是,这里在重复一遍】
    32       IP6_Interface_eth0: {{ grains['ip6_interfaces']['eth0'][0] }}
    33       # pillar 支持
    34       Pillar_User: {{ pillar['level1']['level2']['my_user'] }}
    35 
    36   service.running:
    37     - name: httpd
    38     - enable: True
    39     - reload: True
    40     - require:   # 我依赖谁
    41       - pkg: apache-service
    42     - watch:      # 我监控谁
    43       # 一旦发生变化,就重加载服务
    44       - file: apache-service  # 监控 apache-service 中 file 的文件

    4.5. init.sls 文件修改

     1 [root@salt100 lamp2]# pwd
     2 /srv/salt/lamp2
     3 [root@salt100 lamp2]# ll
     4 total 16
     5 -rw-r--r-- 1 root root 747 Jan  1 14:17 apache.sls
     6 drwxr-xr-x 2 root root  75 Jan  1 14:33 file
     7 -rw-r--r-- 1 root root 209 Jan  1 14:04 init.sls
     8 -rw-r--r-- 1 root root 563 Dec 31 15:42 mariadb.sls
     9 -rw-r--r-- 1 root root 346 Dec 31 15:31 php.sls
    10 [root@salt100 lamp2]# cat init.sls   # 根据 pillar 来区分,哪些 minion 执行哪些 SLS 文件
    11 include:   # 我包含谁
    12 {% if pillar['service_appoint'] == 'www' %}
    13   - lamp2.apache
    14   - lamp2.php
    15 {% elif pillar['service_appoint'] == 'mariadb' %}
    16   - lamp2.mariadb
    17 {% endif %}

    4.6. 执行 SLS

    1 # 测试一下,看是否可执行,有没有什么异常
    2 [root@salt100 lamp2]# salt 'salt01' state.sls lamp2.init test=True  
    3 # 根据 init.sls 信息,选取覆盖 if 条件中所有情况的 minion 并测试一下,看是否正常
    4 [root@salt100 lamp2]# salt -L 'salt01,salt100' state.sls lamp2.init test=True  
    5 # 单个执行,并查看返回情况
    6 # 这时可在 salt01 机器,通过 ps -ef | grep 'httpd' 和 netstat -lntup | grep 'httpd' 查看
    7 # 可见 httpd 已经重加载,并且端口从 80 改为了 8088
    8 [root@salt100 lamp2]# salt 'salt01' state.sls lamp2.init 
    9 [root@salt100 lamp2]# salt '*' state.sls lamp2.init  # 批量执行,并查看返回情况

    4.7. 部分截图

    [root@salt100 lamp2]# salt 'salt01' state.sls lamp2.init test=True  # 对应的截图

    对应 salt 远程执行、grains、pillar 的情况

     1 [root@salt100 ~]# salt 'salt01' network.hw_addr eth0
     2 salt01:
     3     00:0c:29:95:1b:7a
     4 [root@salt100 ~]# salt 'salt01' grains.item ip6_interfaces:eth0
     5 salt01:
     6     ----------
     7     ip6_interfaces:eth0:
     8         - fe80::20c:29ff:fe95:1b7a
     9 [root@salt100 ~]# salt 'salt01' pillar.item level1:level2:my_user
    10 salt01:
    11     ----------
    12     level1:level2:my_user:
    13         lisi

  • 相关阅读:
    监控网页是否有变化
    设置开机自动启动进程
    nagios-调用脚本
    连接数据库出现10061错误
    小程序修改默认的radio样式
    小程序端,做类似于支付宝充值话费或流量的样式
    jq 在字符串中,去掉指定的元素
    vue 使用 proxyTable 解决跨域问题
    vue-cli 动态绑定图片失败
    vue-cli 使用 font-awesome 字体插件
  • 原文地址:https://www.cnblogs.com/zhanglianghhh/p/10828207.html
Copyright © 2011-2022 走看看