Saltstack学习(四)-state状态模块及配置管理

一、state状态模块

1.1、状态模块简介

StatesSaltStack系统中的配置语言,在日常运维中需要编写大量的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
posted @ 2019-08-31 15:12  运维人在路上  阅读(1281)  评论(1编辑  收藏  举报