SaltStack (二)

SaltStack配置管理

saltstack配置管理又称为状态管理,saltstack无法对状态进行回滚。在我们编写sls文件时,要支持多次执行,如:编写了软件的安装模块,每次执行这个状态时,都会去检查这个软件是否安装。

在saltstack中编写的sls描述文件实质是salt stack的缩写,使用的是YAML的描述语法。

sls文件说明

# cat /srv/salt/web/apache.sls 
apache-install:       #ID声明,ID必须唯一
  pkg.installed:      #state声明,状态声明,执行什么操作  
    - names:          #选项声明,具体行为参数
      - httpd
      - httpd-devel

sls文件格式有多种写法,一般都包含这三部分,多个参数会使用‘-‘ 列表,使用层级递进关系。

使用SaltStack安装LAMP

在安装LAMP环境时,使用不同的配置文件来完成整改环境的安装和部署。整个过程可以分为三步:

1、使用pkg 模块安装软件包

2、使用file 模块修改配置文件

3、使用service 模块启动服务

PKG模块

https://docs.saltstack.com/en/latest/ref/states/all/salt.states.pkg.html#module-salt.states.pkg

使用pkg.installed 可以同时安装多个软件包:

common_packages:
  pkg.installed:
    - pkgs:          #指定多个包
      - unzip
      - dos2unix
      - salt-minion: 2015.8.5-1.el6  #末尾指定版本

pkg中其他的一些常用方法:

pkg.installed     # 安装
pkg.latest        # 确保最新版本
pkg.remove        # 卸载
pkg.purge         # 卸载并删除配置文件

lamp中对于apache,mysql,php的安装,先创建目录和sls文件:

mkdir /srv/salt/lamp
vim /srv/salt/lamp/lamp.sls

安装LAMP环境编写的配置:

lamp-pkg:
  pkg.installed:
    - pkgs:
      - httpd
      - php
      - mariadb
      - mariadb-server
      - php-mysql
      - php-cli
      - php-mbstring

File模块

https://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html#module-salt.states.file

当需要对安装的服务修改配置时,通过file模块来分发对应的配置文件,对于不同的服务必须要使用不同的ID,在同一个ID下不能有两个及以上的模块方法行为。如在下面的lamp.sls的文件中,一个ID下面只能有一个file.managed的方法调用。

lamp中对于apache,mysql,php的文件配置,增加如下内容到lamp.sls:

apache-config:
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://lamp/files/httpd.conf 
    - user: root
    - group: root
    - mode: 644
php-config:
  file.managed:
    - name: /etc/php.ini
    - source: salt://lamp/files/php.ini #此处表示当前环境的根目录(当前环境分为base、dev、pro)
    - user: root
    - group: root
    - mode: 644
mysql-config:
  file.managed:
    - name: /etc/my.cnf
    - source: salt://lamp/files/my.cnf
    - user: root
    - group: root
    - mode: 644

对于source中指定的路径,必须要是当前环境的根目录为起始路径,如在master的配置文件中,指定了base环境则为/srv/salt. dev环境和pro环境在master配置文件中分别指定了对应的起始路径。

将各个服务需要的配置文件放入指定的路径中,如果没有这些配置文件,可以在一台机上安装对应的软件,然后将配置文件拷贝到指定路径(这里对应文件中source指定的/srv/salt/files):

cp /etc/httpd/http.conf /srv/salt/lamp/files/
cp /etc/php.ini /srv/salt/lamp/files/  
cp /etc/my.cnf /srv/salt/lamp/files/

这样当执行file.managed模块时,会自动将配置好的配置文件分发到对应的目录中。

Service模块

service模块用来启用服务,在lamp.sls文件最后,添加如下内容:

apache-service:
  service.running:     #启动服务模块
    - name: httpd      #需要指定服务名称,否则会将ID名称当做服务名称而出错
    - enable: True     #开机自启动
    - reload: True     #重载
mysql-service:
  service.running:
    - name: mariadb
    - enable: True
    - reload: True

在master上执行部署命令:

# salt ‘node2‘ state.sls lamp.lamp

在node2上,这些服务会自动安装,替换文件,并且启动。

由于同一个ID和同一个状态模块只能使用一次,所以上面的配置文件也可以按照单个服务的部署流程来写,在一个ID下对一个服务定义一系列动作:

apache-service:
  pkg.installed:
    - pkgs:
      - httpd
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://lamp/files/httpd.conf 
    - user: root
    - group: root
    - mode: 644
  service.running:     
    - name: httpd      
    - enable: True     
    - reload: True

注意:sls文件的解析模式是从上往下,按顺序解析,在编写模块时,要注意顺序,比如要安装完才能配置、启动服务。

状态间关系

在各个模块相互调用的时候,就涉及到一个先后顺序的问题,如当我们需要启动某项服务的时候,必须确保先安装这个服务,配置完成才能启动。对于模块之间复杂的调用,需要有一个定义它的方式来指定状态间的关系。

各个状态之间存在一些相互作用的关系,主要有下面几种关系:

