saltstack - 配置管理(二)
一,小试牛刀
配置管理,基本都是基于远程管理的,本次学习状态管理 (states 模块) 中的文件管理
官方:https://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html#module-salt.states.file
1,基本的文件管理
实例:把 master 主机的某个文件同步到所有的minion 主机的某个目录下
把master 主机的 /srv/salt/base/files/resolv.conf 文件同步到所有minion 主机的 /etc/resolv.conf 中。
1,先对 master 的配置文件进行修改:修改如下
file_roots:
base:
- /srv/salt/base
test:
- /srv/salt/test
prod:
- /srv/salt/prod
在 /srv/salt 目录下,建立3个文件夹,base ,test,prod。
2, 在master 主机上 写一个dns 的文件管理,如下:(yaml 语法)
vi /srv/salt/base/dns.sls
/etc/resolv.conf:
file.managed:
- source: salt://files/resolv.conf
- user: root
- group: root
- mode: 644
需:mkdir -p /srv/salt/base/files/
cp /etc/resolv.conf /srv/salt/base/files/
执行命令:salt '*' state.sls dns
3,通过 top 入口执行。(通过高级状态执行top)
编辑:/srv/salt/base/top.sls
base:
'*':
- dns
执行命令: salt '*' state.highstate
由 master 主机推送 master 主机上的/srv/salt/base/files/resolv.conf 文件到 minion 主机 的 /etc/resolv.conf 下。
二,实例使用场景
本次 saltstack 的实例架构如下图:

分别有 haproxy , nginx ,php,memcacheed 等。
可以从3个方面下手:
1, 系统初始化
2, 功能模块
3, 业务模块
1,配置DNS
首先需要配置一个 Jinja 模板,定义dns 的配置文件。
1,在 /srv/salt/base 目录下,修改 dns.sls ,如下:
/etc/resolv.conf:
file.managed:
- source: salt://files/resolv.conf
- user: root
- group: root
- mode: 644
- template: jinja
- defaults:
DNS_SERVER: 192.168.204.2
2,在/srv/salt/base/files 目录下,修改 resolv.conf 文件,如下:
##################
search localdomain
nameserver {{ DNS_SERVER }}
其中 {{ 变量 }} 内变量 是上面jinja 文件中定义好的。
3, 也可以在定义的模板中,引用 grains 。
比如:在 /srv/salt/base/files/resolv.conf 文件中加入:
##################
## {{ grains['fqdn_ip4'] }}
search localdomain
nameserver {{ DNS_SERVER }}
4,执行命令,由 master 主机推送 master 主机上的/srv/salt/base/files/resolv.conf 文件到 minion 主机 的 /etc/resolv.conf 下。
cd /rv/salt/base
salt '*' state.sls dns
2,系统初始化
2.1,初始化准备工作
1,系统初始化的建议放在 /srv/salt/base 目录下。
2,在 /srv/salt/base 目录下建 一个 init 的文件夹。
3,在/srv/salt/base/init 目录下建立一个 files 文件夹。
4, 拷贝/etc/resolv.conf 到 目录 /srv/salt/base/init/files 目录下
5, 在 /srv/salt/base/init 目录下新建一个 dns.sls 文件,内容如下:
/etc/resolv.conf:
file.managed:
- source: salt://init/files/resolv.conf
- user: root
- group: root
- mode: 644
2.2,开始初始化
初始化 —— 给linux 系统的 history 增加时间记录,以便识别是谁操作,什么时间操作。
1,在 /srv/salt/base/init 目录下新建一个 history.sls ,用来记录操作的时间,文件内容如下:
/etc/profile:
file.append:
- text:
- export HISTTIMEFORMAT="%F %T `whoami`"
2,把操作记录写入 /var/log/messages 中,在 /srv/salt/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";}'
3,对内核参数进行调优,不适合通过 文件模式 进行修改,应该通过 sysctl 模块进行修改。
在 /srv/salt/base/init 目录下新建一个 sysctl.sls 文件,内容如下:
vm.swappiness:
sysctl.present:
- value: 0
net.ipv4.ip_local_port_range :
sysctl.present:
- value: 10000 65000
fs.file-max:
sysctl.present:
- value: 100000
其中:net.ipv4.ip_local_port_range : 是对 /proc/sys/net/ipv4/ip_local_port_range 的参数进行修改。如下

