在之前的指南中,我们讨论了为服务器基础架构实施配置管理策略的主要好处、配置管理工具的工作原理以及这些工具通常具有的共同点。
本系列的这一部分将引导您完成使用Chef自动化服务器配置的过程,Chef是一个强大的配置管理工具,它利用Ruby编程语言来自动化基础设施管理和配置。我们将专注于创建简化示例所需的语言术语、语法和功能,以使用Apache完全自动化部署Ubuntu18.04Web服务器。
这是我们需要自动化以实现目标的步骤列表:
1.更新apt缓存
2.安装阿帕奇
3.创建自定义文档根目录
4.在自定义文档根目录下放置一个index.html文件
6.重启阿帕奇
注意:本指南旨在向您介绍Chef语言以及如何编写食谱以自动化您的服务器配置。有关Chef的更多介绍性视图,包括安装和开始使用此工具所需的步骤,请参阅Chef的官方文档。
##GettingStarted在我们更深入地了解Chef之前,我们必须熟悉此工具引入的重要术语和概念。###厨师条款
###Recipe格式厨师食谱是使用Ruby编写的。配方基本上是资源定义的集合,这些定义将创建由节点执行的逐步指令集。这些资源定义可以与Ruby代码混合使用,以获得更大的灵活性和模块化。
您可以在下面找到一个简单的配方示例,该配方将运行apt-getupdate并在之后安装vim:
execute"apt-getupdate"docommand"apt-getupdate"endapt_package"vim"doaction:installend##WritingRecipes###WorkingwithVariables局部变量可以在recipes中定义为常规的Ruby局部变量。下面的示例显示了如何创建稍后在资源定义中使用的局部变量:
package="vim"apt_packagepackagedoaction:installend但是,这些变量的范围有限,仅在定义它们的文件内有效。如果您想创建一个变量并使其全局可用,以便您可以从任何食谱或食谱中使用它,您需要定义一个自定义属性。
####UsingAttributes属性表示节点的详细信息。Chef具有自动属性,这些属性由名为Ohai的工具收集并包含有关系统的信息(例如平台、主机名和默认IP地址),但它也允许您定义自己的自定义属性。
属性具有不同的优先级,由您创建的属性类型定义。default属性是最常见的选择,因为它们仍然可以在需要时被其他属性类型覆盖。
以下示例显示了使用default节点属性而不是局部变量的前一个示例的外观:
node.default['main']['package']="vim"apt_packagenode['main']['package']doaction:installend在这个例子中有两个细节需要观察:
定义节点变量时的推荐做法是使用当前使用的说明书作为键将它们组织为散列。在本例中,我们使用了main,因为我们有一本同名的食谱。如果您正在使用可能具有相似命名属性的多个说明书,这可以避免混淆。请注意,我们在定义属性时使用了node.default,但是在稍后访问其值时,我们直接使用了node。node.default用法定义我们正在创建一个类型为default的属性。此属性的值可能会被具有更高优先级的其他类型覆盖,例如normal或override属性。
属性的优先级一开始可能会有点混乱,但经过一些练习后你会习惯的。为了说明该行为,请考虑以下示例:
node.normal['main']['package']="vim"node.override['main']['package']="git"node.default['main']['package']="curl"apt_packagenode['main']['package']doaction:installend你知道在这种情况下会安装哪个包吗如果你猜到了git,那么你猜对了。无论定义属性的顺序如何,类型override的较高优先级将使node['main']['package']beevaluatedtogit`。###UsingLoops循环通常用于使用不同的输入值重复任务。例如,不是为安装10个不同的包创建10个任务,您可以创建一个任务并使用循环对要安装的所有不同包重复该任务。
Chef支持所有Ruby循环结构,用于在配方中创建循环。对于简单的使用,each是一个常见的选择:
['vim','git','curl'].eachdo|package|apt_packagepackagedoaction:installendend除了使用内联数组,您还可以创建一个变量或属性来定义要在循环内使用的参数。这将使事情更有条理,更容易阅读。下面,同样的例子现在使用一个局部变量来定义应该安装的包:
packages=['vim','git','curl']packages.eachdo|package|apt_packagepackagedoaction:installendend###UsingConditionals条件可用于动态决定是否应该执行代码块,例如,基于变量或命令的输出。
Chef支持所有Ruby条件语句,用于在配方中创建条件语句。此外,所有资源类型都支持两个特殊属性,它们将在决定是否执行任务之前评估表达式:if_only和not_if。
下面的示例将在尝试安装扩展程序php-pear之前检查php的存在。它将使用命令which来验证当前系统上是否安装了php可执行文件。如果命令whichphp返回false,则不会执行此任务:
apt_package"php-pear"doaction:installonly_if"whichphp"end如果我们想反其道而行之,始终执行命令除了当条件评估为真时,我们使用not_if代替。除非系统是CentOS,否则此示例将安装php5:
apt_package"php5"doaction:installnot_if{node['platform']=='centos'}end为了执行更复杂的评估,如果您想在特定条件下执行多个任务,您可以使用任何标准的Ruby条件。以下示例仅在系统为Debian或Ubuntu时执行apt-getupdate:
ifnode['platform']=='debian'||node['platform']=='ubuntu'execute"apt-getupdate"docommand"apt-getupdate"endend属性node['platform']是Chef的自动属性。最后一个例子只是为了演示一个更复杂的条件构造,但是它可以被一个使用自动属性node['platform_family']的简单测试代替,这对于Debian和Ubuntu系统都将返回“debian”。<###WorkingwithTemplates模板是通常用于设置配置文件,允许使用旨在使这些文件更加通用和可重用的变量和其他功能。
Chef使用EmbeddedRuby(ERB)模板,这与Puppet使用的格式相同。它们支持条件、循环和其他Ruby特性。
下面是一个用于设置Apache虚拟主机的ERB模板示例,使用变量来定义该主机的文档根目录:
template"/etc/apache2/sites-available/000-default.conf"dosource"vhost.erb"variables({:doc_root=>node['main']['doc_root']})action:createendChef在处理本地文件时做了一些假设,以加强组织和模块化。在这种情况下,Chef将在templates文件夹中查找vhost.erb模板文件,该文件夹应位于此食谱所在的同一本食谱中。
与迄今为止我们看到的其他配置管理工具不同,Chef对变量有更严格的范围。这意味着在定义template资源时,您必须明确提供您计划在模板中使用的任何变量。在这个例子中,我们使用variables方法来传递我们在虚拟主机模板中需要的doc_root属性。###Defining和触发服务服务资源用于确保服务已初始化和启用。它们还用于触发服务重启。
让我们考虑一下我们之前的模板使用示例,我们在其中设置了一个Apache虚拟主机。如果您想确保Apache在虚拟主机更改后重新启动,您首先需要为Apache服务创建一个service资源。这是在Chef中定义此类资源的方式:
service"apache2"doaction[:enable,:start]end现在,在定义template资源时,您需要包含一个notify选项以触发重新启动:
template"/etc/apache2/sites-available/000-default.conf"dosource"vhost.erb"variables({:doc_root=>node['main']['doc_root']})action:createnotifies:restart,resources(:service=>"apache2")end##ExampleRecipe现在让我们看一下在Ubuntu14.04系统中自动安装ApacheWeb服务器的方法,如本指南的介绍中所述。
您可以在下面找到完整的食谱:
node.default['main']['doc_root']="/vagrant/web"execute"apt-getupdate"docommand"apt-getupdate"endapt_package"apache2"doaction:installendservice"apache2"doaction[:enable,:start]enddirectorynode['main']['doc_root']doowner'www-data'group'www-data'mode'0644'action:createendcookbook_file"#{node['main']['doc_root']}/index.html"dosource'index.html'owner'www-data'group'www-data'action:createendtemplate"/etc/apache2/sites-available/000-default.conf"dosource"vhost.erb"variables({:doc_root=>node['main']['doc_root']})action:createnotifies:restart,resources(:service=>"apache2")end###食谱解释
####line1配方以属性定义开始,node['main']['doc_root']。我们可以在这里使用一个简单的局部变量,但是在大多数用例场景中,配方需要定义将从包含的配方中使用的全局变量或其他文件。对于这些情况,有必要创建属性而不是局部变量,因为后者的范围有限。
####lines3-5这个execute资源运行apt-getupdate。
####lines7-10这个apt_package资源安装包apache2。
####lines12-15这个service资源启用并启动服务apache2。稍后,我们需要通知此资源以重新启动服务。重要的是,服务定义位于任何尝试通知服务的资源之前,否则您将收到错误消息。
####lines17-22这个directory资源使用自定义属性node['main']['doc_root']定义的值来创建一个目录,作为我们的documentroot。
####lines24-29cookbook_file资源用于将本地文件复制到远程服务器。该资源将复制我们的index.html文件并将其放置在我们在之前的任务中创建的文档根目录中。
####lines31-36最后,这个template资源应用我们的Apache虚拟主机模板并通知服务apache2重新启动。
##ConclusionChef是一个强大的配置管理工具,它利用Ruby语言来自动化服务器配置和部署。它使您可以自由使用标准语言功能以获得最大的灵活性,同时还为某些资源提供自定义DSL。
开发云社区提供前沿行业资讯和优质的学习知识,同时提供优质稳定、价格优惠的云主机、数据库、网络、云储存等云服务产品
更多推荐
负载均衡/路由一个使用socketio和flask制作的应用
问题:负载均衡/路由一个使用socketio和flask制作的应用在部署Web应用程序方面,我有点菜鸟,我想确保我正在构建的一个小应用程序能够与我正在尝试使用的技术一起使用。我对烧瓶有一些经验,但只使用过测试服务器。我的理解是,使用nginx或apache,如果我编写一个烧瓶应用程序,每个访问我的网站的用户都可以获得一个烧瓶应用程序的不同实例,具体如何工作让我有点困惑。我想做的应用
Nginx重写规则没有按预期工作
MySQL远程时缓存如何工作
问题:MySQL远程时缓存如何工作我一直在使用PHP5.6进行旧电子商务应用程序的服务器迁移。切换涉及来自Linode的两台Dedicated32服务器。一台服务器用于NginX+PHP,另一台仅用于MySQL。遗留应用程序利用memcached。切换后,我可以看到由于私有入站和出站连接导致的大量内部流量。到目前为止,这个元素没有对性能造成任何问题。但是,