这次主要介绍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 因为要修改配置需要先安装软件
- names:
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