自动化运维之saltstack

Saltstack官方网站:https://docs.saltstack.com/en/latest


Saltstack运行方式

【1】Local

【2】Mastr/Minion

【3】Salt SSH


Saltstack三大功能

【1】远程执行

【2】配置管理

【3】云管理(阿里云、亚马逊云)


[root@linux-node1 ~]# yum -y install salt-master salt-minion
[root@linux-node1 ~]# chkconfig --level 3 salt-master on
[root@linux-node1 ~]# chkconfig --level 3 salt-minion on
[root@linux-node1 ~]# chkconfig --list salt-master
salt-master     0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@linux-node1 ~]# chkconfig --list salt-minion
salt-minion     0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@linux-node1 ~]# /etc/init.d/salt-master start
Starting salt-master daemon:                               [  OK  ]
[root@linux-node1 ~]# ps -ef|grep "salt-master"|grep -v "grep"
root      1168     1  0 09:53 ?        00:00:00 /usr/bin/python2.6 /usr/bin/salt-master -d
root      1169  1168  2 09:53 ?        00:00:00 /usr/bin/python2.6 /usr/bin/salt-master -d
root      1170  1168  0 09:53 ?        00:00:00 /usr/bin/python2.6 /usr/bin/salt-master -d
root      1171  1168  0 09:53 ?        00:00:00 /usr/bin/python2.6 /usr/bin/salt-master -d
root      1172  1168  0 09:53 ?        00:00:00 /usr/bin/python2.6 /usr/bin/salt-master -d
root      1177  1172  2 09:53 ?        00:00:00 /usr/bin/python2.6 /usr/bin/salt-master -d
root      1180  1172  2 09:53 ?        00:00:00 /usr/bin/python2.6 /usr/bin/salt-master -d
root      1183  1172  2 09:53 ?        00:00:00 /usr/bin/python2.6 /usr/bin/salt-master -d
root      1184  1172  2 09:53 ?        00:00:00 /usr/bin/python2.6 /usr/bin/salt-master -d
root      1187  1172  2 09:53 ?        00:00:00 /usr/bin/python2.6 /usr/bin/salt-master -d
root      1192  1172  0 09:53 ?        00:00:00 /usr/bin/python2.6 /usr/bin/salt-master -d
[root@linux-node1 ~]# vim /etc/salt/minion
16 master: 192.168.100.133
[root@linux-node1 ~]# /etc/init.d/salt-minion start
Starting salt-minion daemon:                               [  OK  ]
[root@linux-node1 ~]# ps -ef|grep "salt-minion"|grep -v "grep"
root      1817     1  0 10:01 ?        00:00:00 /usr/bin/python2.6 /usr/bin/salt-minion -d
[root@linux-node2 ~]# yum -y install salt-minion
[root@linux-node2 ~]# chkconfig --level 3 salt-minion on
[root@linux-node2 ~]# chkconfig --list salt-minion
salt-minion     0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@linux-node2 ~]# vim /etc/salt/minion
16 master: 192.168.100.133
[root@linux-node2 ~]# /etc/init.d/salt-minion start
Starting salt-minion daemon:                               [  OK  ]
[root@linux-node2 ~]# ps -ef|grep "salt-minion"|grep -v "grep"
root      1825     1  2 10:01 ?        00:00:00 /usr/bin/python2.6 /usr/bin/salt-minion -d
[root@linux-node1 ~]# ll /etc/salt/pki/master/
total 28
-r-------- 1 root root 1679 2017-03-15 09:53 master.pem
-rw-r--r-- 1 root root  451 2017-03-15 09:53 master.pub
drwxr-xr-x 2 root root 4096 2017-03-15 09:53 minions
drwxr-xr-x 2 root root 4096 2017-03-15 09:53 minions_autosign
drwxr-xr-x 2 root root 4096 2017-03-15 09:53 minions_denied
drwxr-xr-x 2 root root 4096 2017-03-15 10:01 minions_pre
drwxr-xr-x 2 root root 4096 2017-03-15 09:53 minions_rejected
[root@linux-node1 ~]# ll /etc/salt/pki/minion/
total 8
-r-------- 1 root root 1679 2017-03-15 10:01 minion.pem
-rw-r--r-- 1 root root  451 2017-03-15 10:01 minion.pub
[root@linux-node1 ~]# tree /etc/salt/pki/master/
/etc/salt/pki/master/
├── master.pem
├── master.pub
├── minions
├── minions_autosign
├── minions_denied
├── minions_pre
│   ├── linux-node1.example.com
│   └── linux-node2.example.com
└── minions_rejected

