SaltStack基础 - 04stats组件
SaltStack基础 - 04stats组件
一、states文件
- salt states的核心是sls文件,该文件使用YAML语法定义了一些k/v的数据。
- sls文件存放的根路径在master配置文件中定义file_roots,默认为/srv/salt,如果不存在,需要手动创建。
- 在salt中可以通过salt://代替根路径,例通过salt://top.sls 访问 /srv/salt/top.sls。
- 在states中top文件也由master配置文件定义,默认为top.sls,该文件为states的入口文件。
- salt-master默认会读取file_roots指定配置目录下的top.sls。这个是在master配置文件下的state_top: top.sls决定的。
1.1 定义top.sls及sls文件
### master配置文件中定义了三种环境,每种环境都可以定义多个目录,但是要避免冲突。
[root@cl-server salt]# vi /etc/salt/master
file_roots:
base:
- /application/salt
prod:
- /application/salt/prod
test:
- /application/salt/test
[root@cl-server salt]# cat top.sls
base: ### 第一行,声明使用base环境
'*': ### 第二行,定义target,这里是匹配所有
- apache ### 第三行,声明使用哪些states目录,salt会寻找每个目录下的init.sls文件。
### 简单的sls文件:
[root@cl-server salt]# pwd
/application/salt
[root@cl-server salt]# cat apache/init.sls
apache: # 1
pkg.installed: # 2
- names: # 3
- httpd # 4
service.running: # 5
- require: # 6
- pkg: apache # 7
第一行,被称为ID说明(ID Declaration)。ID说明表明可以操控的名字。
第二行和第五行是State说明(State Declaration),它们分别使用了pkg和service states。pkg state通过系统的包管理其管理关键包,service state管理系统服务(daemon)。
在pkg及service列下边是运行的方法。方法定义包和服务应该怎么做。此处是软件包应该被安装,服务应该处于运行中。
第六行使用require。本方法称为”必须指令”(Requisite Statement),表明只有当apache软件包安装成功时,apache服务才启动起来。
1.2 执行state.highstate
### 上面命令会触发 minion 从master下载top.sls文件以及其中的states,然后编译、执行。执行完之后,minion会将执行结果的摘要信息汇报给master。
[root@cl-server salt]# salt 'cl-node02' state.highstate
[root@cl-server salt]# salt 'cl-node02' state.highstate test=True
cl-node02:
----------
ID: apache
Function: pkg.installed
Name: httpd
Result: None
Comment: The following packages would be installed/updated: httpd
Started: 17:38:09.549432
Duration: 751.19 ms
Changes:
----------
ID: apache
Function: service.running
Result: None
Comment: Service apache not present; if created in this state run, it would have been started
Started: 17:38:10.301490
Duration: 21.253 ms
Changes:
Summary for cl-node02
------------
Succeeded: 2 (unchanged=2)
Failed: 0
------------
Total states run: 2
Total run time: 772.443 ms
二、使用sls部署服务
2.1 执行 base 环境下的stats文件
[root@cl-server salt]# mkdir prod test init
[root@cl-server salt]# cd init/
[root@cl-server init]# tree
.
├── audit.sls
├── dns.sls
├── env_init.sls
├── files
│ └── resolv.conf
├── history.sls
└── sysctl.sls
1 directory, 6 files
[root@cl-server init]# cat dns.sls
/etc/resolv.conf:
file.managed:
- source: salt://init/files/resolv.conf
- user: root
- group: root
- mode: 644
[root@cl-server init]# cat history.sls
etc_profile_append_time:
file.append:
- name: /etc/profile
- text:
- export HISTTIMEFORMAT="%F %T `whoami`"
[root@cl-server init]# cat audit.sls
etc_bashrc_log:
file.append:
- name: /etc/bashrc
- text:
- export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg"; }'
[root@cl-server init]# cat sysctl.sls
vm.swappiness:
sysctl.present:
- value: 0
net.ipv4.ip_local_port_range:
sysctl.present:
- value: 1024 65000
fs.file-max:
sysctl.present:
- value: 100000
[root@cl-server init]# cat env_init.sls
include:
- init.dns
- init.history
- init.sysctl
# - init.audit
### base 对应 /etc/salt/master 中 file_roots 的标签:找到 base 对应的目录位置,然后对指定服务器进行脚本执行 init.env_init
[root@cl-server salt]# cat top.sls
base:
'*':
- init.env_init
[root@cl-server salt]# salt 'cl-node03' state.highstate test=True
[root@cl-server salt]# salt 'cl-node03' state.highstate
2.2 执行prod环境下的state文件
[root@cl-server prod]# tree
.
├── haproxy
│ ├── files
│ │ ├── haproxy-2.4.4.tar.gz
│ │ └── haproxy.init
│ └── install.sls
└── pkg
└── pkg-init.sls
3 directories, 4 files
[root@cl-server salt]# salt 'cl-node03' state.sls haproxy.install saltenv=prod test=True
[root@cl-server haproxy]# cat install.sls
include:
- pkg.pkg-init # 相对目录,相对于/application/salt/prod
haproxy-install:
file.managed: #ID
- source: salt://haproxy/files/haproxy-2.4.4.tar.gz
- name: /usr/local/src/haproxy-2.4.4.tar.gz # name声明,没有ID可以将name声明放在ID处
- user: root
- group: root
- mode: 755
cmd.run:
- name: cd /usr/local/src && tar xf haproxy-2.4.4.tar.gz &&
cd haproxy-2.4.4 && make TARGET=linux-glibc PRXFIX=/usr/local/haproxy &&
make install PREFIX=/usr/local/haproxy
- unless: test -d /usr/local/haproxy
- require: # 指定依赖
- pkg: pkg-init # 依赖ID为pkg-init的pkg模块,这个pkg模块必须执行成功才执行本模块
- file: haproxy-install # 依赖ID为haproxy-install的file模块
haproxy-init:
file.managed:
- source: salt://haproxy/files/haproxy.init
- name: /etc/init.d/haproxy
- user: root
- group: root
- mode: 755
- require:
- cmd: haproxy-install
cmd.run:
- name: chkconfig --add haproxy
- unless: chkconfig --list |grep haproxy
- require:
- file: haproxy-init
net.ipv4.ip_nonlocal_bind:
sysctl.present:
- value: 1
haproxy-config-dir:
file.directory:
- name: /etc/haproxy
- user: root
- group: root
- mode: 755
[root@cl-server prod]# tree
.
├── cluster
│ ├── files
│ │ └── haproxy-outside.cfg
│ └── haproxy-outside.sls
├── haproxy
│ ├── files
│ │ ├── haproxy-2.4.4.tar.gz
│ │ └── haproxy.init
│ └── install.sls
└── pkg
└── pkg-init.sls
[root@cl-server prod]# cat cluster/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: 644
service.running:
- name: haproxy
- enable: True # 是否开机自启动
- reload: True # 是否reload, 不加则配置文件变动,服务restart
- require:
- cmd: haproxy-init
- watch:
- file: haproxy-service # 关注文件,文件变化reload
2.3 在top文件中指定各环境state文件
[root@cl-server salt]# cat top.sls
base:
'*':
- init.env_init
prod:
'cl-node01':
- cluster.haproxy-outside
[root@cl-server salt]# salt '*' state.highstate test=True
三、state文件案例
3.1 安装Httpd
### 安装并启动httpd [root@cl-server httpd]# cat install.sls httpd-install: pkg.installed: - pkgs: - httpd - php service.running: - name: httpd - enable: True - reload: True ### 推送执行: [root@cl-server httpd]# salt cl-node01 state.sls httpd.install ### 设置httpd初始化配置文件 [root@cl-server httpd]# cat install.sls httpd-install: pkg.installed: - pkgs: - httpd - php file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://httpd/files/httpd.conf - mode: 644 - user: root service.running: - name: httpd - enable: True - reload: True - watch: - file: httpd-install
3.2 安装Nginx
### 编译安装Nginx
[root@cl-server nginx]# tree
.
├── files
│ ├── nginx
│ ├── nginx-1.18.0.tar.gz
│ ├── nginx.conf
│ └── nginx.service
├── install.sls
├── pkgs
│ └── make.sls
└── service.sls
### 编译安装脚本
[root@cl-server nginx]# cat pkgs/make.sls
make-gss:
pkg.installed:
- pkgs:
- pcre-devel
- openssl-devel
- gcc
[root@cl-server nginx]# cat install.sls
include:
- nginx.pkgs.make
nginx_install:
file.managed:
- name: /root/nginx-1.18.0.tar.gz
- source: salt://nginx/files/nginx-1.18.0.tar.gz
cmd.run:
- name: cd /root/ && tar zxf nginx-1.18.0.tar.gz && cd nginx-1.18.0
&& ./configure --prefix=/application/nginx --with-file-aio --with-threads --with-http_ssl_module --with-http_stub_status_module &> /dev/null
&& make &>/dev/null && make install &>/dev/null
- creates: /application/nginx
### 创建服务用户的脚本
[root@cl-server salt]# cat users/nginx.sls
nginx-group:
group.present:
- name: nginx
- gid: 800
nginx-user:
user.present:
- name: nginx
- uid: 800
- gid: 800
- shell: /sbin/nologin
- createhome: False
- home: /application/nginx
### 服务启动脚本
[root@cl-server nginx]# cat service.sls
include:
- nginx.install
- users.nginx
/application/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
nginx-service:
file.managed:
- name: /etc/init.d/nginx
- source: salt://nginx/files/nginx
- mode: 755
service.running:
- name: nginx
- reload: True
- watch:
- file: /application/nginx/conf/nginx.conf
### 推送执行
[root@cl-server nginx]# salt cl-node02 state.sls nginx.service
3.3 安装Haproxy
### 安装Haproxy
[root@cl-server haproxy]# cat install.sls
haproxy-install:
pkg.installed:
- pkgs:
- haproxy
file.managed:
- name: /etc/haproxy/haproxy.cfg
- source: salt://haproxy/files/haproxy.cfg
service.running:
- name: haproxy
- reload: True
- watch:
- file: haproxy-install
3.4 使用top同时安装三个服务
### 在/application/salt 下创建 top.sls
[root@cl-server salt]# vi top.sls
base:
'cl-node01':
- httpd.install
'cl-node02':
- nginx.service
'cl-server':
- haproxy.install
[root@cl-server salt]# salt '*' state.highstate
[root@cl-server test]# vi test_condition.sls
test_condition:
cmd.run:
- cwd: /tmp
- name: echo "123abc++" >> /tmp/aa.txt
# - unless: False
- onlyif: True
- require:
file: create_aa
### unless: 当 unless 条件不满足时,需要执行命令
### onlyif: 当 onlyif 条件满足时,需要执行令
[root@cl-server test]# salt cl-node01 state.sls test/test_condition
cl-node01:
----------
ID: test_condition
Function: cmd.run
Name: echo "123abc++" > /tmp/aa.txt
Result: True
Comment: unless condition is true
Started: 16:52:03.624554
Duration: 1.127 ms
Changes:
[root@cl-server test]# salt cl-node01 state.sls test/test_condition
cl-node01:
----------
ID: test_condition
Function: cmd.run
Name: echo "123abc++" > /tmp/aa.txt
Result: True
Comment: onlyif condition is false
Started: 16:53:16.145064
Duration: 1.12 ms
Changes: