saltstack03的配置管理

官网教程:https://docs.saltproject.io/en/latest/topics/states/index.html

注意:配置管理表示的是状态,是可以多次运行的,比如执行某个命令如创建目录,如果不添加相关限制参数,那么每次执行都会执行创建这个目录。配置文件即sls文件,以.sls为后缀的文件,表示saltstack status的缩写。

状态模块列表文档:https://docs.saltproject.io/en/latest/ref/states/all/index.html#all-salt-states

状态文件的目录在master配置文件中设置,top file只能放在base目录下,放在其他环境的路径下无效

vim /etc/salt/master.d/file_roots.conf
file_roots:
  base:
    - /data/salt/sls/base
  test:
    - /data/salt/sls/test
  prod:
    - /data/salt/sls/prod

例子:

复制代码
#在minions端的文件名
/etc/http/conf/http.conf:
#ID声明,必须唯一,可不写,可以通过include引用
#file_create:
  file.managed:
    - source: salt://apache/http.conf
    - user: root
    - group: root
    - mode: 644
    - attrs: ai
    - template: jinja
    - defaults:
        custom_var: "default value"
        other_var: 123
#Jinja2模板
{% if grains['os'] == 'Ubuntu' %}
    - context:
        custom_var: "override"
{% endif %}
复制代码

top file是入口文件,定义了不同环境(base)下不同minion(10.12.20.*)执行的自定义的状态文件(apache)

vim /data/salt/sls/base/top.sls

base:
  '10.12.20.*':
    - apache

假设编写一个dns的状态文件

salt://代表相对于当前环境的路径,salt://files/resolv.conf相当于/data/salt/sls/base/files/resolv.conf。或者也可以使用http(s)://ftp:// 从网络上下载配置

vim /data/salt/sls/base/dns.sls
/etc/resolv.conf:
  file.managed:
#salt://代表相对于当前环境的路径,salt://files/resolv.conf相当于/data/salt/sls/base/files/resolv.conf
    - source: salt://files/resolv.conf
    - user: root
    - group: root
    - mode: 644

可以直接执行salt命令

salt '*14' state.sls dns

也可以使用top file执行salt命令

#编辑top文件
vim top.sls
base:
  '*14':
    - dns
#执行top文件
salt '*' state.highstate

1.模板

在sls中有- template: jinja参数的是模板,还需要一个变量列表defaults,这个变量会写入到对应文件中

复制代码
vim /data/salt/sls/base/dns.sls
/etc/resolv.conf: file.managed: #salt://代表相对于当前环境的路径,salt://files/resolv.conf相当于/data/salt/sls/base/files/resolv.conf - source: salt://files/resolv.conf - user: root - group: root - mode: 644 - template: jinja - defaults: DNS_SERVER: 10.12.7.42
复制代码

然后在对应的文件里用{{ }}使用变量

vim /data/salt/sls/base/files/resolv.conf
nameserver {{ DNS_SERVER }}
#还可以使用grains,Pillar,执行模块(执行模块生成的值就是变量的值)
# {{ grains['fqdn_ip4'] }}
# {{ pillar['apache']['Port'] }}
# {{ salt['network.hw_addr']('etho') }}

 2.系统初始化

系统初始化的状态文件可以放在base环境下

2.1history记录时间

其中file.append是在文件中追加内容,他会判断之前是否追加过某条语句,没有添加过的才会再追加,已经追加过的再次执行salt命令不会有变更

当执行history时,将用户、用户IP和操作时间都记录下来命令

vim /data/salt/sls/base/init/history.sls
/etc/bashrc:
  file.append:
    - text:
      - USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
      - export HISTTIMEFORMAT="[%F %T][`whoami`][${USER_IP}]"

执行salt命令

salt '*14' state.sls init/history

 

2.2系统执行命令记录命令到/var/log/message日志文件中,包含用户及ip

vim /data/salt/sls/base/init/audit.sls
/etc/bashrc:
  file.append:
    - text:
      - export PROMPT_COMMAND=\
'{ msg=$(history 1 | { read x y ; echo $y ;});\
logger "[euid=$(whoami)]":$(who am i):[`pwd`]" $msg";}'

2.3内核参数调优

