salt-states
所属分类:DevOps
开发工具:Scheme
文件大小:0KB
下载次数:0
上传日期:2014-06-30 06:50:52
上 传 者:
sh-1993
说明: 以一个小的电商网站([www.mall.com)为例,讲述](http: www.mall.com%EF%BC%89%E4%B8%BA%E4%BE%8B%EF%BC%8C%E8%AE%B2%E8%BF%B0)Saltstack在真实场景中的应用。,
(Taking a small e-commerce website ([www.mall. com]) as an example, describe the application of] (http: www.mall. com% EF% BC% 89% E4% B8% BA% E4% BE% 8B% EF% BC% 8C% E8% AE% B2% E8% BF% B0) Saltstack in real scenes.,)
文件列表:
pillar/ (0, 2014-06-29)
pillar/nodes/ (0, 2014-06-29)
pillar/nodes/db1.sls (76, 2014-06-29)
pillar/nodes/db2.sls (81, 2014-06-29)
pillar/nodes/ha1.sls (282, 2014-06-29)
pillar/nodes/ha2.sls (281, 2014-06-29)
pillar/nodes/mc1.sls (135, 2014-06-29)
pillar/nodes/mc2.sls (179, 2014-06-29)
pillar/roles/ (0, 2014-06-29)
pillar/roles/admin.sls (159, 2014-06-29)
pillar/roles/cache.sls (207, 2014-06-29)
pillar/roles/common.sls (75, 2014-06-29)
pillar/roles/db.sls (103, 2014-06-29)
pillar/roles/ha.sls (105, 2014-06-29)
pillar/roles/mc.sls (107, 2014-06-29)
pillar/roles/search.sls (108, 2014-06-29)
pillar/roles/storage.sls (173, 2014-06-29)
pillar/roles/web.sls (440, 2014-06-29)
pillar/salt/ (0, 2014-06-29)
pillar/salt/minion.sls (76, 2014-06-29)
pillar/schedule/ (0, 2014-06-29)
pillar/schedule/highstate.sls (69, 2014-06-29)
pillar/svn/ (0, 2014-06-29)
pillar/svn/init.sls (20, 2014-06-29)
pillar/top.sls (602, 2014-06-29)
pillar/users/ (0, 2014-06-29)
pillar/users/init.sls (908, 2014-06-29)
pillar/zabbix/ (0, 2014-06-29)
pillar/zabbix/agent.sls (45, 2014-06-29)
pillar/zabbix/api.sls (706, 2014-06-29)
salt/ (0, 2014-06-29)
salt/_grains/ (0, 2014-06-29)
salt/_grains/roles.py (353, 2014-06-29)
salt/_runners/ (0, 2014-06-29)
salt/_runners/publish.py (1803, 2014-06-29)
salt/_runners/publish.pyc (1356, 2014-06-29)
salt/apache/ (0, 2014-06-29)
salt/apache/files/ (0, 2014-06-29)
salt/apache/files/etc/ (0, 2014-06-29)
... ...
本文以一个小的电商网站(www.mall.com)为例,讲述Saltstack在真实场景中的应用。主要介绍如何使用salt对电商网站各种服务进行管理、基于角色对应用进行自动化监控、基于Saltstack runner的代码部署系统等,主要包括以下主题:
* [网站架构介绍](http://yoyolive.com/saltstack/2014/05/27/saltstack-example-introduction.html)
* [Saltstack安装](http://yoyolive.com/saltstack/2014/05/28/saltstack-install.html)
* [基础服务部署](http://yoyolive.com/saltstack/2014/05/29/saltstack-base-service.html)
* [服务部署](http://yoyolive.com/saltstack/2014/06/14/saltstack-service.html)
* [代码部署系统搭建](http://yoyolive.com/saltstack/2014/06/15/saltstack-publish.html)
* [自动化监控](http://yoyolive.com/saltstack/2014/06/16/saltstack-zabbix-monitor.html)
* [Salt模块的扩展](http://yoyolive.com/saltstack/2014/06/17/saltstack-expand.html)
Salt state模块在CentOS 6.5 Saltstack 2014.1.4下测试。
## 网站架构介绍
### 网络架构
1. 使用Haproxy做负载均衡,一主一备,当主服务器宕机后备服务器自动接替主服务器角色对外提供服务。
2. WEB前端采用Nginx+PHP提供动态页面的访问;所有前端服务器通过NFS协议挂载共享存储,商品展示图片上传至存储中,图片访问时通过Varnish进行缓存加速。
3. 使用memcached做缓冲层来提高访问速度和减轻数据库的压力;使用Redis做队列服务。
4. 数据持久层使用MySQL,MySQL采用主从模式,通过主从分离提高访问速度。
5. 使用Salt对整个系统进行配置管理;使用Zabbix进行系统监控;所有服务器通过跳板机进行登录。
6. 使用SVN统一管理代码和配置信息。
![网络架构](http://yoyolive.com/assets/images/14-05-27/net.png)
说明:上面网络架构未按实际服务器数量画出,具体服务器见角色划分部分。
### 系统架构
1. 统一管理:整个系统通过Salt进行配置管理,所有配置文件统一存储到SVN中,通过SVN版本控制能够在系统故障时轻松回退到上一个正常版本。
2. 代码部署:通过命令行部署工具从SVN中检出代码并部署到WEB前端,做到简单轻松部署。
3. 应用架构:采用经典的三层架构--代码解析层、缓冲层、数据持久化层。缓冲层对用户数据进行缓存,不必每次都去数据库提取数据,减轻数据库压力;数据库采用主从架构,读写分离,减轻主库负载,提高了用户的访问速度。
4. 动静态分离:图片、CSS、JS与动态程序分离,通过Varnish进行加速,提升用户体验。
5. Zabbix监控:基于角色的自动监控机制,通过Zabbix对系统状态、应用状态进行自动监控。
![系统架构](http://yoyolive.com/assets/images/14-05-27/sys.png)
### 角色划分(主机名、IP地址分配)
说明:所有服务器配置内、外双网卡,eth0为内网,eth1为外网。操作系统统一部署CentOS 6.5 64位。
#### 负载均衡(ha)
需要两台服务器作为负载均衡器使用,两台服务器配置为主备模式,当主服务器宕机后从服务器自动接管服务。
* ha1.grid.mall.com 60.60.60.11 172.16.100.11
* ha2.grid.mall.com 60.60.60.12 172.16.100.12
#### Web前端(web)
需要三台服务器作为Web前端服务器,对外提供Web服务,Web服务通过负载均衡供用户访问。
* web1.grid.mall.com 60.60.60.21 172.16.100.21
* web2.grid.mall.com 60.60.60.22 172.16.100.22
* web3.grid.mall.com 60.60.60.23 172.16.100.23
#### 图片缓存(cache)
需要两台服务器作为商品图片的缓存服务器,缓存服务器通过负载均衡供用户访问。
* cache1.grid.mall.com 60.60.60.31 172.16.100.31
* cache2.grid.mall.com 60.60.60.32 172.16.100.32
#### 缓存服务和队列服务(mc)
需要两台服务器提供缓冲服务器和队列服务。
* mc1.grid.mall.com 60.60.60.41 172.16.100.41
* mc2.grid.mall.com 60.60.60.42 172.16.100.42
#### 数据库(db)
需要两台服务器提供数据库服务,两台服务器通过主从复制同步数据。
* db1.grid.mall.com 60.60.60.51 172.16.100.51
* db2.grid.mall.com 60.60.60.52 172.16.100.52
#### 搜索(search)
需要两台服务器提供搜索服务。
* search1.grid.mall.com 60.60.60.61 172.16.100.61
* search2.grid.mall.com 60.60.60.62 172.16.100.62
#### 共享存储(storage)
需要一台服务器提供存储服务。
* storage1.grid.mall.com 60.60.60.71 172.16.100.71
#### 管理机(admin)
需要一台管理机,上面部署Salt master,zabbix,svn等管理服务。
* admin.grid.mall.com 60.60.60.81 172.16.100.81
## Saltstack安装
Saltstack源码地址:https://github.com/saltstack/salt,最新版本为v2014.1.4。
需要自己[打rpm包](http://yoyolive.com/%E5%85%B6%E4%BB%96/2014/05/22/rpm-pkg.html),salt描述文件:https://github.com/saltstack/salt/blob/develop/pkg/rpm/salt.spec,另外最新版本的salt需要python-libcloud,也需要提前打好包。如果是在CentOS 5.x 上安装salt,需要升级zeromq到3.x版。将所有打好的rpm包放入yum仓库,开始安装。
### Salt Master安装
注意:安装前确保主机名已按角色划分部分进行配置。
安装salt-master:
# yum install -y salt-master
修改配置文件:/etc/salt/master,使salt监听在内网网卡上。
interface: 172.16.100.81
启动Salt Master:
# /etc/init.d/salt-master start
查看启动情况,4505端口处于监听状态:
# netstat -tunlp |grep 4505
### Salt Minion安装
注意:安装前确保主机名已按角色划分部分进行配置。
安装salt-minion:
# yum install -y salt-minion
修改配置文件:/etc/salt/minion,使其连接到master。
master: 172.16.100.81
启动Salt Minion:
# /etc/init.d/salt-minion start
查看启动情况,4506端口处于监听状态:
# netstat -tunlp |grep 4506
### 在Salt Master上为Salt Minion授权
查看Salt Minion是否已经向Salt Master请求授权:
# salt-key -L
Accepted Keys:
Unaccepted Keys:
admin.grid.mall.com
为Salt Minion授权:
# salt-key -a admin.grid.mall.com
## 基础服务部署
对基础服务的管理包括配置管理系统、用户账号管理、yum配置管理、hosts文件管理、时间同步管理、DNS配置管理。
### 配置管理系统
配置管理系统使用模块化设计,每个服务一个模块,将多个模块组织到一起形成角色(/srv/salt/roles/)。所有模块放置到:/srv/salt下,入口配置文件为:/srv/salt/top.sls。模块使用的变量放置到:/srv/pillar,入口配置文件:/srv/pillar/top.sls。针对变量的作用域不同,将变量分为三级级,一级应用于模块(/srv/pillar/模块名),一级应用于角色(/srv/pillar/roles/),一级应用于主机节点(/srv/pillar/nodes)。具体配置在此不一一列出,具体参见salt配置文件。
入口配置/srv/salt/top.sls,直接引用各种角色:
base:
'*':
- roles.common
'admin.grid.mall.com':
- roles.admin
'ha.grid.mall.com':
- roles.ha
'web*.grid.mall.com':
- roles.web
'cache*.grid.mall.com':
- roles.cache
'mc*.grid.mall.com':
- roles.mc
'db*.grid.mall.com':
- roles.db
'search*.grid.mall.com':
- roles.search
'storage*'.grid.mall.com':
- roles.storage
变量入口配置文件/srv/pillar/top.sls:
base:
'*':
- roles.common
# 引用角色级变量
# 模块级变量在角色级变量中引用
'admin.grid.mall.com':
- roles.admin
'ha.grid.mall.com':
- roles.ha
'web*.grid.mall.com':
- roles.web
'cache*.grid.mall.com':
- roles.cache
'mc*.grid.mall.com':
- roles.mc
'db*.grid.mall.com':
- roles.db
'search*.grid.mall.com':
- roles.search
'storage*'.grid.mall.com':
- roles.storage
# 引用节点级变量
'ha1.grid.mall.com':
- nodes.ha1
'ha2.grid.mall.com':
- nodes.ha2
'mc1.grid.mall.com':
- nodes.mc1
'mc2.grid.mall.com':
- nodes.mc2
'db1.grid.mall.com':
- nodes.db1
'db2.grid.mall.com':
- nodes.db2
### 用户账号管理
用户管理模块:/srv/salt/users
此模块用到pillar,pillar和grains都可以用来获取变量,但是grains偏向于获取客户端相关信息,比如硬件架构、cpu核数、操作系统版本等信息,相当于puppet的facter;pillar用于定义用户变量,通过pillar变量的传递,使salt state模块易于重用,相当于puppet的hiera。使用pillar变量之前需要执行salt '*' saltutil.refresh_pillar命令使定义生效。使用命令salt 'admin.grid.mall.com' pillar.item users获取users变量:
# salt 'admin.grid.mall.com' pillar.item users
admin.grid.mall.com:
----------
users:
----------
dongliang:
----------
fullname:
Shi Dongliang
gid:
1000
group:
dongliang
password:
$6$BZpX5dWZ$./TKqv8ZL3eLNAAmuiGWeT0SvwvpPtk5Nhgf8.xeyFd5XVMJ0QRh8HmiJOpJi7qPCo. mfXIIrbQSGdAJVmZxW.
shell:
/bin/bash
ssh_auth:
----------
comment:
dongliang@leju.com
key:
AAAAB3NzaC1yc2EAAAABIwAAAQEAmCqNHfK6VACeXsAnRfzq3AiSN+U561pSF8qoLOh5Ez38UqtsFLBaFdC/pTTxGQBYhwO2KkgWL9TtWOEp+LxYLskXUeG24pIe8y8r+edHC8fhmHGXWXQVmZwRERl+ygTdFt3ojhDu1FYA0WmKU07KgAqUrvJW1zwJsa/DaXExfwSzALAgm2jwx68hP9CO1msTAhtElUJWeLTlQTZr0ZGWvmlKzcwqxDX58HpA69qgccaOzO5n5qsQYXx8JmnCV18XW9bkxMvn5q8Y9o/to+BQ1440hKcsm9rNpJlIrnQaIbMZs/Sy2QnT+bVx9JyucDvaVJmsfJ+qZlfnhdRkm6eosw==
sudo:
True
uid:
1000
获取admin.grid.mall.com上面定义的所有pillar变量:
# salt 'admin.grid.mall.com' pillar.items
添加用户:
/srv/salt/users/user.sls用于管理用户
include:
- users.sudo
{% for user, args in pillar['users'].iteritems() %}
{{user}}:
group.present:
- gid: {{args['gid']}}
user.present:
- home: /home/{{user}}
- shell: {{args['shell']}}
- uid: {{args['uid']}}
- gid: {{args['gid']}}
- fullname: {{args['fullname']}}
{% if 'password' in args %}
- password: {{args['password']}}
{% endif %}
- require:
- group: {{user}}
{% if 'sudo' in args %}
{% if args['sudo'] %}
sudoer-{{user}}:
file.append:
- name: /etc/sudoers
- text:
- '{{user}} ALL=(ALL) NOPASSWD: ALL'
- require:
- file: sudoers
- user: {{user}}
{% endif %}
{% endif %}
{% if 'ssh_auth' in args %}
/home/{{user}}/.ssh:
file.directory:
- user: {{user}}
- group: {{args['group']}}
- mode: 700
- require:
- user: {{user}}
/home/{{user}}/.ssh/authorized_keys:
file.managed:
- user: {{user}}
- group: {{args['group']}}
- mode: 600
- require:
- file: /home/{{user}}/.ssh
{{ args['ssh_auth']['key'] }}:
ssh_auth.present:
- user: {{user}}
- comment: {{args['ssh_auth']['comment']}}
- require:
- file: /home/{{user}}/.ssh/authorized_keys
{% endif %}
{% endfor %}
sudo.sls为用户添加sudo权限:
sudoers:
file.managed:
- name: /etc/sudoers
/srv/salt/users/user.sls读取/srv/pillar/users/init.sls中的users变量。
users:
dongliang: # 定义用户名
group: dongliang # 用户所在组
uid: 1000 # 用户uid
gid: 1000 # 用户gid
fullname: Shi Dongliang
password: $6$BZpX5dWZ$./TKqv8ZL3eLNAAmuiGWeT0SvwvpPtk5Nhgf8.xeyFd5XVMJ0QRh8HmiJOpJi7qPCo. mfXIIrbQSGdAJVmZxW. # 密码,注意是hash后的密码
shell: /bin/bash # 用户shell
sudo: true # 是否给sudo权限
ssh_auth: # 无密码登录,可选项
key: AAAAB3NzaC1yc2EAAAABIwAAAQEAmCqNHfK6VACeXsAnRfzq3AiSN+U561pSF8qoLOh5Ez38UqtsFLBaFdC/pTTxGQBYhwO2KkgWL9TtWOEp+LxYLskXUeG24pIe8y8r+edHC8fhmHGXWXQVmZwRERl+ygTdFt3ojhDu1FYA0WmKU07KgAqUrvJW1zwJsa/DaXExfwSzALAgm2jwx68hP9CO1msTAhtElUJWeLTlQTZr0ZGWvmlKzcwqxDX58HpA69qgccaOzO5n5qsQYXx8JmnCV18XW9bkxMvn5q8Y9o/to+BQ1440hKcsm9rNpJlIrnQaIbMZs/Sy2QnT+bVx9JyucDvaVJmsfJ+qZlfnhdRkm6eosw==
comment: dongliang@mall.com
在salt-master上执行下面命令使配置生效
# salt '*' saltutil.refresh_pillar
# salt '*' state.highstate
### yum配置管理
yum配置管理:/srv/salt/base/repo.sls
配置文件:/srv/salt/base/files/mall.repo \# 此配置文件可以通过salt协议下发到客户端
/srv/salt/base/repo.sls定义,管理mall.repo文件,当文件改变后执行yum clean all清理缓存,是配置生效。
/etc/yum.repos.d/mall.repo:
file.managed:
- source: salt://base/files/mall.repo
- user: root
- group: root
- mode: 644
- order: 1
cmd.wait:
- name: yum clean all
- watch:
- file: /etc/yum.repos.d/mall.repo
### hosts文件管理
hosts文件管理:/srv/salt/base/hosts.sls
/srv/salt/base/hosts.sls 定义了每个主机名和IP的对应关系。如下:
admin.grid.mall.com:
host.present:
- ip: 172.16.100.81
- order: 1
- names:
- admin.grid.mall.com
### 时间同步管理
时间同步作为一个cron,定义文件为:/srv/salt/base/crons.sls
# 引用ntp模块
include:
- ntp
'/usr/sbin/ntpdate 1.cn.pool.ntp.org 1.asia.pool.ntp.org':
cron.present:
- user: root
- minute: 0
- hour: 2
ntp模块:ntp/init.sls
# 安装ntpdate软件包
ntpdate:
pkg.installed:
- name: ntpdate
### DNS配置管理
配置DNS服务器定义在resolv.sls,控制/etc/resolv.conf配置文件:
/etc/resolv.conf:
file.managed:
- source: salt://base/files/resolv.conf
- user: root
- group: root
- mode: 644
- template: jinja
## 服务部署
本节以web服务器为例介绍salt服务的部署。把不同的服务组织成不同的角色,然后将角色应用到不同的节点上。通过角色的划分能够清晰的对不同的服务模块进行组织,所有角色的配置放到/srv/salt/roles下,角色用到的相关变量放到/srv/pillar/roles和/srv/pillar/nodes下,其中/srv/pillar/nodes下放置与具体节点相关的变量。
### 角色与配置文件
/srv/salt/roles/web.sls配置如下,包括nginx模块、rsync模块、limits模块和nfs.client:
include:
- nginx
- rsync
- limits
- nfs.client
变量/srv/pillar/roles/web.sls如下,没有单独应用到节点的变量:
hostgroup: web # 定义zabbix分组,具体见后文的自动化监控一节
vhostsdir: /data1/vhosts # 代码发布目录
vhostscachedir: /data1/cache # 程序临时目录
logdir: /data1/logs # nginx日志目录
vhosts: # 虚拟主机名,用于创建对用的代码发布目录
- www.mall.com
- static.mall.com
limit_users: # 对用户打开文件数做设置
nginx:
limit_hard: 65535
limit_soft: 65535
limit_type: nofile
mounts: # nfs共享存储挂载相关配置
/data1/vhosts/static.mall.com/htdocs:
device: 172.16.100.71:/data1/share
fstype: nfs
mkmnt: True
opts: async,noatime,noexec,nosuid,soft,timeo=3,retrans=3,intr,retry=3,rsize=16384,wsize=16384
### Nginx+PHP配置
管理模块:/srv/salt/nginx/
nginx配置文件:/srv/salt/nginx/files/etc/nginx/,其中包括主配置文件、虚拟主机配置文件、和环境变量配置文件。
php配置文件:主配置文件:/srv/salt/nginx/files/etc/php.ini 模块配置文件:/srv/salt/nginx/files/etc/php.d/
php-fpm配置文件:主配置文件:/srv/salt/nginx/files/etc/php-fpm.conf 其他配置文件:/srv/salt/nginx/files/etc/php-fpm.d/
角色配置:/srv/pillar/roles/web.sls
#### 详细说明
/srv/salt/nginx/init.sls用于组织整个nginx模块:
include:
- nginx.server # 包含nginx相关配置
- nginx.php # 包含php相关配置
- nginx.monitor # 包含监控相关配置
/srv/salt/nginx/server.sls用于配置nginx服务:
include:
- users.sudo
{% for user, args in pillar['users'].iteritems() %}
{{user}}:
group.present:
- gid: {{args['gid']}}
user.present:
- home: /home/{{user}}
- shell: {{args['shell']}}
- uid: {{args['uid']}}
- gid: {{args['gid']}}
- fullname: {{args['fullname']}}
{% if 'password' in args %}
- password: {{args['password']}}
{% endif %}
- require:
- group: {{user}}
{% if 'sudo' in args %}
{% if args['sudo'] %}
sudoer-{{user}}:
file.append:
- name: /etc/sudoers
- text:
- '{{user}} ALL=(ALL) NOPASSWD: ALL'
- require:
- file: sudoers
- user: {{user}}
{% endif %}
{% endif %}
{% if 'ssh_auth' in args %}
/home/{{user}}/.ssh:
file.directory:
- user: {{user}}
- group: {{args['group']}}
- mode: 700
- require:
- user: {{user}}
/home/{{user}}/.ssh/authorized_keys:
file.managed:
- user: {{user}}
- group: {{args['group']}}
- mode: 600
- require:
- file: /home/{{user}}/.ssh
{{ args['ssh_auth']['key'] }}:
ssh_auth.present:
- user: {{user}}
- comment: {{args['ssh_auth']['comment']}}
- require:
- file: /home/{{user}}/.ssh/authorized_keys
{% endif %}
{% endfor %}
Stone:salt dongliang$ cat nginx/server.sls
include:
- zabbix.agent
- salt.minion
nginx:
pkg:
- name: nginx
- installed
service:
- name: nginx
- running
- require:
- pkg: nginx
- watch:
- pkg: nginx
- file: /etc/nginx/nginx.conf
- file: /etc/nginx/conf.d/
/etc/nginx/nginx.conf:
file.managed:
- source: salt://nginx/files/etc/nginx/nginx.conf
- template: jinja
- user: root
- group: root
- mode: 644
- backup: minion
/etc/nginx/conf.d/:
file.recurse:
- source: salt://nginx/files/etc/nginx/conf.d/
- template: jinja
- user: root
- group: root
- dir_mode: 755
- file_mode: 644
{% set logdir = salt['pillar.get']('logdir', '/var/log/nginx') %}
{{logdir}}:
cmd.run:
- name: mkdir -p {{logdir}}
- unless: test -d {{logdir}}
- require:
- pkg: nginx
{% if salt['pillar.get']('vhosts', false) %}
{% set dir = salt['pillar.get']('vhostsdir', '/var/www/html') %}
{% set cachedir = salt['pillar.get']('vhostscachedir', '/var/www/cache') %}
{% for vhost in pillar['vhosts'] %}
{{dir}}/{{vhost}}/htdocs:
cmd.run:
- name: mkdir -p {{dir}}/{{vhost}}/htdocs && chown -R nobody.nobody {{dir}}/{{vhost}}/htdocs
- unless: test -d {{dir}}/{{vhost}}/htdocs
- require:
- pkg: nginx
{{cachedir}}/{{vhost}}:
cmd.run:
- name: mkdir -p {{cachedir}}/{{vhost}} && chown -R nginx.nginx {{cachedir}}/{{vhost}}
- unless: test -d {{cachedir}}/{{vhost}}
- require:
- pkg: nginx
{% endfor %}
{% endif %}
nginx-role:
file.append:
- name: /etc/salt/roles
- text:
- 'nginx'
- require:
- file: roles
- service: nginx
- service: salt-minion
- watch_in:
- module: sync_grains
管理nginx相关配置,主要包括安装nginx软件包配置相关配置文件,并启动nginx服务。创建日志目录、代码发布目录、代码缓存目录。并配置服务角色,角色也用于对服务的监控,详见后文自动化监控。
/srv/salt/nginx/php.sls用于配置php服务:
定义php相关配置,主要包括安装php软件包配置相关配置文件,启动php-fpm服务,并配置服务角色。
php-fpm:
pkg:
- name: php-fpm
- pkgs:
- php-fpm
- php-common
- php-cli
- php-devel
- php-pecl-memcache
- php-pecl-memcached
- php-gd
- php-pear
- php-mbstring
- php-mysql
- php-xml
- php-bcmath
- php-pdo
- installed
service:
- running
- require:
- pkg: php-fpm
- watch:
- pkg: php-fpm
- file: /etc/php.ini
- file: /etc/php.d/ ... ...
近期下载者:
相关文件:
收藏者: