企业——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 的记

posted @ 2019-05-08 15:42  wf-aiyouwei  阅读(275)  评论(0编辑  收藏  举报