其中:fs.file-max: 是对/proc/sys/fs/file-max 文件的内容进行修改。
4,通过 top 入口文件引用上面的 sls 。
在 /srv/salt/base/init 目录下新建一个 env_init.sls 文件,用于top 引用该文件。
include:
- init.dns
- init.history
- init.audit
- init.sysctl
在 /srv/salt/base/ 目录下,新建一个 top.sls 的文件,其内容如下:
base:
'*':
- init.env_init
5, 执行 状态
salt '*' state.highstate test=True (加上 test=True 是测试)
salt '*' state.highstate
给所有的 minion 主机的history 添加时间记录,并修改内核参数等。
3,功能模块编写
3.1,Haproxy 安装思路
1,先解决 haproxy 源码包安装依赖包,
2,把haproxy 源码包拷贝到 minion 主机上
3,对haproxy 进行解压,编译安装。
4,由于其指定安装的路径是/usr/local/haproxy 跟默认安装路径/usr/sbin 有差异,因此需要修改启动脚本。
5,把 haproxy 启动脚本拷贝到minion 主机上,并加入服务中。
6,修改内核参数,允许其他主机监听本机IP地址。
7,创建 /etc/haproxy 的配置文件目录
3.2,Haproxy 执行安装
创建 haproxy 功能模块,用于安装haproxy。
1,准备工作
下载 haproxy 的源码包
解压 haproxy 源码包,先进行安装,测试是否可以安装。
haproxy-1.8.10.tar.gz 放置在 /root/haproxy-1.8.10.tar.gz
tar -xzvf haproxy-1.8.10.tar.gz
cd haproxy-1.8.10
make TARGET=linux2628 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
cd /root/haproxy-1.8.10/examples
vi haproxy.init (修改 BIN=/usr/sbin/$BASENAME 为下面的)
BIN=/usr/local/haproxy/sbin/$BASENAME
2,创建目录:
mkdir -p /srv/salt/prod/pkg
mkdir -p /srv/salt/prod/haproxy
mkdir -p /srv/salt/prod/haproxy/files
3,创建 pkg-init.sls (安装haproxy 源码包前,解决其依赖的包)
vi /srv/salt/prod/pkg/pkg-init.sls
pkg-init:
pkg.installed:
- names:
- gcc
- gcc-c++
- glibc
- make
- autoconf
- openssl
- openssl-devel
4,拷贝haproxy-1.8.10.tar.gz 和 haproxy 的启动文件 到 /srv/salt/prod/haproxy/files 目录下:
cp /root/haproxy-1.8.10/examples/haproxy.init /srv/salt/prod/haproxy/files/
cp /root/haproxy-1.8.10.tar.gz /srv/salt/prod/haproxy/files/
5,编写 harpoxy 的安装 install.sls 文件。
vi /srv/salt/prod/haproxy/install.sls
include: (引入其他的sls,因为安装haproxy 需要其他的依赖包)
- pkg.pkg-init
haproxy-install: (自定义ID名称)
file.managed: (文件管理,每个ID只能有一个file.managed,需把master主机上的haproxy 包传到 minion 主机上)
- name: /usr/local/src/haproxy-1.8.10.tar.gz (拷贝到minion 主机 上的路径)
- source: salt://haproxy/files/haproxy-1.8.10.tar.gz (haproxy 包所在 master 主机路径)
- user: root
- group: root
- mode: 755
cmd.run: (- name 内容中,是执行的命令)
- name: cd /usr/local/src/ && tar -xzvf haproxy-1.8.10.tar.gz && cd haproxy-1.8.10 && make TARGET=linux2628 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/
local/haproxy
- unless: test -d /usr/local/haproxy (检查这个目录是否存在,存在返回True,则不执行安装,返回false 则执行安装)
- require: (依赖模块,cmd.run 要执行,先判断其依赖的东西是否存在,存在,在执行)
- pkg: pkg-init (依赖上面的pkg-init.sls 的安装包是否已安装好)
- file: haproxy-install (依赖haproxy-install 中的/usr/local/src/haproxy-1.8.10.tar.gz 是否存在)
haproxy-init:
file.managed: (拷贝master 上的haproxy 启动脚本到 minion 主机上)
- name: /etc/init.d/haproxy
- source: salt://haproxy/files/haproxy.init
- user: root
- group: root
- mode: 755
- require:
- cmd: haproxy-install
cmd.run: (把haproxy 启动脚本加入服务中)
- name: chkconfig --add haproxy
- unless: chkconfig --list | grep haproxy
- require:
- file: haproxy-init (依赖 /etc/init.d/haproxy 文件是否存在)
net.ipv4.ip_nonlocal_bind: (修改内核参数,允许其他主机监听本机的IP地址)
sysctl.present:
- value: 1
haproxy-config-dir: (创建haproxy 配置目录)
file.directory:
- name: /etc/haproxy
- user: root
- group: root
- mode: 755
6,执行 install.sls
salt '*' state.sls haproxy.install saltenv=prod
(saltenv=prod 默认时候执行base 环境的,因此需要指定是 prod 环境)
3.3,Haproxy 业务引用,配置主从
1,创建集群文件夹
mkdir -p /srv/salt/prod/cluester
mkdir -p /srv/salt/prod/cluester/files
2,写 haproxy 配置文件cfg
vi /srv/salt/prod/cluester/files/haproxy-outside.cfg (负责均衡的配置文件)
针对:bind 0.0.0.0:8888
frontend www
bind 192.168.204.128:81 (这里理论是 keepalived 的虚 IP 地址)
haproxy-outside.cfg 文件内容如下:
global
chroot /usr/local/haproxy
user root
group root
log 127.0.0.1:514 local0 warning
pidfile /var/lib/haproxy.pid
maxconn 20000
nbproc 1
defaults
mode http
retries 3
timeout connect 10s
timeout client 20s
timeout server 30s
timeout check 5s
option http-keep-alive
listen stats
mode http
bind 0.0.0.0:8888
stats enable
stats uri /haproxy-status
stats auth admin:123456
frontend www
bind 192.168.204.128:81 (监听的端口,这里需要写虚IP 地址 )
mode http
option httplog
log global
default_backend htmpool
backend htmpool
mode http
option forwardfor header X-REAL-IP
option httpchk HEAD / HTTP/1.0
balance roundrobin (轮询模式)
server web-node1 192.168.204.128:80 check inter 2000 rise 30 fall 15
server web-node2 192.168.204.128:8080 check inter 2000 rise 30 fall 15
3,写 haproxy 的sls 文件。
vi /srv/salt/prod/cluester/haproxy-outside.sls
include:
- haproxy.install
haproxy-service:
file.managed:
- name: /etc/haproxy/haproxy.cfg
- source: salt://cluster/files/haproxy-outside.cfg
- user: root
- group: root
- mode: 755
service.running: (启动服务)
- name: haproxy
- enable: True
- reload: True
- require:
- cmd: haproxy-init
- watch: (关注某个点,如果某个点发生变化,则处理他)
- file: haproxy-service
4,执行 sls 文件
在 /srv/salt/prod/cluester/ 目录下 执行下面命令
salt '*' state.sls cluster.haproxy-outside saltenv=prod
5,通过 base 的 top 入口文件 执行:
vi /srv/salt/base/top.sls
base:
'*':
- init.env_init
prod:
'*':
- cluster.haproxy-outside
然后执行: salt '*' state.highstate (可以先加上 test=True 进行测试)
3.4,keepalived 安装模块编写
1,准备工作
1),下载 keepalived 源码包
wget http://www.keepalived.org/software/keepalived-1.2.22.tar.gz
2),先测试下该 keepalived 源码包是否可以安装。
tar -xzvf keepalived-1.2.22.tar.gz
cd keepalived-1.2.22
./configure --prefix=/usr/local/keepalived --disable-fwmark
make
make install
2,创建配置目录
mkdir -p /srv/salt/prod/keepalived
mkdir -p /srv/salt/prod/keepalived/files
3,拷贝keepalived 的源码包,配置文件,启动文件到 files 目录下
1),cp /root/keepalived-1.2.22/keepalived/etc/keepalived/keepalived.conf /srv/salt/prod/keepalived/files/
2),cp /root/keepalived-1.2.22/keepalived/etc/init.d/keepalived.init /srv/salt/prod/keepalived/files/
3),修改 /srv/salt/prod/keepalived/files/keepalived.init 脚本中的,安装路径。
修改前:daemon keepalived
修改后:daemon /usr/local/keepalived/sbin/keepalived
4),cp /root/keepalived-1.2.22.tar.gz /srv/salt/prod/keepalived/files/
5),cp /root/keepalived-1.2.22/keepalived/etc/init.d/keepalived.sysconfig /srv/salt/prod/keepalived/files/

