|
salt package manager
简称SPM,使用man查看spm命令的使用方法,这一部分内容比较多,初浅的看了下文档,暂时先总结个大概,后续慢慢在探究一下细节,再进行补充。
salt 的包管理主要包含以下3个部分,
关系如图示:
(1)Packaging System
包组织系统:主要内容包含如何建立一个SPM Packages。
解析formula格式的目录结构:
(2)Repo System
建立repo包仓库和相关信息
(3)Salt Master
如何安装.spm的包,安装之后的部分目录结构如下:
下面根据实例来初浅的讲解一下SPM的配置和安装逻辑,至于运用后续再进行探究。
首先确认一下salt-master的版本,SPM功能在2015.10以后的版本才有,目前使用的环境是2016.11的版本
(一)找到制作SPM的=包的原材料,官网推荐的一个站点https://github.com/saltstack-formulas,使用git下载几个formula格式的源码包
git clone https://github.com/saltstack-formulas/nginx-formula.git
git clone https://github.com/saltstack-formulas/redis-formula.git
将软件包放置在/srv/spm,注意下载的源码包必须符合formula格式,formula包的格式要求参见http://docs.saltstack.cn/topics/spm/spm_formula.html#spm-formula
下载下来的软件包是一个目录,结构参见图package system
(二)制作spm包
spm build /path/to/salt-packages-source/myapp-formula
制作的spm包被存放在/srv/spm_build目录里面,例如包名为apache-201507-1.spm。
同时在源码目录下面会产生几个目录pillar,reactor这几个目录。
(三)生成SPM-METADATA信息
spm create_repo /srv/spm_build
生成的metedata文件就存放在spm包目录下
(四)配置安装环境和安装spm包
配置安装repo源:
/etc/salt/spm.repos.d/spm.repo
网络源:
my_repo:
url: https://spm.example.com/
本地源:
my_repo:
url: file:///srv/spm_build
更新源:
spm update_repo
安装spm包:
spm install apache
spm local install /srv/spm/apache-201506-1.spm #直接安装本地spm包
安装的包路径在/srv/spm/salt下,目录结构如下:
salt/
└── apache
├── certificates.sls
├── config.sls
├── debian_full.sls
├── files
│ ├── Debian
│ ├── FreeBSD
│ ├── RedHat
│ └── Suse
├── init.sls
├── logrotate.sls
├── manage_security.sls
├── map.jinja
├── mod_actions.sls
├── mod_cgi.sls
├── mod_dav_svn.sls
├── mod_fastcgi.sls
├── mod_fcgid.sls
├── mod_geoip.sls
├── mod_headers.sls
├── mod_mpm.sls
├── mod_pagespeed.sls
├── mod_perl2.sls
├── mod_php5.sls
├── mod_proxy_fcgi.sls
├── mod_proxy_http.sls
├── mod_proxy.sls
├── mod_remoteip.sls
├── mod_rewrite.sls
├── mod_security
│ ├── init.sls
│ └── rules.sls
├── modsecurity.yaml
├── mod_socache_shmcb.sls
├── mod_ssl.sls
├── mod_suexec.sls
├── modules.sls
├── mod_vhost_alias.sls
├── mod_wsgi.sls
├── mod_xsendfile.sls
├── no_default_vhost.sls
├── osfingermap.yaml
├── own_default_vhost.sls
├── register_site.sls
├── uninstall.sls
└── vhosts
├── minimal.tmpl
├── proxy.tmpl
├── redirect.tmpl
├── standard.sls
└── standard.tmpl
View Code 卸载spm包:
spm remove apache
(五)在file_roots中配置spm源,即可配置本地spm源,也可以配置网络spm源
file_roots:
base:
1. /srv/salt
2. /srv/spm/salt
View Code
gitfs_remotes:
- https://github.com/saltstack-formulas/apache-formula
- https://github.com/saltstack-formulas/memcached-formula
View Code 配置好spm包源之后便于include到state文件中,部署到minion端,以下是几种常见的用法:
a)include导入spm包
include:
- epel
python26:
pkg.installed:
- require:
- pkg: epel
View Code b)在top文件中引用
base:
'controller':
- openstack.horizon
- openstack.keystone
'hyper-*':
- openstack.nova
- openstack.glance
'storage-*':
- openstack.swift
View Code 详细的说明参见:https://docs.saltstack.com/en/2016.11/topics/development/conventions/formulas.html
关于Formulas格式的SPM包的一些初步理解:
制作一个Formulas格式的spm包,可以在salt环境为我们提供一整套通用管理业务软件的方法,这些方法包括软件包安装,服务管理,配置管理等,当我们include一个spm包之后, 里面可配置的地方全部已经帮我们以模板,变量的方式设置好了,屏蔽了底层因操作系统环境差异而产生的配置差异给我们带来额外的麻烦,减少了冗余。
示例:
一个Formulas包的init.sls,这是类似python里面的__init__一个初始化的结构函数。
{% from "apache/map.jinja" import apache with context %}
apache:
pkg.installed:
- name: {{ apache.server }}
group.present:
- name: {{ apache.group }}
- system: True
user.present:
- name: {{ apache.user }}
- gid: {{ apache.group }}
- system: True
service.running:
- name: {{ apache.service }}
- enable: True
# The following states are inert by default and can be used by other states to
# trigger a restart or reload as needed.
apache-reload:
module.wait:
- name: service.reload
- m_name: {{ apache.service }}
apache-restart:
module.wait:
- name: service.restart
- m_name: {{ apache.service }}
View Code 其中第一行中的{% from "apache/map.jinja" import apache with context %}模板中引入了apache/map.jinja
再看apache/map.jinja中的内容:
{% import_yaml "apache/osfingermap.yaml" as osfingermap %}
{% import_yaml "apache/modsecurity.yaml" as modsec %}
{% set apache = salt['grains.filter_by']({
'Gentoo': {
'server': 'www-servers/apache',
'service': 'apache2',
'user': 'apache',
'group': 'apache',
'configfile': '/etc/apache2/httpd.conf',
'mod_wsgi': 'www-apache/mod_wsgi',
'mod_fcgid': 'www-apache/mod_fcgid',
'vhostdir': '/etc/apache2/vhosts.d',
'confdir': '/etc/conf.d/apache2',
'confext': '.conf',
'default_site': 'default',
'default_site_ssl': 'default-ssl',
'logdir': '/var/log/apache2',
'logrotatedir': '/etc/logrotate.d/apache2',
'wwwdir': '/var/www',
},
'Debian': {
'server': 'apache2',
'service': 'apache2',
'user': 'www-data',
'group': 'www-data',
'configfile': '/etc/apache2/apache2.conf',
'portsfile': '/etc/apache2/ports.conf',
'mod_wsgi': 'libapache2-mod-wsgi',
'mod_php5': 'libapache2-mod-php5',
'mod_perl2': 'libapache2-mod-perl2',
'mod_fcgid': 'libapache2-mod-fcgid',
'mod_pagespeed_source': 'https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_amd64.deb',
'mod_xsendfile': 'libapache2-mod-xsendfile',
'mod_fastcgi': 'libapache2-mod-fastcgi',
'vhostdir': '/etc/apache2/sites-available',
'confdir': '/etc/apache2/conf.d',
'confext': '.conf',
'default_site': 'default',
'default_site_ssl': 'default-ssl',
'logdir': '/var/log/apache2',
'logrotatedir': '/etc/logrotate.d/apache2',
'wwwdir': '/srv',
},
'RedHat': {
'server': 'httpd',
'service': 'httpd',
'user': 'apache',
'group': 'apache',
'configfile': '/etc/httpd/conf/httpd.conf',
'mod_wsgi': 'mod_wsgi',
'conf_mod_wsgi': '/etc/httpd/conf.d/wsgi.conf',
'mod_php5': 'php',
'mod_pagespeed_source': 'https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_x86_64.rpm',
'vhostdir': '/etc/httpd/vhosts.d',
'confdir': '/etc/httpd/conf.d',
'confext': '.conf',
'default_site': 'default',
'default_site_ssl': 'default-ssl',
'logdir': '/var/log/httpd',
'logrotatedir': '/etc/logrotate.d/httpd',
'wwwdir': '/var/www',
'default_charset': 'UTF-8',
},
'Suse': {
'server': 'apache2',
'service': 'apache2',
'user': 'wwwrun',
'group': 'www',
'configfile': '/etc/apache2/httpd.conf',
'mod_wsgi': 'apache2-mod_wsgi',
'mod_php5': 'apache2-mod_php5',
'mod_fcgid': 'apache2-mod_fcgid',
'vhostdir': '/etc/apache2/vhosts.d',
'confdir': '/etc/apache2/conf.d',
'confext': '.conf',
'default_site': 'vhost.template',
'default_site_ssl': 'vhost-ssl.template',
'logdir': '/var/log/apache2',
'wwwdir': '/srv/www',
},
'FreeBSD': {
'server': 'apache22',
'service': 'apache22',
'user': 'www',
'group': 'www',
'configfile': '/usr/local/etc/apache22/httpd.conf',
'portsfile': '/usr/local/etc/apache22/ports.conf',
'mod_php5': 'mod_php56',
'mod_perl2': 'ap22-mod_perl2',
'mod_wsgi': 'ap22-mod_wsgi3',
'vhostdir': '/usr/local/etc/apache22/Includes',
'confdir': '/usr/local/etc/apache22/extra',
'modulesdir': '/usr/local/etc/apache22/modules.d',
'global_document_root': '/usr/local/www/apache22/data',
'confext': '',
'default_site': 'default',
'default_site_ssl': 'default-ssl',
'logdir': '/var/log/',
'wwwdir': '/usr/local/www/apache22/',
},
}, merge=salt['grains.filter_by']({
'precise': {
'confext': '',
'default_site': 'default',
'default_site_ssl': 'default-ssl',
},
'trusty': {
'confext': '.conf',
'default_site': '000-default.conf',
'default_site_ssl': 'default-ssl.conf',
},
'utopic': {
'confext': '.conf',
'default_site': '000-default.conf',
'default_site_ssl': 'default-ssl.conf',
},
'vivid': {
'confext': '.conf',
'default_site': '000-default.conf',
'default_site_ssl': 'default-ssl.conf',
},
'wily': {
'confext': '.conf',
'default_site': '000-default.conf',
'default_site_ssl': 'default-ssl.conf',
},
'xenial': {
'confext': '.conf',
'default_site': '000-default.conf',
'default_site_ssl': 'default-ssl.conf',
},
'yakkety': {
'confext': '.conf',
'default_site': '000-default.conf',
'default_site_ssl': 'default-ssl.conf',
},
'zesty': {
'confext': '.conf',
'default_site': '000-default.conf',
'default_site_ssl': 'default-ssl.conf',
},
'artful': {
'confext': '.conf',
'default_site': '000-default.conf',
'default_site_ssl': 'default-ssl.conf',
},
'jessie': {
'wwwdir': '/var/www',
'confext': '.conf',
'default_site': '000-default.conf',
'default_site_ssl': 'default-ssl.conf',
},
'stretch': {
'wwwdir': '/var/www',
'confext': '.conf',
'default_site': '000-default.conf',
'default_site_ssl': 'default-ssl.conf',
},
'buster': {
'wwwdir': '/var/www',
'confext': '.conf',
'default_site': '000-default.conf',
'default_site_ssl': 'default-ssl.conf',
},
}, grain='oscodename', merge=salt['grains.filter_by'](
osfingermap
, grain='osfinger', merge=salt['pillar.get']('apache:lookup')))) %}
{% set modsecurity = salt['grains.filter_by'](
modsec
, grain='os_family', merge=salt['pillar.get']('apache:mod_security')) or {} %}
{# merge the os family/codename mod_sec's specific data over the defaults #}
{% do apache.update({ 'mod_security': modsecurity }) %}
View Code 又导入了两个yaml的配置内容
default:
version: '2.4'
Ubuntu-12.04:
version: '2.2'
Red Hat Enterprise Linux Server-6:
version: '2.2'
Red Hat Enterprise Linux Server-7:
version: '2.4'
CentOS-6:
version: '2.2'
CentOS Linux-7:
version: '2.4'
conf_mod_wsgi: '/etc/httpd/conf.modules.d/10-wsgi.conf'
Oracle Linux Server-6:
version: '2.2'
Oracle Linux Server-7:
version: '2.4'
Amazon Linux AMI-2014:
version: '2.2'
Amazon Linux AMI-2015:
version: '2.2'
Amazon Linux AMI-2016:
version: '2.2'
View Code
default:
crs_install: False
manage_config: False
Debian:
crs_install: False
manage_config: False
package: libapache2-mod-security2
crs_package: modsecurity-crs
config_file: /etc/modsecurity/modsecurity.conf-recommended
RedHat:
crs_install: False
manage_config: False
package: mod_security
crs_package: mod_security_crs
config_file: /etc/httpd/conf.d/mod_security.conf
View Code 里面的配置的grains变量根据minion端的实际配置读取,达到消除部署的差异化,提高配置性的灵活性和便利性。
先写一点吧,后面再续......... |
|