5 directories, 4 files
[root@linux-node1 ~]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
linux-node1.example.com
linux-node2.example.com
Rejected Keys:
[root@linux-node1 ~]# salt-key -a linux*
The following keys are going to be accepted:
Unaccepted Keys:
linux-node1.example.com
linux-node2.example.com
Proceed? [n/Y] Y
Key for minion linux-node1.example.com accepted.
Key for minion linux-node2.example.com accepted.
[root@linux-node1 ~]# tree /etc/salt/pki/master/
/etc/salt/pki/master/
├── master.pem
├── master.pub
├── minions
│   ├── linux-node1.example.com
│   └── linux-node2.example.com
├── minions_autosign
├── minions_denied
├── minions_pre
└── minions_rejected

5 directories, 4 files
[root@linux-node1 ~]# file /etc/salt/pki/master/minions/linux-node1.example.com
/etc/salt/pki/master/minions/linux-node1.example.com: ASCII text
[root@linux-node1 ~]# cat /etc/salt/pki/master/minions/linux-node1.example.com
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1AFIXzVYfy1UnQD+907Y
BpzkxUuO5u5t5ZTufVyRcGT96vaIznEdHEQzO9yq9CFiy8OEzEhP3ern3UiDKW6J
139rgDutlhGuN9IIjRipmmrmzgiGjIS0AhJwBcui0ljgmE6+tpvmbPI7CqQehRl5
XCDiSGwgYpPFd7AhNiyHbkcRYCqMflrapzIsVZtiunt4QetIth0I3GlpRDyhioAl
do84RYRHGqBS19vs+WKI/Dqf46TUUwGf98oyLoG1zzcTOuJtgO2iFWZKbZErjrwE
lwyJxr/KA2rdQs9R5Sf3GW66O7poNCzk8AhrRETIN7HO80I4y+TJ5SuHHLt1IHOG
vQIDAQAB
-----END PUBLIC KEY-----
[root@linux-node1 ~]# cd /etc/salt/pki/master/
[root@linux-node1 master]# salt '*' test.ping
linux-node1.example.com:
    True
linux-node2.example.com:
    True
[root@linux-node1 master]# salt '*' cmd.run 'uptime'
linux-node1.example.com:
     10:20:18 up 54 min,  1 user,  load average: 0.03, 0.01, 0.00
linux-node2.example.com:
     10:20:18 up 56 min,  1 user,  load average: 0.00, 0.19, 0.17
[root@linux-node1 master]# vim /etc/salt/master
416 file_roots:
417   base:
418     - /srv/salt
[root@linux-node1 master]# mkdir /srv/salt
[root@linux-node1 master]# /etc/init.d/salt-master restart
Stopping salt-master daemon:                               [  OK  ]
Starting salt-master daemon:                               [  OK  ]
[root@linux-node1 master]# cd /srv/salt/
[root@linux-node1 salt]# vim Apache.sls
Apache-Install:
  pkg.installed:
    - names:
      - httpd
      - httpd-devel

Apache-Service:
  service.running:
    - name: httpd
    - enable: True
    - reload: True
[root@linux-node1 salt]# salt '*' state.sls Apache
linux-node2.example.com:
----------
          ID: Apache-Install
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: Package httpd is already installed.
     Started: 10:59:27.226690
    Duration: 1813.079 ms
     Changes:
----------
          ID: Apache-Install
    Function: pkg.installed
        Name: httpd-devel
      Result: True
     Comment: Package httpd-devel is already installed.
     Started: 10:59:29.040075
    Duration: 0.996 ms
     Changes: 
----------
          ID: Apache-Service
    Function: service.running
        Name: httpd
      Result: True
     Comment: Service httpd has been enabled, and is running
     Started: 10:59:29.042283
    Duration: 2003.892 ms
     Changes:
              ----------
              httpd:
                  True

Summary
------------
Succeeded: 3 (changed=1)
Failed:    0
------------
Total states run:     3
linux-node1.example.com:
----------
          ID: Apache-Install
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: Package httpd is already installed.
     Started: 10:59:25.849052
    Duration: 5207.181 ms
     Changes:  
----------
          ID: Apache-Install
    Function: pkg.installed
        Name: httpd-devel
      Result: True
     Comment: Package httpd-devel is already installed.
     Started: 10:59:31.057000
    Duration: 1.587 ms
     Changes:
----------
          ID: Apache-Service
    Function: service.running
        Name: httpd
      Result: True
     Comment: Service httpd has been enabled, and is running
     Started: 10:59:31.088942
    Duration: 1378.366 ms
     Changes:
              ----------
              httpd:
                  True

Summary
------------
Succeeded: 3 (changed=1)
Failed:    0
------------
Total states run:     3
[root@linux-node1 salt]# chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@linux-node1 salt]# netstat -tnlup|grep "80"
tcp        0      0 :::80                       :::*                        LISTEN      29372/httpd
[root@linux-node2 ~]# chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@linux-node2 ~]# netstat -tnlup|grep 80
tcp        0      0 :::80                       :::*                        LISTEN      27316/httpd
[root@linux-node1 salt]# vim top.sls
base:
  '*':
    - Apache
[root@linux-node1 salt]# salt '*' state.highstate

Saltstack数据系统
【1】Grains
	【1-1】收集系统底层信息
【2】Pillar

[root@linux-node1 salt]# salt 'linux-node1*' grains.ls
[root@linux-node1 salt]# salt 'linux-node1*' grains.items
[root@linux-node1 salt]# salt 'linux-node1*' grains.item fqdn
linux-node1.example.com:
    ----------
    fqdn:
        linux-node1.example.com
[root@linux-node1 salt]# salt 'linux-node1*' grains.get fqdn
linux-node1.example.com:
    linux-node1.example.com
[root@linux-node1 salt]# salt 'linux-node1*' grains.get ip_interfaces:eth0
linux-node1.example.com:
    - 192.168.100.133
    - fe80::20c:29ff:fe27:e560

	[root@linux-node1 salt]# salt -G 'os:CentOS' cmd.run 'uptime'
linux-node1.example.com:
     11:37:34 up  2:12,  1 user,  load average: 0.01, 0.02, 0.00
linux-node2.example.com:
     11:37:34 up  2:13,  1 user,  load average: 0.08, 0.02, 0.01

自定义Grains
[root@linux-node1 salt]# vim /etc/salt/minion
88 grains:
89   roles:
90     - webserver
91     - memcache
[root@linux-node1 salt]# /etc/init.d/salt-minion restart
Stopping salt-minion daemon:                               [  OK  ]
Starting salt-minion daemon:                               [  OK  ]
[root@linux-node1 salt]# salt -G 'roles:webserver' cmd.run 'uptime'
linux-node1.example.com:
     11:43:27 up  2:18,  1 user,  load average: 0.03, 0.02, 0.00
[root@linux-node1 salt]# vim /etc/salt/grains
web: nginx
[root@linux-node1 salt]# /etc/init.d/salt-minion restart
Stopping salt-minion daemon:                               [  OK  ]
Starting salt-minion daemon:                               [  OK  ]
[root@linux-node1 salt]# salt -G 'web:nginx' cmd.run 'uptime'
linux-node1.example.com:
     11:53:32 up  2:28,  1 user,  load average: 0.12, 0.07, 0.01
