Saltstack学习(四)-state状态模块及配置管理
一、state状态模块
1.1、状态模块简介
States是SaltStack系统中的配置语言,在日常运维中需要编写大量的States文件,例如:创建用户、安装软件、配置软件、服务运行等。需要编写一些States SLS文件,即状态配置文件去描述和实现相应的功能。States SLS主使用YAML语言,也可以支持使用Python语言编写。
apache-install: #ID声明,ID必须唯一
pkg.installed: #State状态声明
- names: #选项声明
- httpd #选项列表
- httpd-devel
apache-service:
service.running:
- name: httpd
- enable: True
#一个ID只能出现一次
#一个ID下相同模块只能使用一次
#一个ID下可以使用多个不同模块查找状态模块:https://docs.saltstack.com/en/latest/ref/states/all
[root@salt-master ~]# salt 'salt-minion1-c7' sys.list_modules #列出所有状态模块
[root@salt-master ~]# salt 'salt-minion1-c7' sys.list_state_functions pkg #查看状态模块中支持的函数
salt-minion1-c7:
- 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.uptodate1.2、常用状态模块
1.2.1、pkg模块
文档:https://docs.saltstack.com/en/latest/ref/states/all/salt.states.pkg.html#module-salt.states.pkg
1)软件安装
mypkgs:
pkg.installed:
- pkgs:
- httpd
- httpd-tools: '>=2.4.6' #指定相应的版本2)指定安装的rpm来源
mypkgs:
pkg.installed:
- sources:
- foo: salt://rpms/foo.rpm
- bar: http://somesite.org/bar.rpm
- qux: ftp://somesite.org/qux.rpm3)指定安装最新的版本
mypkgs:
pkg.latest:
- pkgs:
- httpd
- httpd-tools1.2.2、file模块
文档:https://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html#module-salt.states.file
1)file.managed下发文件,确保文件存在
/etc/resolv.conf:
file.managed:
- source: salt://files/resolv.conf.defaults
- user: root
- group: root
- mode: 644
- backup: minion2)file.directory建立目录
/tmp/dns:
file.directory:
- user: root
- group: root
- mode: 755
- makedirs: True3)file.recurse下发整个目录
nginx-vhost-config:
file.recurse:
- name: /etc/nginx/conf.d
- source: salt://app/files/nginx_conf.d
- file_mode: 600 #文件权限
- dir_mode: 777 #目录权限
- include_empty: True #同步空目录
- clean: True #使用后minion与master强制一致4)file.symlink建立软连接
/etc/target.conf: #目标
file.symlink:
- target: /etc/grub2.cfg #源1.2.3、service模块
redis-service:
service.running:
- enable: True #开机自启动
- reload: True #允许重载,不写则是restart
- watch: #我监控谁
- pkg.redis-files1.2.4、cron模块
crontab_scripts:
cron.present:
- name: bash /scripts/nginx.sh &>/dev/null
- user: root
- minute: '*/5'1.3、高级状态模块
top.sls默认从base标签开始解析执行,下一级是操作的目标,可以通过正则,grain模块,或分组名,来进行匹配,再下一级是要执行的state文件
topfile实例:
base:
'*': #通过正则去匹配所有minion
- app.nginx
webserver: #定义的分组名称
- match: nodegroup
- app.cron
'os:centos': #通过grains模块匹配
- match: grains
- nginx 执行方式:
salt '*' state.highstate
二、配置管理实例-LAMP及redis主从
2.1、状态依赖及关联
主机涉及多个状态时,状态之间可能有相互关联,需要决定先后执行顺序,解决依赖关系
require 我依赖某个状态, 我依赖谁 require_in 我被某个状态依赖, 谁依赖我 watch 我关注某个状态, 当状态发生改变,进行restart或reload操作 watch_in 我被某个状态关注 include 我引用谁
2.2、LAMP架构实现
1)编辑master主配置文件
[root@salt-master ~]# vim /etc/salt/master
file_roots:
base:
- /srv/salt/base
prod:
- /srv/salt/prod
[root@salt-master ~]# systemctl restart salt-master
2)创建相关目录
[root@salt-master salt]# tree
.
├── base
└── prod
├── apache
├── mysql
└── php3)先手动安装,便于提取文件
[root@salt-master ~]# yum -y install httpd mariadb-server php php-mysql php-gd gd
4)准备相应目录及文件
#目录结构
[root@salt-master salt]# tree /srv/salt/
/srv/salt/
├── base
│ └── top.sls
└── prod
├── apache
│ ├── files
│ │ └── httpd.conf
│ └── init.sls
├── lamp.sls
├── mysql
│ ├── files
│ │ └── my.cnf
│ └── init.sls
└── php
├── files
│ └── php.ini
└── init.sls
#apache配置文件
[root@salt-master salt]# cat prod/apache/init.sls
apache-install:
pkg.installed:
- name: httpd
apache-config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- user: root
- group: root
- mode: 644
- backup: minion
- require:
- pkg: apache-install
apache-service:
service.running:
- name: httpd
- enable: True
- reload: True
- require:
- file: apache-config
- watch:
- file: apache-config
#php配置文件
[root@salt-master salt]# cat prod/php/init.sls
php-install:
pkg.installed:
- pkgs:
- php
- php-pdo
- php-mysql
- php-gd
- gd
- require_in:
- file: php-config
php-config:
file.managed:
- name: /etc/php.ini
- source: salt://php/files/php.ini
- user: root
- group: root
- mode: 644
- backup: minion
- watch_in:
-service: apache-service
#mysql配置文件
[root@salt-master salt]# cat prod/mysql/init.sls
mysql-install:
pkg.installed:
- pkgs:
- mariadb
- mariadb-server
mysql-config:
file.managed:
- name: /etc/my.cnf
- source: salt://mysql/files/my.cnf
- user: root
- group: root
- mode: 644
- backup: minion
- reqiure:
- pkg: mysql-install
mysql-service:
service.running:
- name: mariadb
- enable: True
- reload: True
- require:
- file: mysql-config
- watch:
- file: mysql-config
#lamp配置文件
[root@salt-master salt]# cat prod/lamp.sls
include:
- apache.init
- php.init
- mysql.init
#topfile文件,需要定义在base中
[root@salt-master salt]# cat base/top.sls
prod:
'salt-minion3-c7':
- lamp执行需要注意:
[root@salt-master salt]# salt 'salt-minion3*' state.highstate test=True #正式执行之前先干跑下 [root@salt-master salt]# salt 'salt-minion3*' state.highstate #正式执行 #执行单个模块,如apache [root@salt-master salt]# salt 'salt-minion3*' state.sls apache.init saltenv=prod #需要指定环境
2.3、redis主从实现
先手工配置,然后写sls配置文件
1)redis目录结构
[root@salt-master prod]# tree redis redis ├── files │ └── redis.conf ├── init.sls ├── master.sls └── slave.sls
2)相关配置文件
[root@salt-master redis]# cat init.sls
redis-install:
pkg.installed:
- name: redis
redis-config:
file.managed:
- name: /etc/redis.conf
- source: salt://redis/files/redis.conf
- user: root
- group: root
- mode: 644
- backup: minion
- template: jinja
- defaults:
PORT: 6379
IPADDR: {{ grains['fqdn_ip4'][0] }}
redis-service:
service.running:
- name: redis
- enable: True
- reload: True
- watch:
- file: redis-config
#master配置文件
[root@salt-master redis]# cat master.sls
include:
- redis.init
#slave配置文件,需要配置主从
[root@salt-master redis]# cat slave.sls
include:
- redis.init
salve-config:
cmd.run:
- name: redis-cli -h 10.0.0.22 slaveof 10.0.0.21 6379
- unless: redis-cli -h 10.0.0.22 info|grep role:slave
- require:
- service: redis-service
#topfile文件
[root@salt-master redis]# cat /srv/salt/base/top.sls
#prod:
# 'salt-minion2-c7':
# - lamp
prod:
'salt-minion1-c7':
- lamp
- redis.master
'salt-minion2-c7':
- lamp
- redis.slave
'salt-minion3-c7':
- lamp三、Jinja模板的使用
当配置文件需要根据主机的不同而改变时,就需要使用jinja模板,这样更加灵活
jinja使用变量{{….}}和表达式{%….%}
jinja中文文档:http://docs.jinkan.org/docs/jinja2/
3.1、jinja变量
1)字符串类型
{% set var = 'good' %} #定义变量
{{ var }} #调用变量2)列表类型
{% set list = ['one', 'two', 'three'] %}
{{ list[1] }} #最终显示one3)字典类型
{% set dict = {'first': 'value1', 'second': 'value2'} %}
{{ dict['first'] }}3.2、使用jinja模板步骤
通用步骤:
#1.告诉file状态模块, 需要使用jinja
- template: jinja
#2.列出参数列表
- defaults:
PORT: 88
#3.配置文件引用jinja模板
{{ PORT }}配置示例:
# 配置示例
httpd-config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://init/files/httpd.conf
- backup: minion
- template: jinja
- defaults:
PORT: 9000
# 修改httpd.conf配置文件引用变量
Listen {{ PORT }}3.3、使用grains,pillar赋值
1)使用grains赋值
#配置httpd模板
Listen {{ grains['fqdn_ip4'][0] }}:{{ PORT }} #salt '*' grains.item fqdn_ip4或者salt '*' grains.get fqdn_ip4获取
#编辑sls文件
[root@salt-master apache]# vim init.sls #添加
- template: jinja
IP: {{ grains['fqdn_ip4'][0] }}
PORT: 8080
#测试
[root@salt-master apache]# salt -S '10.0.0.21' state.sls apache.init saltenv=prod示例:使用jinja+grains安装不同系统的apache
httpd_install:
pkg.installed:
{% if grains['os_family'] == 'Debian' %}
- name: apache2
{% elif grains['os_family'] == 'RedHat' %}
- name: httpd
{% endif %}2)使用pillar赋值
#master打开pillar
[root@salt-master pillar]# vim /etc/salt/master
pillar_roots:
base:
- /srv/pillar
#编写pillar文件
[root@salt-master pillar]# cat apache.sls
apache:
IP: {{ grains['fqdn_ip4'][0] }}
PORT: 8090
[root@salt-master pillar]# cat top.sls
base:
'salt-minion1-c7':
- zabbix
- apache #添加
#模板及sls文件调用
[root@salt-master apache]# vim init.sls
- template: jinja
IP: {{ pillar['apache']['IP'] }} #注意需要加引号,否则报Jinja variable 'IP' is undefined
PORT: {{ pillar['apache']['PORT'] }}
#httpd模板
Listen {{ IP }}:{{ PORT }}四、Salt Job管理
4.1、salt job概述
salt每次运行任务都会将任务发布到pub-sub总线,minion会对任务作出响应,为区分不同的任务SaltMaster每次发布一个任务都会为该任务创建一个jobid。
master默认情况下会缓存24小时内的所有job的详细操作。/etc/salt/master中keep_jobs控制
master缓存目录:/var/cache/salt/master/jobs/
minion缓存目录:/var/cache/salt/minion/proc,会创建以jobid为名称的文件
#master上执行 [root@salt-master apache]# salt '*' cmd.run "sleep 100" #minion上测试 [root@salt-minion1-c7 conf]# ls /var/cache/salt/minion/proc 20190831231027455618 [root@salt-minion1-c7 conf]# strings /var/cache/salt/minion/proc/20190831231027455618 tgt_type glob 20190831231027455618 user root sleep 100 cmd.run
4.2、job管理
可以使用saltutil模块来管理job
#master上执行一个长时间命令 [root@salt-master ~]# salt '*' cmd.run "sleep 100" #新开一个master端口,查看正在运行的jobs [root@salt-master ~]# salt '*' saltutil.running #通过saltutil.find_job查看相关job信息 [root@salt-master ~]# salt '*' saltutil.find_job 20190831232203795443 #kill掉指定的job [root@salt-master ~]# salt '*' saltutil.kill_job 20190831232203795443
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!

浙公网安备 33010602011771号