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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2023-03-07 ansible关闭公钥认证的两种方法