zoukankan      html  css  js  c++  java
  • 企业——saltstack自动化部署软件值JINJIA模块的使用

    一.JINJA在STATES中的使用   可以用于管理文件

    默认的Jinja分隔符配置如下

      {% ... %}  对于声明

      {{ ... }}  对于表达式打印到模板输出

      {# ... #}for Comments  不包含在模板输出中

       #  ... ##  对于行语句

    模板变量由传递给模板的上下文字典定义。

    如果应用程序传入变量,您可以使用模板中的变量。变量可能具有您可以访问的属性或元素。变量的属性很大程度上取决于提供该变量的应用程序

      {{ ... }} 重要的是要知道外部双花括号不是变量的一部分,而是print语句。如果访问标记内的变量,请不要在它们周围放置大括号。

      {{% ... %}} 测试可用于针对公共表达式测试变量。要测试变量或表达式,请在变量后添加 is 加上测试的名称

    JINJIA的控制结构:

    1.如果 if 

      Jinja中的 if 语句与 Python if 语句相当。在最简单的形式中,您可以使用它来测试变量是否已定义,而不是空或不是false

      对于多个分支,elif 和 else 可以像Python一样使用。您也可以在那里使用更复杂的表达式。

      示例下面有。

    2.宏定义

      宏与常规编程语言中的函数相当。它们有助于将经常使用的习语放入可重复使用的功能中,而不是重复自己(“干”)。示例是下面的saltstack用文件推nginx的服务一样。

    3.作业

      作业的语法示例:{% set key, value = call_something() %}

      在代码块内部,您还可以为变量赋值。顶级(块,宏或循环之外)的分配从顶层宏等模板导出,并可由其他模板导入。

    4.导入和导入上下文行文

    二.修改 sls 文件内容,添加相应的 jinjia 模块

    1.在编写好的 sls 文件中添加相应的 jinjia 模块

    cd /srv/salt/apache
       vim install.sls
            - template: jinja
            - context:
              port: 8080
              bind: 172.25.254.2
       vim files/httpd.conf
         Listen {{ bind }}:{{ port }}
       salt wf2 state.sls apache.install  ##通过推送的 sls 文件修改配置文件内的某些参数(或者参数的格式)
       
       测试:
       wf2上: netstat -antlp     ##端口格式被修改
            vim /etc/httpd/conf/httpd.conf     ##配置文件中的格式也被修改了


    2.上面的方法的不足:bind信息是手动加进去的。如果有很多的服务器(意味着有很多不同的IP),不可能一个一个手动添加

     改进:
       vim install.sls
        bind: {{ grains['fqdn_ip4']}}     ##将bind处修改,通过 grains 获得某台服务器的IP,然后填入bind 中。这个在服务器很多的时候,不用一个一个手动添加

       salt wf2 state.sls apache.install

       测试:
       wf2上: netstat -antlp     ##端口格式被修改
            vim /etc/httpd/conf/httpd.conf     ##配置文件中的格式也被修改了
            但是显示出来的内容,却是列表的形式,需要进一步的改进。改进如下。


     接着改进:

      vim install.sls
             bind: {{ grains['ipv4'][1] }}

       测试:
       wf2上: netstat -antlp     ##端口格式被修改
            vim /etc/httpd/conf/httpd.conf     ##配置文件中的格式也被修改了

    三.利用JINJIA的控制结构实现

    1.利用导入

       vim files/httpd.conf  ##给配置文件的最上面空白处添加以下的语句
        {% from 'apache/lib.sls' import port with context%}  ## 将 apache/lib.sls 文件中的端口号,填写入配置文件中。
        {% from 'apache/lib.sls' import bind with context%}  ## 将 apache/lib.sls 文件中的IP地址,填写入配置文件中。
       
       cd /srv/salt/apache  ##在刚才写的目录的路径下,创建相应的文件
       vim lib.sls  ##编辑需要填写的内容信息,set相当于开启一个容器,然后给容器赋值
        {% set port = 8080 %}
        {% set bind = '172.25.254.2' %} 

     

    2.利用 如果if 实现

       vim /srv/pillar/web/install.sls
      {% if grains['fqdn'] == 'ww2' %}
          webserver: httpd
          port: 80
          bind: 172.24.254.2
         {% elif grains['fqdn'] == 'ww3' %}
          webserver: nginx
         % endif %}

       vim files/httpd.conf
         Listen {{ pillar['bind'] }}:{{ pillar['port'] }}

    3.配置 nginx 服务

      cat install.sls
        {% set nginx_ver = '1.15.8' %}

        nginx-install:
         pkg.installed:
          - pkgs:
          - pcre-devel
          - zlib-devel
          - gcc
          - make

        file.managed:
          - name: /mnt/nginx-{{ nginx_ver }}.tar.gz
          - source: salt://nginx/files/nginx-{{ nginx_ver }}.tar.gz

        cmd.run:
          - name: cd /mnt && tar zxf nginx-{{ nginx_ver }}.tar.gz && cd nginx-{{ nginx_ver }} && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx &> /dev/null && make &> /dev/null && make install &> /dev/null && cd .. && rm -fr nginx-{{ nginx_ver }}
    - creates: /usr/local/nginx


      cat service.sls
        include:
          - nginx.install
          - users.nginx

        /usr/local/nginx/conf/nginx.conf:
         file.managed:
          - source: salt://nginx/files/nginx.conf
          - template: jinja


        nginx-service:
         file.managed:
          - name: /etc/systemd/system/nginx.service
          - source: salt://nginx/files/nginx.service

        service.running:
          - name: nginx
          - reload: True
          - watch:
           - file: /usr/local/nginx/conf/nginx.conf

      ls  ## 在 /mnt 下
        nginx-1.15.8.tar.gz
      rm -fr *    ##再次推送就过来了
      salt server3 state.sls nginx.service
      ls
        nginx-1.15.8.tar.gz

    四.利用数据库记录 saltstack 执行过的命令

    方法一:常规方法,执行的命令会被保存在cache目录下

       cd /var/cache/salt/master/jobs
       salt-run jobs.list_jobs   ##查看执行过的命令

    方法二:利用数据库保存

     wf2上:使远程的用户可以登录数据库
       yum install MySQL-python -y
       cd /etc/salt
       vim minion
         mysql.host: '172.25.254.1'
         mysql.user: 'salt'
         mysql.pass: 'westos'
         mysql.db: 'salt'
         mysql.port: 3306
       /etc/init.d/salt-minion restart

     wf1上:
       yum install mysql-server -y
       /etc/init.d/mysqld start
       mysql < add.sql
       mysql    ##给用户授权
       mysql> grant all on salt.* to salt@'%' identified by 'westos';
       mysql> grant all on salt.* to salt@'localhost' identified by 'westos';
       
    ==================================================================================
    下面是 add.sql 文件中的东西:

    CREATE DATABASE  `salt`
      DEFAULT CHARACTER SET utf8
      DEFAULT COLLATE utf8_general_ci;

    USE `salt`;

    --
    -- Table structure for table `jids`
    --

    DROP TABLE IF EXISTS `jids`;
    CREATE TABLE `jids` (
      `jid` varchar(255) NOT NULL,
      `load` mediumtext NOT NULL,
      UNIQUE KEY `jid` (`jid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    #CREATE INDEX jid ON jids(jid) USING BTREE;

    --
    -- Table structure for table `salt_returns`
    --

    DROP TABLE IF EXISTS `salt_returns`;
    CREATE TABLE `salt_returns` (
      `fun` varchar(50) NOT NULL,
      `jid` varchar(255) NOT NULL,
      `return` mediumtext NOT NULL,
      `id` varchar(255) NOT NULL,
      `success` varchar(10) NOT NULL,
      `full_ret` mediumtext NOT NULL,
      `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      KEY `id` (`id`),
      KEY `jid` (`jid`),
      KEY `fun` (`fun`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    --
    -- Table structure for table `salt_events`
    --

    DROP TABLE IF EXISTS `salt_events`;
    CREATE TABLE `salt_events` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `tag` varchar(255) NOT NULL,
    `data` mediumtext NOT NULL,
    `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `master_id` varchar(255) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `tag` (`tag`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    ==================================================================================

       salt '*' test.ping --return mysql     ##执行一条return命令
       mysql
       mysql> use salt;
       mysql> show tables;
       mysql> select * from salt_returns;     ##会有刚才测试的 test.ping 的记录

     wf1上:
       yum install MySQL-python -y
       cd /etc/salt
       vim master
         master_job_cache: mysql
         mysql.host: 'localhost'
         mysql.user: 'salt'
         mysql.pass: 'westos'
         mysql.db: 'salt'
         mysql.port: 3306
       /etc/init.d/salt-master restart
       
       测试:
       salt wf3 cmd.run hostname     ##执行一条return命令
       mysql
       mysql> use salt;
       mysql> show tables;
       mysql> select * from salt_returns;     ##会有刚才测试的 test.ping 的记

  • 相关阅读:
    博客园转文章的方法
    http协议相关面试题
    接口测试基础01
    文件上传下载
    括号-回溯
    幂集-回溯
    分割数组为连续子序列- -贪心法
    不使用临时变量交换数字
    计数质数
    拼接最大值
  • 原文地址:https://www.cnblogs.com/wf-aiyouwei/p/10832271.html
Copyright © 2011-2022 走看看