内核调优使用sysctl模块https://docs.saltproject.io/en/latest/ref/states/all/salt.states.sysctl.html#module-salt.states.sysctl

复制代码
vim /data/salt/sls/base/init/sysctl.sls

#不使用交换分区
vm.swappiness:
  sysctl.present:
    - value: 0
#修改可用端口范围
#其范围可用通过cat /proc/sys/net/ipv4/ip_local_port_range 来查看
net.ipv4.ip_local_port_range:
  sysctl.present:
    - value: 32768   60999
#最大文件描述符
#通过cat /proc/sys/fs/file-max查看
fs.file-max:
  sysctl.present:
    - value: 52706963
复制代码

sls文件太多,除了一个个在top file里添加还可以建一个sls文件将这些sls文件都include进去,然后在top文件里开启这个sls文件

vim /data/salt/sls/base/init/env_init.sls
include:
  - init.dns
  - init.history
  - init.audit
  - init.sysctl

然后在top文件里添加

vim /data/salt/sls/base/top.sls
base:
  '*14':
    - init.env_init

执行top文件(高状态),test=True代表模拟运行

salt  "*" state.highstate test=True

 3.功能模块

haproxy的安装

复制代码
vim /data/salt/sls/prod/haproxy/install.sls
#salt代表当前环境即/data/salt/sls/prod/,源文件为其下的haproxy/files/haproxy-1.6.2.tar.gz文件
      #haproxy-install中的file命令,每个命令ID如haproxy-install下只能有且只有一个每种函数,如file只能有一个,所以使用file: haproxy-install可以唯一确定到/usr/local/src/haproxy-1.6.2.tar.gz这个命令
    - user: root
#include其他sls文件
include:
  - pkg.pkg-init

#执行不分顺序,会读完整个sls文件之后再按照条件进行部署
#ID名为haproxy-install,为安装过程,包括拷贝tar包文件和运行安装命令
haproxy-install:
  #拷贝tar包
  file.managed:
    #dst文件路径:文件在minion上的路径
    - name: /usr/local/src/haproxy-1.6.2.tar.gz
    #src文件路径:文件在master上的路径
    #salt代表当前环境即/data/salt/sls/prod/,源文件为其下的haproxy/files/haproxy-1.6.2.tar.gz文件
    - source: salt://haproxy/files/haproxy-1.6.2.tar.gz
    - user: root
    - group: root
    - node: 755
  #运行安装命令
  cmd.run:
    #需要执行的命令在name中写
    - name: cd /usr/local/src && tar zxf haproxy-1.6.2.tar.gz && cd haproxy-1.6.2 && make TARGET=linux26 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy
    #如果没有/usr/local/haproxy文件的话执行上述命令
    - unless: test -d /usr/local/haproxy
    #该命令依赖于下面的条件,必须首先执行下列命令才能执行该命令
    - require:
      #pkg初始命令
      - pkg: pkg-init
      #haproxy-install中的file命令,每个命令ID如haproxy-install下只能有且只有一个每种函数,如file只能有一个,所以使用file: haproxy-install可以唯一确定到/usr/local/src/haproxy-1.6.2.tar.gz这个命令
      - file: haproxy-install

#创建配置文件目录
haproxy-config-dir:
  file.directory:
    - name: /etc/haproxy
    - user: root
    - group: root
    - mode: 755

#haproxy的初始化
haproxy-init:
  #拷贝haproxy的启动配置文件
  file.managed:
    - name: /etc/init.d/haproxy
    - source: salt://haproxy/files/haproxy.init
    - user: root
    - group: root
    - mode: 755
    #需求先安装了haproxy,然后才执行拷贝配置文件
    - requires:
      - cmd: haproxy-install
  cmd.run:
      #添加开机自启动
      - name: chkconfig --add haproxy
      #如果haproxy没有在开机自启动列表中
      - unless: chkconfig -- list | grep haproxy
      #需要先执行拷贝配置文件,再添加开机自启动
      - require: 
        - file: haproxy-init
复制代码

 执行salt命令,如果不是base环境,需要使用env=prod来指定对应的环境

salt '*.14' state.sls haproxy.install env=prod

 4.业务引用haproxy

配置启动haproxy

复制代码
vim /data/salt/sls/prod/cluster/haproxy-outside.sls 

