首先,在 /srv/salt 目录下 创建 base,prod,test目录,分别代表 基础环境,生产环境 和 测试环境。基础环境 是存放 公共的状态,例如 命令 的 审计,内核参数的修改
[root@linux-node1 salt]# cd /srv/salt/
[root@linux-node1 salt]# mkdir base
[root@linux-node1 salt]# mkdir prod
[root@linux-node1 salt]# mkdir test
修改 salt-master配置文件
vim /etc/salt/master
file_roots:
base:
- /srv/salt/base
test:
- /srv/salt/test
prod:
- /srv/salt/prod
重启 salt-master
systemctl restart salt-master
假如我们的架构,包含tomcat,nginx 这些东西很独立,我们可以把每个模块都建一个目录把相关模块的状态,所有的配置,都写在这个目录下,我们把这个目录称之为一个功能模块,这样做为了模块的复用,每个模块要尽量的独立,能够被引用
一个状态的执行流程,我们可以简单理解为 ,1 先系统初始化 2 再把软件装起来 3 再把软件运行起来
我们 把 该执行流程 分为 三个模块,分别是
1 系统初始化
2 功能模快
3 业务模块
系统初始化模块,是把公用依赖的东西都 初始化上,例如 内核参数的修改,编译安装所需的包
功能模块 是把 每个 安装流程 记录下来,然后 交给 业务模块include 进来就可以,以便以后的复用
业务模块 因为业务不一样,每个软件的配置文件也不尽相同,所以我们在该模块下一般是为 不同 的机器分发不同的配置文件
系统初始化
创建 init 和 files目录
mkdir /srv/salt/base/init/
mkdir /srv/salt/base/init/files/
然后 cd 到 init 目录下编写 salt 文件
将 操作命令 记录到 /var/log/message下
[root@linux-node1 init]# cat 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";}'
统一的dns
[root@linux-node1 init]# cat dns.sls
/etc/resolv.conf:
file.managed:
- source: salt://init/files/resolv.conf
- user: root
- group: root
- mode: 644
历史记录加上时间
/etc/profile:
file.append:
- text:
- export HISTTIMEFORMAT="%F %T `whoami`"
修改内核参数
[root@linux-node1 init]# cat 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 #打开最大的文件数
将 以上的功能 包含到 env_init, 方便后续调用
[root@linux-node1 init]# cat env_init.sls
include:
- init.dns
- init.history
- init.audit
- init.sysctl
首先编写编译安装所需的公共包的状态,在编写需要编译安装状态时,只需要include此状态即可
[root@linux-node1 pkg]# pwd
/srv/salt/prod/pkg
[root@linux-node1 pkg]# cat pkg-init.sls
pkg-init:
pkg.installed:
- names:
- gcc
- gcc-c++
- glibc
- make
- autoconf
- openssl
- openssl-devel
编写JDK状态
include:
- pkg.pkg-init
java-install:
file.managed:
- name: /usr/local/src/jdk-8u101-linux-x64.tar.gz
- source: salt://java/files/jdk-8u101-linux-x64.tar.gz
- user: root
- group: root
- mode: 755
cmd.run:
- name: cd /usr/local/src/ && tar -zxvf jdk-8u101-linux-x64.tar.gz -C /usr/local/
- unless: test -d /usr/local/jdk1.8.0_101
- require:
- pkg: pkg-init
- file: java-install
append-env:
file.append:
- name: /etc/profile
- text:
- JAVA_HOME=/usr/local/jdk1.8.0_101
- export PATH=$PATH:$JAVA_HOME/bin
- require:
- cmd: java-install
cmd.run:
- name: export PATH=$PATH:/usr/local/jdk1.8.0_101/bin
- require:
- cmd: java-install
- file: append-env
功能模块的编写
在prod 下创建 tomcat 目录
[root@linux-node1 prod]# mkdir /srv/salt/prod/tomcat
[root@linux-node1 prod]# cd tomcat/
创建files 目录 ,存放 tomcat 的 安装包和 配置文件
[root@linux-node1 tomcat]# mkdir files
编写 tomcat 状态
include:
- pkg.pkg-init
tomcat-install:
file.managed:
- name: /usr/local/src/apache-tomcat-8.5.31.tar.gz
- source: salt://tomcat/files/apache-tomcat-8.5.31.tar.gz
- user: root
- group: root
- mode: 755
cmd.run:
- name: cd /usr/local/src/ && tar -zxvf apache-tomcat-8.5.31.tar.gz -C /usr/local/
- unless:
- test -d /usr/local/apache-tomcat-8.5.31/
- require:
- pkg: pkg-init
- file: tomcat-install
canalina-managed:
file.managed:
- name: /usr/local/apache-tomcat-8.5.31/bin/catalina.sh
- source: salt://tomcat/files/catalina.sh
catalina.sh的改动只是 在 文件,添加了 JDK的环境变量
JAVA_HOME=/usr/local/jdk1.8.0_101
JRE_HOME=$JAVA_HOME/jre
业务模块
include:
- tomcat.install
tomcat-running:
cmd.run:
- name: /bin/bash /usr/local/apache-tomcat-8.5.31/bin/startup.sh
- unless: test ! -z `jps | grep Bootstrap`
编辑top.sls
base:
'*':
- init.env_init #init是一个目录
prod:
'*':
- java.install
- tomcat-service.tomcat-running
先使用
salt '*' state.highstate test=Ture 进行测试
然后 执行
salt '*' state.highstate env=prod