SaltStack自动化运维——YAML语法、SaltStack部署httpd服务、SaltStack源码安装nginx

一、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
发布了102 篇原创文章 · 获赞 21 · 访问量 5319

猜你喜欢

转载自blog.csdn.net/ranrancc_/article/details/103294351