1、依赖谁          require,如运行启动服务的模块必须先运行安装模块 ,也依赖于配置模块

2、被谁依赖      require_in,安装模块被启动模块依赖

3、监控谁          watch, 如果监控的模块状态变化就reload,如果没有reload参数,则会重启。

4、被谁监控      watch_in,和watch功能相同,模块的对象和位置是对应的。

5、引用谁         include  直接导入执行其他的文件并执行,可以指定多个文件去运行。

6、扩展谁

如上面的实例:

lamp-pkg:
  pkg.installed:
    - pkgs:
      - httpd
      - php
      - mariadb-server
      - php-mysql
      - php-cli
      - php-mbstring
apache-config:
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://lamp/files/httpd.conf      
    - user: root
    - group: root
    - mode: 644
    - require:    #依赖于安装模块
      - pkg: lamp-pkg   #状态模块: ID
php-config:
  file.managed:
    - name: /etc/php.ini
    - source: salt://lamp/files/php.ini
    - user: root
    - group: root
    - mode: 644
    - require:    #依赖于安装模块
      - pkg: lamp-pkg  #状态模块:ID
mysql-config:
  file.managed:
    - name: /etc/my.cnf
    - source: salt://lamp/files/my.cnf
    - user: root
    - group: root
    - mode: 644
    - require:    #依赖于安装模块
      - pkg: lamp-pkg
    
apache-service:
  service.running:
    - name: httpd
    - enable: True
    - reload: True
    - require:          #依赖于安装和配置模块
      - pkg: lamp-pkg
      - file: apache-config
    - watch:            # 当监控的apache-config状态(文件)发生变化就执行reload
      - file: apache-config
    #注意:如果此状态模块中没有- enable: True参数,状态变化时则会重启服务。 
      
mysql-service:
  service.running:
    - name: mariadb
    - enable: True
    - reload: True
    - require:         #此模块执行时,依赖于lamp-pkg和mysql-config模块
      - pkg: lamp-pkg
      - file: mysql-config

include使用,可以将上面的内容分别写在不同的sls文件中,在主配置文件中使用include来是这些不同的文件依次运行:

# cat init.sls
include:
  - lamp.pkg
  - lamp.config
  - lamp.service

在当前目录中分别有pkg.sls, concfig.sls, service.sls 文件。

执行salt命令时直接执行init.sls模块即可:

salt ‘node2‘ state.sls lamp.init

如果将所有没有互相依赖的单个服务的安装配置启动写到一个sls文件中,在编写主配置的时候灵活性就会大大提高,可以选择需要服务的对应文sls件include。

通过状态间的关系,可以将各个服务单独模块化,可以重复被其他模块调用,方便管理和配置。

编写sls的技巧:

1、安装状态分类。单独使用会很清晰。

2、按服务分类,可以被其它的SLS include。

Jinja模板

Jinja2是python的模板语言。模板仅仅是文本文件,可以生成任何基于文本的格式。

模板包含表达式和变量,分别用{%...%} 和{{...}} 表示。使用jinja模板时一般有三个步骤:

  • 在使用Jinja模板时,需要在sls文件中声明使用jinja
- template: jinja
  • 列出参数列表,
- defaults:
  PORT: 88    # 表示PORT变量的值为88
  • 模板的引用,

在分发的配置文件中,可以将PORT变量的值赋予配置文件的参数:

Listen {{ PORT }}  # PORT变量的值会自动添加到变量中 Listen 88

Jinja中使用Grains

在使用变量修改minion端修改某些minion自身的参数时,可以使用salt,grains和pillar来获取minion本身的参数,如本机的IP地址。

先在sls的配置文件中添加Jinja模板

- template: jinja

如上例,修改httpd.conf文件监听端口:

Listen {{ grains[‘fqdn_ip4‘][0]}}:{{ PORT }}

这里的fqdn_ip4是获取的 grains中 fqdn_ip4对应的输出:

# salt ‘*‘ grains.item fqdn_ip4 
node2:
    ----------
    fqdn_ip4:
        - 172.16.10.61
node1:
    ----------
    fqdn_ip4:
        - 172.16.10.60

由于是一个列表,[0] 表示列表中的第一个值,也就是IP地址。对应到node2上的配置文件格式为:

Listen 172.16.10.61:88

Jinja中使用salt

可以使用salt本身的模块获取主机参数,如获取本机eth0的mac地址:

# salt ‘*‘ network.hw_addr eth0
node2:
    00:0c:29:04:73:9d
node1:
    00:0c:29:e8:97:67

可以在某个需要填入本机mac地址配置的区域添加如下参数:

{{ salt[‘network.hw_addr‘](‘eth0‘) }}

需要在sls中指定Jinja模板。

Jinja中使用Pillar

Jinja中也可以使用Pillar,如果有自定义的Pillar值,可以直接通过Jinja模板获取,当然首先必须添加了Jinja模板。

# salt ‘*‘ pillar.items
node1:
    ----------
node2:
    ----------
    apache:
        httpd

在配置文件中使用如下参数来获取pillar:

