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.uptodate
1.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.rpm
3)指定安装最新的版本
mypkgs: pkg.latest: - pkgs: - httpd - httpd-tools
1.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: minion
2)file.directory建立目录
/tmp/dns: file.directory: - user: root - group: root - mode: 755 - makedirs: True
3)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-files
1.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 └── php
3)先手动安装,便于提取文件
[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] }} #最终显示one
3)字典类型
{% 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
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!