使用SaltStack在Red Hat上安装LAMP Stack一个简单的SaltStack配置管理场景是安装LAMP stack。尽管在GitHub上有关于更完整采用SaltStack方案的组织实例(https://github.com/saltstack-formulas),但本例应能充分地展示了基本的方案,它是某一指定资源配置管理的预编写Salt状态。SaltStack方案和状态可以用于类似、:安装软件包、配置和启动一个服务、设置用户或权限以及其他常见任务。 由于该例子是为基于Linux的Red Hat环境设计的,其中包含了Python 2.6为现有基础安装的一部分,其Linux和Python部分已经完成了。所有需要做的就是配置一个Web应用程序并使用Apache Web服务器和MySQL数据库服务器。 开始前,我们要确保/srv/salt/目录存在于服务器中。 因为Web应用程序需要在使用前安装数据库服务器,我们将首先定义数据库服务器。
由于该例子除了声明外,并不包含其它任何文件。我们可以简单地将其保存为:/srv/salt/mysql.sls。但是Apache的安装比较复杂,因为它包含了一个配置文件。该文件通过使用file.managed功能被拷贝到web服务器上,支持了像templating这样加强的功能。为了适应这种情况,我们通过在/srv/salt/目录下创建apache/子目录,并创建以下文件: # /srv/salt/apache/init.sls httpd: pkg.installed: - name: httpd - file: httpd service.running: - enable: True - require: - pkg: httpd file.managed: - name: /etc/conf/httpd/httpd.conf - source: salt://httpd/httpd.conf - require: - pkg: httpd 由于更多的文件将添加到该方案中,我们创建另外一个目录来保存它们。该目录在包含一个init.sls文件的同时,也包含被管理的httpd.conf文件副本。这些文件现在会与top.sls文件绑定在一起。 # /srv/salt/top.sls base: web*: - apache db*: - mysql 该文件就像胶水一样将这些状态连接在一起,定义了每个服务器上所应用的状态。需要注意的是该文件并没有涉及任何具体路径。因为top.sls定义了这类信息,因此SaltStack会到top.sls目录下查找。当SaltStack在top.sls中找到所需名称,接下来它会查找与其名称相对应的.sls文件(比如:mysql.sls)或者目录,该目录包含一个init.sls文件(比如:apache/init.sls)。 该定义确保了所有名字以“web”为开头的服务器(比如:web01,甚至是web01.example.com)都会有指定的Apache状态,还有任何名字以“db”开头的服务器(比如:db01或db01.example.com)都会有指定的MySQL状态。 将这些状态应用到所有服务器上,我们需要开始运行一个highstate命令: salt ‘*’ state.highstate Highstate是状态数据的结合(程序包、服务和文件等),它将应用到目的系统中。 然而,它也提出了另一个挑战。正如我上面所说的,这些web服务器如果没有可工作的数据库服务器的话,基本上是派不上什么用场。该场景在两者都存在的情况下可以正常工作,我们只要往组合中添加服务器就可以了。但对于一个干净的环境,没有任何服务器的情况该怎么办? 这时候就该轮到SaltStack流程引擎上场了。可以通过定义状态执行顺序来定义机器部署顺序: # /srv/salt/myorchestration.sls db_setup: salt.state: - tgt: ‘db*’ - highstate: True web_setup: salt.state: - tgt: ‘web*’ - highstate: True - require: - salt: db_setup 这个文件定义了我们之前定义的web状态只有在我们所定义的数据库状态执行完后才能执行。启动该状态,可以执行: salt-run state.orchestrate myorchestration 注意:在salt 0.17.x里,该命令为: salt-run state.sls myorchestration 上述场景对初始配置一组服务器是可行的。如果按计划执行的话,它会通过配置漂移缓解问题:如果服务器上httpd.conf文件被修改了,SaltStack会将其放置回它需要在的地方,然后汇报给用户都要做那些修改,以回到正确的状态。但程序包的版本怎么办呢? 当pkg.installed状态被声明后,SaltStack会检测底层包管理器来查看该程序包是否已经安装。如果是,那么该状态就已经实现了, 不需要任何进一步行为。然而,如果该程序包还没被安装的话,SaltStack也会通知包管理器安装该程序包,通常会检测该程序包(依具体环境而异)的最 新可用版本,然后安装。 但随着时间的推移,这会造成一些服务器上的程序包所带版本不一样,由此产生的问题也将难以定位。其解决方案就是使用pkg.lastes状态取而代之,这样可以一直保证所有服务器上运行的程序包版本都是最新的。
尽管如此,这也可能产生问题。只要有新版本出来,所有服务器都会试图下载安装。如果你没有预料到会有新版本,且还没有时间执行内部测试的话,这会造成很严重的问题。所以最好还是锁定某一特定版本的程序包比较好: httpd: pkg.installed: - name: httpd - version: 2.2.15 这保证了只有在状态声明中明确更新时,安装包才会被升级。 |