4,创建 install.sls 文件
cd /srv/salt/prod/keepalived 目录
编写 install.sls 文件,文件内容如下:
include: (引入 pkg 中的 pkg-init.sls 文件)
- pkg.pkg-init
keepalived-install: (自定义的ID,安装keepalived)
file.managed:
- name: /usr/local/src/keepalived-1.2.22.tar.gz (上传到minion主机的目录)
- source: salt://keepalived/files/keepalived-1.2.22.tar.gz (这是当前master 上的源码包目录)
- user: root
- group: root
- mode: 755
cmd.run: (- name 是执行命令)
- name: cd /usr/local/src/ && tar -xzvf keepalived-1.2.22.tar.gz && cd keepalived-1.2.22 && ./configure --prefix=/usr/local/keepalived --disable-fwmark && make && make install
- unless: test -d /usr/local/keepalived
- require: (判断依赖的东西是否存在,存在着执行)
- pkg: pkg-init
- file: keepalived-install
keepalived-init:
file.managed:
- name: /etc/init.d/keepalived
- source: salt://keepalived/files/keepalived.init
- user: root
- group: root
- mode: 755
cmd.run:
- name: chkconfig --add keepalived
- unless: chkconfig --list | grep keepalived
- require:
- file: keepalived-init
keepalived-sysconfig:
file.managed:
- name: /etc/sysconfig/keepalived
- source: salt://keepalived/files/keepalived.sysconfig
- user: root
- group: root
- mode: 644
keepalived-config-dir:
file.directory:
- name: /etc/keepalived
- user: root
- group: root
- mode: 755
5,运行 salt 命令,进行测试
cd /srv/salt/prod/keepalived
salt '*' state.sls keepalived.install saltenv=prod
3.5,keepalived 业务配置编写
1,准备工作(继续采用 /srv/salt/prod/cluster 目录下创建 sls 文件)
cd /srv/salt/prod/cluster 目录
2,创建keepalived 的配置文件
cd /srv/salt/prod/cluster/files/ 目录
vi keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
saltstack@example.com
}
notification_eamil_from keepalived@example.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id {{ ROUTEID }}
}
vrrp_instance haproxy_ha {
state {{ STATEID }}
interface eth0 (eth0 是网卡)
virtual_router_id 36
priority {{ PRIORITYID }}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.204.130 (这个是虚IP)
}
}
3,创建 haproxy-outside-keepalived.sls ( 由于keepalived 是给haproxy 做虚IP 的,所以名称可以这么启用)
vi haproxy-outside-keepalived.sls
include:
- keepalived.install
keepalived-service:
file.managed:
- name: /etc/keepalived/keepalived.conf
- source: salt://cluster/files/keepalived.conf
- user: root
- group: root
- mode: 755
- template: jinja
{% if grains['fqdn'] == 'linux-test-1' %}
- ROUTEID: haproxy_ha
- STATEID: MASTER
- PRIORITYID: 100
{% elif grains['fqdn'] == 'linux-test-2' %}
- ROUTEID: haproxy_ha
- STATEID: BACKUP
- PRIORITYID: 50
{% endif %}
service.running:
- name: keepalived
- enable: True
- watch:
- file: keepalived-service
4,运行 sls 进行测试
cd /srv/salt/prod/cluster
salt '*' state.sls cluster.haproxy-outside-keepalived saltenv=prod
5,到部署keepalived 的minion 主机上查看虚IP 是否已起来
运行命令:ip ad li
6,写入 top 中
cd /srv/salt/base 目录
base:
'*':
- init.env_init
prod:
'*':
- cluster.haproxy-outside
- cluster.haproxy-outside-keepalived
7,通过top 方式运行:
salt '*' state.highstate

浙公网安备 33010602011771号