这次主要介绍 saltstack 的配置管理, 这一部分在企业应用中比较重要, 也经常用到.
states 是 saltstack 系统中的配置语言, 在日常运维中需要编写大量的 states 文件, 例如: 创建用户, 安装软件, 配置软件, 服务运行等. 需要编写一些 "states sls" 文件. 该文件主要使用 YAML 语言, 也可以支持使用 python 语言编写.
配置管理中常用模块
pkg 模块
列出所有状态模块
salt '' sys.list_modules
查看状态模块中的函数: 如 pkg 模块
- [root@salt-master _grains]# salt '' sys.list_state_functions pkg
- salt-minion01:
- pkg.downloaded
- pkg.group_installed
- pkg.installed
- pkg.latest
- pkg.mod_aggregate
- pkg.mod_init
- pkg.mod_watch
- pkg.patch_downloaded
- pkg.patch_installed
- pkg.purged
- pkg.removed
- pkg.uptodate
- salt-minion02:
- pkg.downloaded
- pkg.group_installed
- pkg.installed
- pkg.latest
- pkg.mod_aggregate
- pkg.mod_init
- pkg.mod_watch
- pkg.patch_downloaded
- pkg.patch_installed
- pkg.purged
- pkg.removed
- pkg.uptodate
file 模块
- root@salt-master App]# mkdir files
- [root@salt-master App]# cp /etc/resolv.conf files/
- [root@salt-master App]# cat dns.sls
- dns-config:
- file.managed:
- name: /etc/resolv.conf #file of
- source: salt://App/files/resolv.conf salt 代表 file 根目录
- user: root
- group: root
- mode: 644
backup: minion ------ 备份到 minion 端
修改 / srv/salt/App/files 下的 resolv.conf 文件
- [root@salt-master files]# cat resolv.conf
- nameserver 101.206.4.6
- nameserver 114.114.114.114
- ###########saltstack configure ----------》添加一行注释
salt 'salt-minion01' state.sls App.dns test=True 测试
salt 'salt-minion01' state.sls App.dns
查看
- [root@salt-minion01 salt]# cat /etc/resolv.conf
- nameserver 101.206.4.6
- nameserver 114.114.114.114
- ###########saltstack configure
file.directory ------ 创建目录
- [root@salt-master App]# cat dir.sls
- mkdir_tmp_dns:
- file.directory:
- name: /tmp/dns
- user: root
- group: root
- mode: 755
- makedirs: True
目录下发 file.recurse
- [root@salt-master App]# cat xf.sls
- httpd-config:
- file.recurse:
- name: /etc/httpd/conf.d/
- source: salt://App/files/httpd_conf.d
- file_mode: 644
- dir_mode: 755
- include_empty: True
- clean: True ##### 远程强制删除
- mkdir files/httpd_conf.d
- [root@salt-master App]# cat files/httpd_conf.d/www.conf
- server {
- www
- }
- [root@salt-master App]# cat files/httpd_conf.d/blog.conf
- erver {
- blog
- }
- [root@salt-master App]# salt 'salt-minion01' state.sls App.xf
- minion01
- [root@salt-minion01 tmp]# ls /etc/httpd/conf.d/
- autoindex.conf fcgid.conf README userdir.conf www.conf
- blog.conf manual.conf ssl.conf welcome.conf
可以直接采用以下方法:
- [root@salt-master App]# cat ln.sls
- Link:
- cmd.run:
- name: ln -s /tmp /mnt
service 模块
- httpd_service:
- service.running:
- name: httpd
- enable: True
- reload: True ####### 允许重载, 不写表示 restart
- watch: ##### 监控谁
- -pkg.httpd-file
cron 模块
- [root@salt-master App]# cat cron.sls
- crontab_scripts:
- cron.present:
- name: /usr/bin/uptime>/dev/null 2>&1
- user: root
- minute: '/5'
- salt 'salt-minion01' state.sls App.cron
结果:
- [root@salt-minion01 tmp]# crontab -l/30 /usr/sbin/ntpdate time.Windows.com
- /5 */usr/bin/uptime>/dev/null 2>&1
高级状态模块, 高级状态文件需要在 base 环境下编写
base:
'*': 匹配所有 minion
- App.httpd #base 模块下 httpd 目录下的安装 sls 文件
- #webserver: #定义的分组名称进行匹配, 需要定义 nodegroups
- 'os:centos': #通过 grains 模块匹配
- match: grains
- App.cron
top.sls 需要写在 / srv/salt 下
执行是 salt '*' state.highstate
LAMP 架构部署
此案例在 prod 生产环境下部署
修改 master 端配置文件
- file_roots:
- base:
- /srv/salt/base
- prod:
- /srv/salt/prod
- systemctl restart salt-master
- mkdir /srv/salt/{
- base,prod
- } -p
把之前的基础环境下写的放在 base 下
1 先手动安装 lamp 环境
- yum install httpd mariadb mariadb-server PHP PHP-MySQL PHP-gd gd -y
- [root@salt-master init]# pwd
- /srv/salt/prod/init
mkdir files ------- 相关配置写在该目录下
2 准备相应目录与对应配置文件
- cp /etc/httpd/conf/httpd.conf files/
- cp /etc/my.cnf files/
- cp /etc/PHP.INI files/
在 init 目录下写 lamp 安装, 配置 启动
3 部署状态文件 lamp.sls
- [root@salt-master init]# cat lamp.sls
- #yum install httpd mariadb-server PHP PHP-MySQL PHP-gd gd -y
- httpd-install:
- pkg.installed:
- names:
- httpd
- httpd-tools
- httpd-config:
- file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://init/files/httpd.conf
- user: root
- group: root
- mode: 644
- backup: minion
- httpd-service:
- service.running:
- name: httpd
- enable: True
- reload: True
- PHP-install:
- pkg.installed:
- names:
- PHP
- PHP-MySQL
- PHP-gd
- gd
- PHP-config:
- file.managed:
- name: /etc/PHP.INI
- source: salt://init/files/PHP.INI
- user: root
- group: root
- mode: 644
- backup: minion
- MySQL-install:
- pkg.installed:
- names:
- mariadb
- mariadb-server
- MySQL-config:
- file.managed:
- name: /etc/my.cnf
- source: salt://init/files/my.cnf
- user: root
- group: root
- mode: 644
- backup: minion
- MySQL-service:
- service.running:
- name: mariadb
- enable: True
salt 'salt-minion01' state.sls init.lamp saltenv=prod 指定为 prod 环境, 因为默认为 base 环境
通过高级状态进行管理
通过高级状态来管理更方便, 需要在 base 下写 top.sls
- [root@salt-master base]# cat top.sls
- prod:
- 'salt-minion01':
- init.lamp
然后执行 salt 'salt-minion01' state.highstate
查看目录结构
- [root@salt-master base]# tree /srv/salt/
- /srv/salt/
├── base
│ ├── App
│ │ ├── cron.sls
│ │ ├── dir.sls
│ │ ├── dns.sls
│ │ ├── files
│ │ │ ├── httpd_conf.d
│ │ │ │ ├── blog.conf
│ │ │ │ └── www.conf
│ │ │ └── resolv.conf
│ │ ├── httpd.sls
│ │ ├── ln.sls
│ │ ├── service.sls
│ │ ├── vsftpd.sls
│ │ └── xf.sls
│ ├── _grains
│ │ └── my_grains.py
│ ├── top.sls
│ └── top.sls20181121
└── prod
└── init
├── files
│ ├── httpd.conf
│ ├── my.cnf
│ └── PHP.INI
└── lamp.sls
states 状态依赖管理
可以用 state 模块来定义 minion 的状态, 但是如果一个主机涉及多个状态, 并且状态之间有相互关联, 需要在执行顺序上有先后之分, 那么必须引入 requisites 来进行控制.
require 我依赖某个状态, 我依赖谁
require_in 我被某个状态依赖, 谁依赖我
watch 我监控某个状态, 如当状态发生变化时, 就进行 restart 或 reload 操作
watch_in 我被某个状态关注
include 我引用谁
require 写法
- httpd-install:
- pkg.installed:
- names:
- httpd
- httpd-tools
- httpd-config:
- file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://init/files/httpd.conf
- user: root
- group: root
- mode: 644
- backup: minion
- require:
pkg: httpd-install 因为要修改配置需要先安装软件
watch 写法
- httpd-service:
- service.running:
- name: httpd
- enable: True
- reload: True
- require:
- file: httpd-config
- watch:
- file: httpd-config
watch_in 写法
- PHP-config:
- file.managed:
- name: /etc/PHP.INI
- source: salt://init/files/PHP.INI
- user: root
- group: root
- mode: 644
- backup: minion
- watch_in:
- service: httpd-service
利用 include 将 lamp 拆分, 如将 MySQL 拆分出来
- [root@salt-master init]# cat MySQL.sls
- MySQL-install:
- pkg.installed:
- names:
- mariadb
- mariadb-server
- MySQL-config:
- file.managed:
- name: /etc/my.cnf
- source: salt://init/files/my.cnf
- user: root
- group: root
- mode: 644
- backup: minion
- require:
- pkg: MySQL-install
- MySQL-service:
- service.running:
- name: mariadb
- enable: True
- require:
- file: MySQL-config
- [root@salt-master init]# mv lamp.sls apache.sls
在 prod 目录建立 lamp.sls
- [root@salt-master prod]# cat lamp.sls
- include:
- init.apache
- init.MySQL
执行 salt 'salt-minion01' state.sls lamp saltenv=prod
通过高级状态管理: 修改 topfile 文件如下:
- prod:
- 'salt-minion01':
- lamp
Jinja 模板使用
配置文件一般都是固定无法灵活多变, 实际生产过程中, 需要配置文件灵活多变, 不能写死, 有时还需要进行流程控制, 这就需要用到 jinjia, 可以很灵活地进行配置管理及简化配置过程.
Jinja2 模板包含变量和表达式
变量用 {{...}} 包围, 表达式用 {%...%} 包围
看一个简单的例子
- [root@salt-master prod]# cat var.sls
- {
- % set var= 'hello world!' %
- }
- test_var:
- cmd.run:
- name: echo "{{ var }}"
字符串类型
{% set var= 'hello world!' %}
列表类型
- {
- % set list = ['one','two' ] %
- }
- {
- {
- list[1]
- }
- }
字典类型
- {
- % set dict = {
- 'first':'value','second':'value1'
- } %
- }
- {
- {
- dict['first']
- }
- }
Jinja 模板使用步骤
告诉 file 状态模块, 需要使用 jinja
template: jinja
2 列出参数列表
- defaults:
- PORT: 88
3. 配置文件引用 jinja 模板
{{ PORT }}
配置实例, 修改 apache 端口
- httpd-config:
- file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://init/files/httpd.conf
- user: root
- group: root
- mode: 644
- backup: minion
- require:
- pkg: httpd-install
- template: jinja
- defaults:
- PORT: 8000
files 目录下 http 配置文件中将 Listen 80 改为 Listen {{ PORT }}
然后执行 salt 'salt-minion01' state.highstate
查看 minion 端端口已改动
- [root@salt-minion01 ~]# netstat -tnlp|grep 8000
- tcp6 0 0 :::8000 :::* LISTEN 3915/httpd
模板支持 grains pillar 进行赋值
grains 方式
通过 grains 获取 minion 端 IP
- [root@salt-master prod]# salt 'salt-minion01' grains.item fqdn_ip4
- salt-minion01:
- fqdn_ip4:
- - 192.168.132.31
如果想在 http 配置文件中使用 IP:PORT
Listen {{ IPADDR}}:{{ PORT }}
apache 文件中修改
- defaults:
- PORT: 8000
IPADDR: {{ grains['fqdn_ip4'][0]}} --- 取列表中的第一个值即 IP 地址
pillar 方式:
- apache:
- IP: {
- {
- grains['fqdn_ip4'][0]
- }
- }
- PORT: 8008
引用
- {
- {
- pillar['apache'][IP]
- }
- }
- {
- {
- pillar['apache'][port]
- }
- }
实际场景中, 如系统有 CentOS 和 Ubuntu, 都要安装 apache, 由于安装的包不一样, 则可以根据 grains 静态数据, 使用 jinja2 流程控制
- httpd_install:
- pkg.installed:
- template: jinja
- {
- % if grains['os_family'] == 'Debian' %
- }
- name: apache2
- {
- % elif grains['os_family'] == 'RedHat' %
- }
- name: http
- {
- % endif %
- }
saltstack Job 管理
Job 概述
salt 每次运行任务都会将任务发布到 pub-sub 总线, minion 会对任务作出响应, 为区分不同的任务, saltmaster 每次发布一个任务都会为该任务创建一个 jobid.
master 默认情况下会缓存 24 小时内的所有 job 的详细操作
master 缓存目录:/var/cache/salt/master/jobs/
minion 端每次执行任务都会缓存在 / var/cache/salt/minion/proc / 目录下, 任务执行完成后文件会被删除.
在 master 端执行一个长时间的任务
salt 'salt-minion01' cmd.run "sleep 100"
在 minion01 上用 strings 查看文件内容
- [root@salt-minion01 proc]# strings 20181125111411231106
- tgt_type
- glob
- 20181125111411231106
- salt-minion01
- user
- root
- sleep 100
- cmd.run
Job 管理
通过 salt-run 命令来管理 job 也可以通过 salt util 模块
在 master 中执行一个长时间的命令
salt 'salt-minion01' cmd.run "sleep 1000;echo hello"
然后 ctrl+c 结束, 获取 jobid 后登陆查看
salt 'salt-minion01' saltutil.find_job-id
salt 'salt-minion01' saltutil.kill_job jobid 停掉任务
查看 master 上 cache 的所有 job
salt 'salt-minion' saltutil.runner jobs.list_jobs
来源: http://www.bubuko.com/infodetail-2872611.html