{{ pillar[‘apache‘] }}

这样,在分发给node2上的配置文件就会 添加一个httpd的参数。

这个用法可以用来配置文件中涉及到的账户密码等敏感信息。

在SLS模板中定义

也可以将需要配置写在SLS里面的Defaults,变量列表中。

- template: jinja
- defaults:
      IPARRD: {{ grains[‘fqdn_ip4‘][0] }}
      PORT: 88

然后在文件中直接引用变量{{ IPADDR }}即可。

时间: 2024-10-12 13:57:28

SaltStack (二)的相关文章

SaltStack(二) 安装使用

SaltStack 安装 1.安装环境 [[email protected] ~]# uname -a Linux salt-server 2.6.32-642.el6.x86_64 [[email protected]-server ~]# cat /etc/redhat-release CentOS release 6.8 (Final)    2.安装指定epel源 rpm -Uvh http://mirrors.yun-idc.com/epel/6Server/x86_64/epel-r

day57——Saltstack二次开发

Saltstack简介 Salt 是 一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行) 一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据 开发其的目的是为远程执行提供最好的解决方案,并使远程执行变得更好,更快,更简单 Saltstack(中国用户组 www.saltstack.cn )基于python开发,c/s架构,支持多平台,比puppet轻量,在远程执行命令时非常快捷,配置和使用比pup

57. Python saltstack 二次开发(2)

回顾上一节: grains 和 pillar 都是定义他们的属性的 grains 定义在minion端(定义完必须重启minion,才能生效) pillar  定义在master端(无需重启即可生效) saltstack的api Salt-api有两种方式: 第一种:是函数的形式,有人家定义好的函数,我们可以直接调用,直接写python代码调用函数或者类就可以了. 第二种:形式是salt-api有封装好的http协议的,我们需要启动一个服务端. 登录官网查看文档: 文档内容,如下: 安装salt

day58——Saltstack二次开发(二)

Saltstack的httpapi 1.在官网跟新yum源信息: 2.yum安装 yum install -y gcc make python-devel libffi-devel salt-api openssl pip install cherrypy 生成证书: #cd /etc/salt #mkdir keycrt #cd keycrt #openssl genrsa –out key.pem 4098 #openssl req –new –x 509 –key key.pem –out

saltstack系列~第二篇

一 简介:今天咱们来继续学习saltstack 二 命名和分组 1 命名规则 1 ID构成 机房-DB类型-角色(主/从)-IP地址 2 分组构成  分为master slave两组即可 2 分组规则 标签 node-groups: node-names: '匹配模式@匹配规则' eg:  group2:'[email protected]\.1\.1\.(1|2|3|4) E 是正则匹配 三 模块说明 1 分类 1  系统自带模块 例如 cp crontab 等 2 自定义模块 2 如何编写自

学习saltstack (五)

Saltstack介绍 Salt三种运行方式 1.local本地运行2.Master/Minion3.Salt ssh Salt的三大功能 a.远程执行b.配置管理(状态管理)c.云管理:阿里云,aws,openstack都提供了封装好的接口,可以使用salt-cloud进行云主机的管理 Saltstack环境准备第一台:mini1,既作为salt-master,又作为salt-minion第二台:node2.chinasoft.com,只作为salt-minion 1.安装salt客户端和服务

saltstack集合

saltstack集合 saltstack(一):   saltstack简介 saltstack(二):   saltstack安装及配置 saltstack(三):   saltstack远程执行 saltstack(四):   saltstack配置管理-常用模块介绍 saltstack(五):   saltstack配置管理-minion端安装apache简单样例 saltstack(六):   saltstack配置管理-高级状态top.sls saltstack(七):   salt

SaltStack 学习笔记 - 第十二篇: SaltStack Web 界面

SaltStack 有自身的用python开发的web界面halite,好处是基于python,可以跟salt的api无缝配合,确定就比较明显,需要个性化对web界面进行定制的会比较麻烦,如果喜欢体验该界面的可以参考下面的文章  http://rfyiamcool.blog.51cto.com/1030776/1275443/ 我是运用另一个python+php来进行web开发,具体需要的工具有在我的另一篇文章里面介绍过,这里再重新进行整个开发介绍 首先介绍php 跟python通信的工具 pp

saltstack(七)modules(二)

OK,上一篇总结了execution modules的用法.这一篇准备总结一下state modules该怎么写. 顺便把上一篇execution modules遗留下来的那个装饰器给写一下. 看一下写的这个模块 [email protected]:~# cat /srv/salt/_modules/liss.py  import salt.utils.decorators as decorators import os @decorators.depends('os') def cheng()

了解saltstack的通信协议zeromq(二)

上文讨论了PAIR/PAIR,REQ/REP两种模式,现在看看PUB/SUB和PUSH/PULL模式. PUB/SUB:发布订阅模式,跟我们订阅新闻类似的,采用异步IO,多对多模式,如果没有订阅,服务端发送的消息直接丢弃掉. pub_server.py import zmq import random import sys import time port = "5556" if len(sys.argv) > 1:         port =  sys.argv[1]