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