SaltStack学习笔记四

SaltStack配置管理

SaltStack的配置管理其实就是在文件中描述机器的状态,实现对对象状态的集中管理,包括状态跟踪,依赖分析等。Salt使用State模块,通过定义YAML格式的描述文件,后缀为sls(salt state file)来实现对Minion的状态管理,在sls中可以非常灵活的指定想用的模块,调用哪些方法,使用什么参数,定义依赖条件等,简单灵活且功能强大。

原则上salt执行后的状态不能回滚,创建的sls文件应该可以多次执行

1.Salt State File管理

  • State Tree

    file_roots定义了环境目录,用来管理组织sls模块

  • Top File

    Salt State模块执行的入口文件,指定相应的Minion加载哪些sls模块

!最后都会转成数据字典执行

1.1 编辑master配置文件

file_roots:
  base:				#环境目录定义
    - /srv/salt
salt '*' state.highstate	#执行高级状态,salt会把top file当成入口文件,按照top.sls里定义的顺序执行,生产中不建议用,有坑!
salt 'linux-node1.example.com' state.highstate test=True	#按照定义的sls里编排的内容先测试一遍,检查执行内容及测试结果,确认无误可再按上一步执行

1.2 状态声明的两种方式

[root@linux-node1 /srv/salt/web]# cat apache.sls 
apache-install:			#名称ID声明,默认是name声明
  pkg.installed:		#pkg包安装模块
    - names:			#告诉pkg.installed我要安装什么服务
      - httpd
      - httpd-devel

apache-service:			#ID声明(高级状态中,ID必须唯一,生产中ID都是唯一的)
  service.running:		#State状态声明:使用服务的状态模块
    - name: httpd		#选项声明
    - enable: True

#示例
/etc/http/conf/http.conf:
  file.managed:			#file状态模块有managed方法,mangaged方法支持下边声明的选项
    - user: root		#选项声明
    - group: root
    - mode: 644

1.3 部署LAMP架构

步骤				所需模块
1.安装软件包			 PKG
2.修改配置文件		         FILE
3.启动服务			ERVICE

PKG模块方法:
pkg.installed		#安装
pkg.latest		#确保最新版本
pkg.remove		#卸载
pkg.purge		#卸载并删除配置文件
第一种方式:按状态分类,直接写在一个sls中
[root@linux-node1 /srv/salt/web]# cd /srv/salt/
[root@linux-node1 /srv/salt]# ls
_grains  _modules  top.sls  web
[root@linux-node1 /srv/salt]# mkdir lamp
[root@linux-node1 /srv/salt]# cd lamp && vi lamp.sls
#同时安装多个包
common_packages:
  pkg.installed:
    - pkgs:
      - unzip
      - dos2unix
      - salt-minion: 2015.8.5-1.el6

lamp-pkg:
  pkg.installed:
    - pkgs:		#yum安装所需服务
      - httpd
      - php
      - mariadb
      - mariadb-server
      - php-mysql
      - php-cli
      - php-mbstring

#管理apache、php、mysql配置文件
apache-config:		#一个ID声明下面,一个状态只能使用一次,不能重复使用,sls文件最终会转换成数据字典,其中的KEY当然不能重复
  file.managed:
    - name: /etc/httpd/conf/httpd.conf		#生产中先找台机器先装上,再把配置文件拷过来
    - source: salt://lamp/files/httpd.conf	#salt中管理配置文件的目录路径,配置文件应用会以name定义的文件名来命名
    - user: root
    - group: root
    - mode: 644


php-config:
  file.managed:
    - name: /etc/php.ini
    - source: salt://lamp/files/php.ini		#salt:// 表示当前环境的根目录
    - user: root				#那么salt://lamp/files/php.ini表示/srv/salt/lamp/files/httpd.conf
    - group: root
    - mode: 644
    
mysql-config:
  file.managed:
    - name: /etc/my.cnf
    - source: salt://lamp/files/my.cnf
    - user: root
    - group: root
    - mode: 644

#服务管理
apache-service:
  service.running:
    - name: httpd
    - enable: True				#开机启动
    - reload: True				#配置此选项则配置文件变动后重载而不是重启
    - require:
      - pkg: lamp-pkg
    - watch:
      - file: apache-config
      
    
mysql-service:
  sercie.running:
    - name: mariadb
    - enable: True
    - reload: True