[root@linux-node1 salt]# vim top.sls
base:
  'web:nginx':
    - match: grain
    - Apache
[root@linux-node1 salt]# salt -G 'web:nginx' state.highstate
linux-node1.example.com:
----------
          ID: Apache-Install
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: Package httpd is already installed.
     Started: 12:35:23.704044
    Duration: 1305.36 ms
     Changes: 
----------
          ID: Apache-Install
    Function: pkg.installed
        Name: httpd-devel
      Result: True
     Comment: Package httpd-devel is already installed.
     Started: 12:35:25.009625
    Duration: 1.23 ms
     Changes: 
----------
          ID: Apache-Service
    Function: service.running
        Name: httpd
      Result: True
     Comment: Service httpd is already enabled, and is in the desired state
     Started: 12:35:25.011967
    Duration: 76.219 ms
     Changes:

Summary
------------
Succeeded: 3
Failed:    0
------------
Total states run:     3

[root@linux-node1 salt]# vim /etc/salt/master
552 pillar_opts: True
[root@linux-node1 salt]# /etc/init.d/salt-master restart
Stopping salt-master daemon:                               [  OK  ]
Starting salt-master daemon:                               [  OK  ]
[root@linux-node1 salt]# salt '*' pillar.items

自定义Pillar
[root@linux-node1 salt]# vim /etc/salt/master
529 pillar_roots:
530   base:
531     - /srv/pillar
[root@linux-node1 salt]# /etc/init.d/salt-master restart
Stopping salt-master daemon:                               [  OK  ]
Starting salt-master daemon:                               [  OK  ]
[root@linux-node1 salt]# mkdir /srv/pillar
[root@linux-node1 salt]# cd /srv/pillar/
[root@linux-node1 pillar]# vim apache.sls
{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif granis['os']  == 'Debian' %}
apache: apache2
{% endif %}
[root@linux-node1 pillar]# vim top.sls
base:
  '*':
    - apache
[root@linux-node1 pillar]# salt '*' pillar.items
linux-node1.example.com:
    ----------
    apache:
        httpd
linux-node2.example.com:
    ----------
    apache:
        httpd

[root@linux-node1 pillar]# salt -I 'apache:httpd' test.ping
linux-node1.example.com:
    Minion did not return. [No response]
linux-node2.example.com:
    Minion did not return. [No response]
[root@linux-node1 pillar]# salt '*' saltutil.refresh_pillar
linux-node2.example.com:
    True
linux-node1.example.com:
    True
[root@linux-node1 pillar]# salt -I 'apache:httpd' test.ping
linux-node1.example.com:
    True
linux-node2.example.com:
    True

Grains和Pillar区别
名称		存储位置		数据类型		数据采集更新方式															应用
Grains		Minion端		静态数据		Minion启动时收集,也可以使用saltutil.sync_grains进行刷新					存储Minion基本数据,比如用于匹配Minion,自身数据可以用来做资产管理等
Pillar		Master端		动态数据		在Master端定义,指定给对应的Minion,可以使用saltutil.refresh_pillar刷新		存储Master指定的数据,只有指定的Minion可以看到,用于敏感数据保存

远程执行三大内容
【1】目标(Targeting)
【2】模块(Module)
【3】返回(Returnners)

【1】ID
[root@linux-node1 ~]# salt 'linux-node1.example.com' cmd.run 'uptime'
linux-node1.example.com:
     14:09:55 up  4:44,  1 user,  load average: 0.00, 0.00, 0.00

【2】通配符
[root@linux-node1 ~]# salt '*' cmd.run 'uptime'
linux-node1.example.com:
     14:10:27 up  4:45,  1 user,  load average: 0.00, 0.00, 0.00
linux-node2.example.com:
     14:10:28 up  4:46,  1 user,  load average: 0.05, 0.01, 0.00

[root@linux-node1 ~]# salt 'linux-node?.example.com' cmd.run 'uptime'
linux-node1.example.com:
     14:11:04 up  4:45,  1 user,  load average: 0.00, 0.00, 0.00
