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

 

 

 

 

posted @ 2020-05-01 01:14  流年浮生  阅读(84)  评论(0)    收藏  举报