#把httpd.conf、my.cnf、php.ini拷贝到lamp目录下的file目录中,执行以下命令
[root@linux-node1 /srv/salt/lamp/files]# salt "linux-node2*" state.sls lamp.lamp
#注意:sls的执行顺序是从上往下执行

第二种方式:按模块,便于管理及复用
pkg.sls			#安装管理	
lamp-pkg:
  pkg.installed:
    - pkgs:
      - httpd
      - php
      - mariadb
      - mariadb-server
      - php-mysql
      - php-cli
      - php-mbstring

config.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
    - 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

init.sls		#启动管理	
include:
  - lamp.pkg
  - lamp.config
  - lamp.service


service.sls		#服务管理
apache-service:
  service.running:
    - name: httpd
    - enable: True
    - reload: True
    - require:
      - pkg: lamp-pkg
    - watch:
      - file: apache-config

mysql-service:
  service.running:
    - name: mariadb
    - enable: True
    - reload: True


#先安装,再配置,再管理,条理很清晰,两种方法可以按需选择
[root@linux-node1 /srv/salt/lamp/files]# salt "linux-node2*" state.sls lamp.init

2.状态间关系

  • 2.1 我依赖谁(执行顺序):require

apache-service:
  service.running:
    - name: httpd
    - enable: True
    - reload: True
    - require:
      - pkg: lamp-pkg		#先安装服务后,才有服务管理嘛,依赖pkg状态模块安装
      - file: apache-config	#依赖配置文件,两者都执行成功才执行
  • 2.2 我被谁依赖:require_in

mysql-config:
  file.managed:
    - name: /etc/my.cnf
    - source: salt://lamp/files/my.cnf
    - user: root
    - group: root
    - mode: 644
    - require_in:
      - service: mysql-service	 #我被mysql-service服务依赖,我执行成功它才能执行
  • 2.3 我监控谁:watch

apache-service:
  service.running:
    - name: httpd
    - enable: True
    - reload: True
    - require:
      - pkg: lamp-pkg
    - watch:
      - file: apache-config
	#如果apache-config这个id的状态发生变化就reload,如果不加reload: True,那么就restart
  • 2.4 我被谁监控:watch_in

  • 2.5 我引用谁:include

include:
  - lamp.pkg
  - lamp.config
  - lamp.service
  • 2.6 我扩展谁

技巧:

状态间关系中1.3.5用的较多
如何编写SLS技巧:
1.按状态分类:如果单独使用,很清晰
2.按服务分类:可以被其他的SLS include,如LNMP,include mysql的服务

3.jinja模版[官网]

Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全.

<title>{% block title %}{% endblock %}</title>

<ul>

{% for user in users %}

  <li><a href="{{ user.url }}">{{ user.username }}</a></li>

{% endfor %}

</ul>

作用:

jinja模板包含变量或表达式,这两者在模板求值的时候会被替换为值。模板中还有标签,控制模板的逻辑,模板语法的大量灵感来自于 Django 和 Python ,可以自己定义开发。

特性:

  • 沙箱中执行

  • 强大的 HTML 自动转义系统保护系统免受 XSS

  • 模板继承

  • 及时编译最优的 python 代码

  • 可选提前编译模板的时间

  • 易于调试。异常的行数直接指向模板中的对应行。

  • 可配置的语法

使用方法:两种分隔符: {% ... %} 和 {{ ... }}

3.1 告诉File模块,你要使用jinja模版

apache-config:
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://lamp/files/httpd.conf
    - user: root
    - group: root
    - mode: 644
    - template: jinja	#使用jinja模版
    - defaults:
      PORT: 88

3.2 列出参数列表

    - defaults:			#给模版变量定义一个值
      PORT: 88

3.3 模版引用

[root@linux-node1 /srv/salt/lamp/files]# vi /srv/salt/lamp/files/httpd.conf	#添加下面这条配置
Listem {{ PORT }}
模版支持salt、grains、pillar
两种分隔符: {% ... %} 和 {{ ... }}
1.写在模板文件中
grans支持:Listen {{ grains['fqdn_ip4'][0] }}:{{ PORT }}		#获取IPV4地址及端口
salt远程执行模块:{{ salt['netwrok.hw_addr']('eth0') }}		#获取eth0的MAC地址
Pillar支持:{{ pillar['apache'] }}				#获取apache定义的值

2.写在SLS里面的Defaults,变量列表中。
- defaults:
      IPADDR: {{ grains['fqdn_ip4'][0] }}
      PORT: 88  
所有的minion除去pillar中item rsyslog的值是server的minion


anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/771.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注