linux-node2.example.com:
     14:11:04 up  4:47,  1 user,  load average: 0.03, 0.01, 0.00

[root@linux-node1 ~]# salt 'linux-node[1-2].example.com' cmd.run 'uptime'
linux-node2.example.com:
     14:11:42 up  4:47,  1 user,  load average: 0.01, 0.01, 0.00
linux-node1.example.com:
     14:11:42 up  4:46,  1 user,  load average: 0.00, 0.00, 0.00

[root@linux-node1 ~]# salt 'linux-node[1,2].example.com' cmd.run 'uptime'
linux-node1.example.com:
     14:12:38 up  4:47,  1 user,  load average: 0.00, 0.00, 0.00
linux-node2.example.com:
     14:12:39 up  4:48,  1 user,  load average: 0.00, 0.00, 0.00

【3】正则表达式
[root@linux-node1 ~]# salt -E 'linux-node1.(example|keywa).com' cmd.run 'uptime'
linux-node1.example.com:
     14:12:38 up  4:47,  1 user,  load average: 0.00, 0.00, 0.00
linux-node1.keywa.com:
     14:12:39 up  4:48,  1 user,  load average: 0.00, 0.00, 0.00

【4】列表(ID)
[root@linux-node1 ~]# salt -L 'linux-node1.example.com,linux-node2.example.com' cmd.run 'uptime'
linux-node2.example.com:
     14:25:08 up  5:01,  1 user,  load average: 0.00, 0.00, 0.00
linux-node1.example.com:
     14:25:08 up  4:59,  1 user,  load average: 0.01, 0.01, 0.00

【5】IP
[root@linux-node1 ~]# salt -S '192.168.100.133' cmd.run 'uptime'
linux-node1.example.com:
     14:27:36 up  5:02,  1 user,  load average: 0.00, 0.00, 0.00

[root@linux-node1 ~]# salt -S '192.168.100.0/24' cmd.run 'uptime'
linux-node1.example.com:
     14:28:10 up  5:02,  1 user,  load average: 0.00, 0.00, 0.00
linux-node2.example.com:
     14:28:10 up  5:04,  1 user,  load average: 0.00, 0.00, 0.00

【6】混合
[root@linux-node1 ~]# salt -C 'S@192.168.100.0/24 or G@os:CentOS' cmd.run 'uptime'
linux-node1.example.com:
     14:29:39 up  5:04,  1 user,  load average: 0.00, 0.00, 0.00
linux-node2.example.com:
     14:29:39 up  5:05,  1 user,  load average: 0.00, 0.00, 0.00

[root@linux-node1 ~]# salt -C 'S@192.168.100.0/24 and G@web:nginx' cmd.run 'uptime'
linux-node1.example.com:
     14:31:17 up  5:05,  1 user,  load average: 0.00, 0.00, 0.00

[root@linux-node1 ~]# salt -C 'S@192.168.100.0/24 not G@web:nginx' cmd.run 'uptime'
linux-node2.example.com:
     14:32:39 up  5:08,  1 user,  load average: 0.00, 0.00, 0.00

[root@linux-node1 ~]# salt '*' service.available sshd
linux-node1.example.com:
    True
linux-node2.example.com:
    True

[root@linux-node1 ~]# vim /etc/salt/master
245 client_acl:
246   linbin:
247     - test.ping
248     - network.*
[root@linux-node1 ~]# /etc/init.d/salt-master restart
Stopping salt-master daemon:                               [  OK  ]
Starting salt-master daemon:                               [  OK  ]
[root@linux-node1 ~]# chmod 755 /var/log/salt/master /var/cache/salt/ /var/cache/salt/master/ /var/cache/salt/master/jobs/ /var/run/salt /var/run/salt/master/
[root@linux-node1 ~]# useradd linbin
[root@linux-node1 ~]# passwd linbin
Changing password for user linbin.
New password:
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@linux-node1 ~]# su - linbin
[linbin@linux-node1 ~]$ id
uid=500(linbin) gid=500(linbin) groups=500(linbin)
[linbin@linux-node1 ~]$ salt '*' test.ping
linux-node2.example.com:
    True