#载入haproxy文件夹下的install模块
include:
  - haproxy.install

haproxy-service:
#拷贝配置文件
  file.managed:
    - name: /etc/haproxy/haproxy.cfg
    - source: salt://cluster/files/haproxy-outside.cfg
    - user: root
    - group: root
    - mode: 644
#启动haproxy
  service.running:
    - name: haproxy
    - enable: True
    - reload: True
    - require:
    #需要首先将启动文件添加到系统里
      - cmd: haproxy-init
    #watch监控,haproxy-service中的文件变更,会执行reload,如果上方没有reload: True或者系统不支持reload,则文件变更会执行restart。
    - watch:
      - file: haproxy-service
复制代码

编辑top文件

复制代码
vim /data/salt/sls/base/top.sls

base:
  '*14':
    - init.env_init
#prod环境
prod:
  '*14':
    #cluster文件夹下的haproxy-outside模块
    - cluster.haproxy-outside
  '*13':
    - cluster.haproxy-outside
复制代码

执行top文件

salt '*' state.hightstate

keepalive的安装与启动与haproxy相似,但是keepalive的配置文件不同的服务器是不同的需要在keeaplived.conf配置文件中用到模板参数。router_id {{ ROUTEID }} / state {{ STATEID }} / priority {{ PRIORITYID }}

整个的keepalived启动文件为:

复制代码
vim /data/salt/sls/prod/cluster/haproxy-outside-keepalived.sls 

include:
  - keepalived.install

keepalived-service:
  #复制配置文件
  file.managed:
    - name: /etc/keepalived/keepalived.conf
    - source: salt://cluster/files/haproxy-outside-keepalived.conf
    - user: root
    - group: root
    - mode: 644
    #添加模板
    - template: jinja
    #如果id为13则给模板参数赋下面的值
    {% if grains['id'] == '10.12.20.13' %}
    - ROUTEID: haproxy_ha
    - STATEID: MASTER
    - PRIORITYID: 150
    {% if grains['id'] = ='10.12.20.14' %}
    - ROUTEID: haproxy_ha
    - STATEID: BACKUP
    - PRIORITYID: 100
  #启动服务,不支持reload
  service.running:
    - name: keepalived
    - enable: True
    - require:
    #需要首先将启动文件添加到系统里
      - cmd: keepalived-init
    #watch监控,keepalived-service中的文件变更,会执行reload,如果上方没有reload: True或者系统不支持reload,则文件变更会执行restart。
    - watch:
      - file: keepalived-service
复制代码

 zabbix的配置使用到pillar,其中pillar配置文件的位置在master配置文件/etc/salt/master.d/pillar.conf 中指定为/srv/pillar/

pillar参数的配置

vim /srv/pillar/zabbix.sls

zabbix-agent:
  Zabbix_Server: 10.0.0.7

在pillar的top文件中写入zabbix

vim /srv/pillar/top.sls 

base:
  '*':
    - zabbix

在zabbix的sls中引用pillar参数

复制代码
vim /data/salt/sls/base/init/zabbix_agent.sls 

zabbix-agent-install:
  pkg.installed:
    - name: zabbix-agent
  file.managed:
    - name: /etc/zabbix_agentd.conf
    - source: salt://init/files/zabbix_agentd.conf
    - template: jinja
    - defaults:
      #Server是配置文件中的变量,{{}}中的是pillar的变量
      Server: {{ pillar['zabbix-agent']['Zabbix_Server'] }}
    - require:
      - pkg: zabbix-agent-install
  service.running:
    - name: zabbix-agent
    - enable: True
    - watch:
      - pkg: zabbix-agent-install
复制代码

 

在/data/salt/sls/base/init/files/zabbix_agentd.conf中将原来的配置Server:10.0.0.7改为Server:{{ Server }}

在env文件中添加zabbix

vim /data/salt/sls/base/init/env_init.sls 

include:
  - init.dns
  - init.history
  - init.audit
  - init.sysctl
  - init.zabbix_agent

原本在/data/salt/sls/base/top.sls 中已经添加了init.env_init,所以直接执行top文件

salt '*' state.hightstate

 

posted @   潇潇暮鱼鱼  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2023-03-07 ansible关闭公钥认证的两种方法
点击右上角即可分享
微信分享提示