本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
示例 3:创建目录
重要
该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问,请通过 re AWS : Post 或通过 Pre
当您在实例上安装软件包时,通常需要创建一些配置文件,并将这些配置文件放在适当的目录中。但是,这些目录可能尚不存在。您可能还需要针对数据、日志文件等创建目录。例如,首先启动您用于大多数示例的 Ubuntu 系统,/srv
目录没有子目录。如果您要安装应用程序服务器,则可能需要一个 /srv/www/
目录,并且可能还需要用于数据文件、日志等的一些子目录。以下配方会在实例上创建 /srv/www/
。
directory "/srv/www/" do mode 0755 owner 'root' group 'root' action :create end
您使用 directory
资源path
属性的默认值,因此该示例会创建 /srv/www/
,并指定其 mode
、owner
和 group
属性。
运行配方
-
在
opsworks_cookbooks
中创建名为createdir
的目录并导航到该目录。 -
如示例 1:安装软件包中所述,初始化和配置 Test Kitchen,然后将
recipes
目录添加到createdir
内。 -
将
default.rb
文件连同配方代码一起添加到说明书的recipes
子目录中。 -
运行
kitchen converge
以执行该配方。 -
运行
kitchen login
,导航到/srv
并验证它是否拥有www
子目录。 -
运行
exit
以返回到您的工作站,但让实例保持运行状态。
注意
要在实例上创建相对于主目录的目录,请使用 #{ENV['HOME']}
表示主目录。例如,以下内容会创建 ~/shared
目录。
directory "#{ENV['HOME']}/shared" do ... end
假设您要创建一个更深层嵌套的目录,例如 /srv/www/shared
。您可以按如下所示修改前面的配方。
directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' action :create end
运行配方
-
用前面的配方替换
default.rb
中的代码。 -
从
kitchen converge
目录运行createdir
。 -
要验证是否确实已创建目录,请运行
kitchen login
,导航到/srv/www
,并验证它是否包含shared
子目录。 -
运行
kitchen destroy
以关闭实例。
您将注意到 kitchen converge
命令运行速度更快。这是因为该实例已在运行,因此不需要启动实例、安装 Chef 等。Test Kitchen 直接将更新的说明书复制到实例中并开始运行 Chef。
现在,再次运行 kitchen converge
,这将会在全新实例上执行配方。现在,您将看到以下结果。
Chef Client failed. 0 resources updated in 1.908125788 seconds [2014-06-20T20:54:26+00:00] ERROR: directory[/srv/www/shared] (createdir::default line 1) had an error: Chef::Exceptions::EnclosingDirectoryDoesNotExist: Parent directory /srv/www does not exist, cannot create /srv/www/shared [2014-06-20T20:54:26+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1) >>>>>> Converge failed on instance <default-ubuntu-1204>. >>>>>> Please see .kitchen/logs/default-ubuntu-1204.log for more details >>>>>> ------Exception------- >>>>>> Class: Kitchen::ActionFailed >>>>>> Message: SSH exited (1) for command: [sudo -E chef-solo --config /tmp/kitchen/solo.rb --json-attributes /tmp/kitchen/dna.json --log_level info] >>>>>> ----------------------
发生了什么? 问题在于,默认情况下,directory
资源一次只能创建一个目录;它无法创建一系列目录。配方之前能够正常工作的原因是,您在实例上运行的第一个配方已经创建了 /srv/www
,因此创建 /srv/www/shared
时仅创建了一个子目录。
注意
在运行 kitchen converge
时,请确保了解您是在新实例上还是在现有实例上运行配方。您可能会得到不同的结果。
要创建一系列子目录,请将 recursive
属性添加到 directory
中,并将其设置为 true
。以下配方会直接在干净的实例上创建 /srv/www/shared
。
directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' recursive true action :create end