linux-node1.example.com:
    True
[linbin@linux-node1 ~]$ salt '*' cmd.run 'uptime'
Failed to authenticate! This is most likely because this user is not permitted to execute commands, but there is a small possibility that a disk error occurred (check disk/inode usage).

[root@linux-node1 ~]# vim /etc/salt/master
245 client_acl:
246   linbin:
247     - test.ping
248     - network.*
249 
250   lb:
251     - linux-node1*:
252       - test.ping
[root@linux-node1 ~]# /etc/init.d/salt-master restart
Stopping salt-master daemon:                               [  OK  ]
Starting salt-master daemon:                               [  OK  ]
[root@linux-node1 ~]# useradd lb
[root@linux-node1 ~]# passwd lb
Changing password for user lb.
New password:
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@linux-node1 ~]# su - lb
[lb@linux-node1 ~]$ id
uid=501(lb) gid=501(lb) groups=501(lb)
[lb@linux-node1 ~]$ salt 'linux-node1*' test.ping
linux-node1.example.com:
    True

[root@linux-node1 ~]# yum -y install mysql mysql-server
[root@linux-node1 ~]# /etc/init.d/mysqld start
Starting mysqld:                                           [  OK  ]
[root@linux-node1 ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.73 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE  `salt`
    ->   DEFAULT CHARACTER SET utf8
    ->   DEFAULT COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> USE `salt`;
Database changed
mysql> DROP TABLE IF EXISTS `jids`;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE TABLE `jids` (
    ->   `jid` varchar(255) NOT NULL,
    ->   `load` mediumtext NOT NULL,
    ->   UNIQUE KEY `jid` (`jid`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE INDEX jid ON jids(jid) USING BTREE;
ERROR 1061 (42000): Duplicate key name 'jid'
mysql> DROP TABLE IF EXISTS `salt_returns`;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE TABLE `salt_returns` (
    ->   `fun` varchar(50) NOT NULL,
    ->   `jid` varchar(255) NOT NULL,
    ->   `return` mediumtext NOT NULL,
    ->   `id` varchar(255) NOT NULL,
    ->   `success` varchar(10) NOT NULL,
    ->   `full_ret` mediumtext NOT NULL,
    ->   `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    ->   KEY `id` (`id`),
    ->   KEY `jid` (`jid`),
    ->   KEY `fun` (`fun`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.04 sec)

mysql> DROP TABLE IF EXISTS `salt_events`;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE TABLE `salt_events` (
    -> `id` BIGINT NOT NULL AUTO_INCREMENT,
    -> `tag` varchar(255) NOT NULL,
    -> `data` mediumtext NOT NULL,
    -> `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    -> `master_id` varchar(255) NOT NULL,
    -> PRIMARY KEY (`id`),
    -> KEY `tag` (`tag`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.08 sec)

mysql> show tables;
+----------------+
| Tables_in_salt |
+----------------+
| jids           |
| salt_events    |
| salt_returns   |
+----------------+
3 rows in set (0.01 sec)

mysql> grant all on salt.*  to salt@'%' identified by 'salt';
Query OK, 0 rows affected (0.02 sec)

mysql> exit

[root@linux-node1 ~]# yum -y install MySQL-python
============================================================================================


作者头像
南宫俊逸创始人

做一个积极主动热情的人,为了想要完成的事情和实现的目标,拼命投入力量。

上一篇:自动化运维之ELK
下一篇:阿里云提示微擎1.8.2任意文件删除漏洞解决办法

发表评论

期待各位的加入,让原创发挥活力,让阅读更有价值!登录注册
登录
用户名
密码
注册
用户名
密码
确认密码
邮箱
验证码
找回密码
用户名
邮箱
※ 重置链接将发送到邮箱