一、YAML语法
默认的SLS文件的renderer是YAML renderer。 YAML是一个有很多强大特性的标记性语言。 Salt使用了一个YAML的小型子集,映射非常常用的数据结构,像列表和字典。YAML renderer的工作是将YAML数据格式的结构编译成为Python数据结构给Salt使用。
1、缩进
YAML使用固定的缩进表示数据层结构关系。Salt需要每个缩进级别由两个空格组成。不要使用tabs。
2、冒号
Python的字典当然理所当然是简单的键值对。其他语言的用户应该知道这个数据类型叫哈希表或者关联数组。
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。Values的表现形式冒号下面的每一行,用一个空格隔开:
my_key: my_value
在Python中,上面的将映射为:
{'my_key': 'my_value'}
另一种选择,一个value可以通过缩进与key联接。
my_key:
my_value
注解
上面的语法是有效的YAML,但是在SLS文件罕见,因为通常情况下,一个key的value不是单一的,而是一个 列表 的values。
在Python中,上面的将映射为:
{'my_key': 'my_value'}
字典可以被嵌套:
first_level_dict_key:
second_level_dict_key: value_in_second_level_dict
在Python中:
{
'first_level_dict_key': {
'second_level_dict_key': 'value_in_second_level_dict'
}
}
3、短横杠
想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一列表的一部分。
- list_value_one
- list_value_two
- list_value_three
列表可以可以作为一个键值对的value。这个在Salt很常见:
my_dictionary:
- list_value_one
- list_value_two
- list_value_three
在Python中,上面的将映射为:
{'my_dictionary': ['list_value_one', 'list_value_two', 'list_value_three']}
二、部署httpd服务
1、查看默认寻找目录/srv/salt
[root@server1 salt]# vim /etc/salt/master
534 file_roots:
535 base:
536 - /srv/salt #安装脚本的基础位置,默认寻找目录为/srv/salt
[root@server1 ~]# mkdir /srv/salt
[root@server1 ~]# systemctl restart salt-master
[root@server1 ~]# cd /srv/salt/
[root@server1 salt]# mkdir apache
2、编写数据配置文件 install.sls
以.sls结尾
[root@server1 salt]# cd /srv/salt/apache
[root@server1 apache]# cat install.sls
apache-install: #id名称不能重复
pkg.installed: #安装的软件
- pkgs:
- httpd
- httpd-tools
file.managed: #对文件的管理
- name: /etc/httpd/conf/httpd.conf #将source中的文件推送到name的位置
- source: salt://apache/file/httpd.conf
#source:来源 salt:/--salt服务端基于目录/srv/salt
service.running: #关于服务的启动
- name: httpd #启动httpd服务
- enable: true #开机自动启动
- reload: true #重启,每次修改配置文件,都会触发重启,可以声明以reload方式重启。
- watch: #监控文件,如果有变化则服务重启
- file: /etc/httpd/conf/httpd.conf #到apache-install唯一性文件声明中找file定义
3、执行:salt server3 state.sls apache.install
[root@server1 apache]# ls
apache.sls files
[root@server1 apache]# salt server3 state.sls apache.apache
###调用状态模块的sls方法,执行apache目录下的apache文件,install.sls文件的sls后缀可不写
server3:
----------
ID: apache-install
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 14:34:35.000561
Duration: 594.119 ms
Changes:
----------
ID: apache-install
Function: file.managed
Name: /etc/httpd/conf/httpd.conf
Result: True
Comment: File /etc/httpd/conf/httpd.conf is in the correct state
Started: 14:34:35.597653
Duration: 34.254 ms
Changes:
----------
ID: apache-install
Function: service.running
Name: httpd
Result: True
Comment: Started Service httpd
Started: 14:34:35.633288
Duration: 156.952 ms
Changes:
----------
httpd:
True
Summary for server3
------------
Succeeded: 3 (changed=1)
Failed: 0
------------
Total states run: 3
Total run time: 785.325 ms
此时在server3的 /var/cache/salt/minion/
可以看到
[root@server3 minion]# cd /var/cache/salt/minion/
[root@server3 minion]# ll
total 8
drwxr-xr-x 2 root root 6 Nov 24 14:23 accumulator
drwxr-xr-x 2 root root 6 Nov 24 13:29 extmods
drwx------ 3 root root 18 Nov 24 14:23 files
-rw------- 1 root root 275 Nov 24 14:35 highstate.cache.p
-rw-r--r-- 1 root root 0 Nov 24 14:34 pkg_refresh
drwxr-xr-x 2 root root 6 Nov 24 14:35 proc
-rw------- 1 root root 920 Nov 24 14:35 sls.p
[root@server3 minion]# tree .
.
├── accumulator
├── extmods
├── files
│ └── base
│ ├── apache
│ │ ├── apache.sls
│ │ └── files
│ │ └── httpd.conf
│ └── apache.sls
├── highstate.cache.p
├── pkg_refresh
├── proc
└── sls.p
三、源码安装nginx
1、在/srv/salt
目录下,新建nginx目录
[root@server1 salt]# pwd
/srv/salt
[root@server1 salt]# mkdir nginx
[root@server1 salt]# cd nginx/
2、编写.sls文件
[root@server1 nginx]# cat install.sls #安装
nginx-install:
pkg.installed:
- pkgs: #关于nginx的依赖性安装
- gcc
- pcre-devel
- openssl-devel
file.managed: #文件管理
- name: /mnt/nginx-1.16.1.tar.gz #将source的文件推送到客户端的name目录
- source: salt://nginx/files/nginx-1.16.1.tar.gz #服务端文件存放位置
cmd.run: #在客户端执行的命令,编译的一些基础操作,利用shell脚本编写
- name: cd /mnt/ && tar zxf nginx-1.16.1.tar.gz && cd nginx-1.16.1 && sed -i.bak 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make install &> /dev/null
- creates: /usr/local/nginx #判断, 如果存在这个文件则不继续执行安装,可以防止二次安装
3、编写服务配置文件 service.sls
[root@server1 nginx]# vim service.sls #服务文件
include: #包含的其他脚本,调用其他脚本
- nginx.install #包含安装文件
/usr/local/nginx/conf/nginx.conf: #文件目录id,可以将source中的文件方在客户端的此位置
file.managed:
- source: salt://nginx/files/nginx.conf #源文件位置
nginx-service: #关于服务启动的脚本
file.managed:
- name: /usr/lib/systemd/system/nginx.service #放在客户端的指定位置
- source: salt://nginx/files/nginx.service #源启动脚本位置,需要自己编写启动脚本
service.running:
- name: nginx
- reload: true
- watch:
- file: /usr/local/nginx/conf/nginx.conf
4、创建files目录:
- 一个唯一性声明中只能定义一个file
[root@server1 nginx]# ls
files install.sls service.sls
[root@server1 nginx]# cd files/
[root@server1 files]# pwd
/srv/salt/nginx/files
5、将 nginx-1.16.1.tar.gz 传到 /srv/salt/nginx/files/
[root@server2 mnt]# scp nginx-1.16.1.tar.gz root@172.25.2.1:/srv/salt/nginx/files/
root@172.25.2.1's password:
nginx-1.16.1.tar.gz 100% 1008KB 17.2MB/s 00:00
6、在 /srv/salt/nginx/files/
编写源启动脚本:nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
7、推送给server2:salt server2 state.sls nginx.service
[root@server1 files]# salt server2 state.sls nginx.service
server2:
----------
ID: nginx-install
Function: pkg.installed
Result: True
Comment: All specified packages are already installed
Started: 16:21:29.749447
Duration: 663.249 ms
Changes:
----------
ID: nginx-install
Function: file.managed
Name: /mnt/nginx-1.16.1.tar.gz
Result: True
Comment: File /mnt/nginx-1.16.1.tar.gz is in the correct state
Started: 16:21:30.415610
Duration: 37.695 ms
Changes:
----------
ID: nginx-install
Function: cmd.run
Name: cd /mnt/ && tar zxf nginx-1.16.1.tar.gz && cd nginx-1.16.1 && sed -i.bak 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make install &> /dev/null
Result: True
Comment: /usr/local/nginx exists
Started: 16:21:30.454448
Duration: 0.664 ms
Changes:
----------
ID: /usr/local/nginx/conf/nginx.conf
Function: file.managed
Result: True
Comment: File /usr/local/nginx/conf/nginx.conf is in the correct state
Started: 16:21:30.455309
Duration: 12.923 ms
Changes:
----------
ID: nginx-service
Function: file.managed
Name: /usr/lib/systemd/system/nginx.service
Result: True
Comment: File /usr/lib/systemd/system/nginx.service updated
Started: 16:21:30.468472
Duration: 25.55 ms
Changes:
----------
diff:
---
+++
@@ -6,7 +6,7 @@
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
-ExecStart=/usr/local/sbin/nginx
+ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
----------
ID: nginx-service
Function: service.running
Name: nginx
Result: True
Comment: Started Service nginx
Started: 16:21:30.495355
Duration: 206.741 ms
Changes:
----------
nginx:
True
Summary for server2
------------
Succeeded: 6 (changed=2)
Failed: 0
------------
Total states run: 6
Total run time: 946.822 ms
查看端口:
[root@server2 mnt]# ps aux
root 11052 0.0 0.1 45944 1132 ? Ss 16:21 0:00 nginx: master process /usr/local/ngi
nobody 11053 0.0 0.1 46388 1912 ? S 16:21 0:00 nginx: worker process