ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SaltStack技术入门与实战【1.3】

SaltStack技术入门与实战【1.3】 3.6 Keepalived配置管理首先放置源码包、Keepalived的启动脚本、sysconfig配置文件在/srv/salt/prod/keepalived/files/目录下。启动脚本和配置文件都可以从源码包中获取到。3.7 Memcached配置管理Memcached是一个高性能的分布式内存对象缓存系统用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数从而提高动态数据库驱动网站的访问速度。我们这个架构案例使用Memcached来存储用户的Session。我们经常会在负载均衡的环境下遇到Session问题一般的解决办法有三种·Session保持。·Session复制。·Session共享。PHP可以很容易在php.ini配置中将Session存储在Memcached中来实现Session共享这样后端服务器有节点宕机用户的访问请求被调度到集群中的其他节点时用户的会话也不会丢失。Memcached的安装比较简单。首先Memcached依赖于libevent所以需要先编译安装libevent然后编译安装Memcached。后面我们在PHP配置管理中编写php-memcache的模块。同时还需要创建一个管理用户的配置Memcached包括后面要配置的Nginx和PHP都要使用www用户进行管理。首先创建目录结构如下[rootsaltstack-node1 ~]# mkdir -p /srv/salt/prod/libevent/files[rootsaltstack-node1 ~]# mkdir -p /srv/salt/prod/memcached/files[rootsaltstack-node1 ~]# mkdir /srv/salt/prod/user3.8 Nginx配置管理经过HaproxyKeepalived的自动化配置基本的流程我们掌握了下面就来进行NginxPHP的自动化配置。同样也是使用源码包的方式进行编译安装。在开始编写一个稍复杂的状态功能时首先应该进行规划。包括应该如何设计目录结构需要应用到哪些状态模块和状态间关系是否需要使用Grains和Pillar等。NginxPHPFastCGI需要安装的包首先有Nginx和PHP需要进行编译安装步骤如下1所有源码包的编译安装需要依赖一些基础软件包像gcc、make这样的这些在我们的环境做初始化配置的时候已经编写了pkg-init.sls。2源码编译安装Nginx时需要依赖PCRE所以需要有一个PCRE模块用来安装PCRE然后Nginx进行include即可。3需要编译安装PHP同时除了PHP常用的模块外还应该支持如Memcached和Redis这样的生产常用的第三方模块我们需要一个机制把它加进去。需要使用到的功能如下·使用状态模块file、cmd、service。·使用状态间关系require、unless。·SLS之间的include。首先需要创建如下目录结构[rootsaltstack-node1 ~]# mkdir -p /srv/salt/prod/pcre/files/[rootsaltstack-node1 ~]# mkdir -p /srv/salt/prod/nginx/files[rootsaltstack-node1 ~]# mkdir -p /srv/salt/prod/php/files创建完目录结构后需要把源码包放置在各个服务目录的files目录下# wget http://nginx.org/download/nginx-1.8.0.tar.gz # cp nginx-1.8.0.tar.gz /srv/salt/prod/nginx/files/ # wget http://cn2.php.net/distributions/php-5.6.9.tar.gz3.9 业务应用模块在前面的章节我们完成了NginxPHPFastCGI环境中基础模块的编写实际的生产环境中不建议在top.sls里面写上很多SLS的应用和前面使用的HaproxyKeepalived一样我们可以基于业务进行引用或者基于角色进行引用。比如一个Web站点现在我们创建一个Web服务的目录然后在里面编写SLS把需要的模块include进来把单独需要进行配置的进行编写就可以了。那么我们现在就可以在业务中应用了。第4章 扩展SaltStack组件前几章我们已经了解了SaltStack各个组件以及通过一个案例去熟悉它的各种应用从这章开始我们通过Python语言去扩展SaltStack组件。虽然SaltStack自带的各种组件在功能上已经很成熟了但是有时候也无法满足企业各种复杂的环境。本章的主要内容就是如何去扩展SaltStack各个组件。因为SaltStack是基于Python语言开发的所以本章会涉及Python语言相关知识。考虑到有些不了解Python的读者以及作者对Python开发能力有限所以本章尽量少引入Python相关知识点。4.1 扩展Grains在第2章我们已经了解了Grians组件的相关知识在SaltStack案例章节中也了解了如何去它。虽然Grains能收集得到Minion的各种静态信息但是为了满足更加复杂的应用希望Grains能根据我们的需求去采集一些信息例如在大批量机器中我们区分每台设备的业务角色这个时候我们就可以自定义一个Grains让Minion通过外部数据CMDB去采集自己的业务汇报给Master。在大规模的配置中我们就可以利用这个Grains值去更加方便地管理配置各个角色的设备。4.2 扩展Module第2章也介绍了如何去使用ModuleSaltStack默认已经自带很多Modules可以方便地直接使用。SaltStack所有的模块其实都是Python脚本脚本默认路径是在当前Python版本的sitepackages/salt/modules/下。每个脚本就是一个模块脚本里面的一个函数就是Module的一个方法。4.3 扩展state在日常做配置管理的时候其实我们大部分时间都是在写或者维护state sls文件。每次有新需求的时候可能面对编写大量的state。当然SaltStack也自带很多state如果有能满足需求的state我们可以直接使用它。但是如果发现自己有些业务比较复杂SaltStack没有一个比较合适的state的话我们还可以通过Python语言去定义一个state。整个定义过程跟上一节如何去扩展Module原理很相似。4.4 ext_pillar与ext_nodes在前面3小节的知识里面都有一些关于Python语言编写的能力要求。相对于不懂Python语言的读者来说是比较头疼的一个问题。难道不会编写Python语言我们就不能扩展SaltStack了吗其实不然在这一节我们将不用编写Python代码就可以完成对Pillar跟Nodes的扩展。4.5 SaltStack git文件服务器在前面章节参见2.3节我们也介绍了通过gitfs管理Pillar数据其实state也支持gitfs前面我们提到的所有state sls文件都是在/srv/salt/目录下其实这是SaltStack的默认fileserver定义的。默认SaltStack的fileserver是roots而file_roots默认Base环境定义的路径就是在/srv/salt/目录下可以通过Master配置文件查看默认的fileserver_backend。关于当前SaltStack的file_lists和gitfs文件信息都在Master配置文件定义的cachedir目录下有相关的记录。另外需要注意的是如果你配置了git fileserver需要确保Master上安装了gitfs_provider驱动。SaltsStack默认的gitfs_provide是GitPython你只需用pip install GitPython即可当然也支持你指定的其他gitfs_provider驱动。#fileserver_backend: # - roots 然后我们查看roots的定义的file_roots路径 #file_roots: # base: # - /srv/salt/ # stage: # - /srv/salt/stage/ # - /srv/salt/dev/states # prod: # - /srv/salt/prod/services # - /srv/salt/prod/states #altStack除了支持默认roots fileserver以外还支持git fileserver这样我们就可以把所有的state sls文件放到GitHub上方便我们以后统一管理。这节就通过一个简单的案例去统一管理多环境下的state.sls文件首先我们来看一下GitHub项目我这里新建了两个guthub branchbranch名称都是以SaltStack的环境命名的。一个branch是stage一个branch是pro。两个branch的代码是一样的SaltStackMaster: git branch -a * pro remotes/origin/HEAD - origin/pro remotes/origin/pro remotes/origin/stage 查看GitHub项目里面的所有文件 SaltStackMaster: tree .├── README.md└── states ├── cpis1.sls ├── cpis.sls ├── _grains │ └── example.py ├── _modules │ └── puppet.py ├── pro.sls ├── stage.sls ├── _states │ └── ansible.py └── top.sls首先我们来看看入口文件top.sls。它会incule Pillar里面定义的environment的环境名称的sls文件例如你是stage环境它就会inculde stage.sls文件或者stage目录下的init.sls文件。这个Pillar的环境需要在Master配置文件里面开启pillar_opts:True选项才能读取minion的environment值include: - {{ pillar[master][environment] }} 再看我们定义的stage.sls和pro.sls文件以及它inculde的state sls文件 SaltStackMaster: cat states/stage.sls {{ pillar[master][environment] }}: *: - cpis SaltStackMaster: cat states/cpis.sls httpd-pro: #id为 httpd-pro pkg.installed: - name: httpd SaltStackMaster: cat states/stage.sls {{ pillar[master][environment] }}: *: - cpis1 SaltStackMaster: cat states/cpis1.sls httpd-stage: #id为 httpd-stage pkg.installed: - name: httpd下面我们来看两台minion的环境一台是stage环境一台是pro环境 SaltStackMaster: salt \* pillar.get master:environment Minion01: stage Minion: pro GitHub项目里面的state.sls文件编写好之后我们需要修改Master的fileserver配置了然后重启Master服务使用salt-run fileserver.update命令更新state文件 fileserver_backend: - git gitfs_remotes: - https://github.com/shencan/saltstates.git gitfs_root: states 接下来我们就可以执行state.sls或者state.highstate了。指定环境运行state.sls SaltStackMaster: salt \* state.sls cpis1 saltenvstage Minion01: ---------- ID: httpd-stage Function: pkg.installed Name: httpd Result: True Comment: Package httpd is already installed. Started: 15:51:04.894714 Duration: 1081.136 ms Changes: Summary ------------ Succeeded: 1 Failed: 0 ------------ Total states run: 1 Minion: ---------- ID: httpd-stage Function: pkg.installed Name: httpd Result: True Comment: Package httpd is already installed. Started: 15:51:06.014782 Duration: 980.017 ms Changes: Summary ------------ Succeeded: 1 Failed: 0 ------------ Total states run: 1 运行state.highstate时top.sls会根据当前的environment来inculde对应的stats.sls文件 SaltStackMaster: Minion01: ---------- ID: httpd-stage #引用了cpis1.sls Function: pkg.installed Name: httpd Result: True Comment: Package httpd is already installed. Started: 15:58:58.702583 Duration: 996.88 ms Changes: Summary ------------ Succeeded: 1 Failed: 0 ------------ Total states run: 1 Minion: ---------- ID: httpd-pro #引用了cpis.sls Function: pkg.installed Name: httpd Result: True Comment: Package httpd is already installed. Started: 15:59:00.308802 Duration: 1068.354 ms Changes: Summary ------------ Succeeded: 1 Failed: 0 ------------ Total states run: 1
返回列表