本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
示例 7:运行命令和脚本
重要
这些区域有: AWS OpsWorks Stacks 该服务已于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问,请联系 AWS Support 团队开启 AWS re: post 或通过
Chef 资源可以在实例上处理各种任务,但有时最好使用 shell 命令或脚本。例如,您可能已经拥有用于完成特定任务的脚本,继续使用它们而不是实施新的代码会更容易。本节介绍了如何在实例上运行命令或脚本。
运行命令
script
开始使用
-
在
opsworks_cookbooks
目录中,创建名为script
的实例并导航到其中。 -
将包含以下内容的
metadata.rb
文件添加到script
。name "script" version "0.1.0"
-
如示例 1:安装软件包中所述,初始化和配置 Test Kitchen,并从
platforms
列表中删除 CentOS。 -
在
script
中创建名为recipes
的子目录。
您可以通过使用 script
资源本身来运行命令,但是 Chef 还支持一组特定于命令解释器的资源版本,这些资源版本根据解释器命名。以下配方使用 bash
bash "install_something" do user "root" cwd "/tmp" code <<-EOH touch somefile EOH not_if do File.exists?("/tmp/somefile") end end
bash
资源的配置如下所示。
-
它使用默认操作
run
,该操作会运行code
块中的命令。此示例有一个命令
touch somefile
,但是code
块可能包含多个命令。 -
user
属性会指定执行相应命令的用户。 -
cwd
属性指定工作目录。在本示例中,
touch
会在/tmp
目录中创建一个文件。 -
如果该文件已经存在,则
not_if
guard 属性会指示资源不采取任何行动。
运行配方
-
创建包含前面示例代码的
default.rb
文件,并将其保存至recipes
。 -
运行
kitchen converge
,然后登录到实例,以验证相应文件是否在/tmp
中。
运行脚本
script
资源很方便,尤其是当您只需要运行一两个命令时更是如此,但是通常最好将脚本存储在某个文件中,然后执行该文件。execute
script
说明书,以使用 execute
运行简单的 shell 脚本。您可将此示例轻松扩展为更复杂的脚本,或其他类型的可执行文件。
设置脚本文件
-
将
files
子目录添加到script
,并将default
子目录添加到files
。 -
创建名为
touchfile
的包含以下内容的文件,然后将其添加到files/default
中。此示例中使用了常见的 Bash 解释器行,但如果需要,可以替换为适用于您的 shell 环境的解释器。#!/usr/bin/env bash touch somefile
脚本文件可以包含任意数量的命令。为方便起见,此示例脚本只有单个
touch
命令。
以下配方执行该脚本。
cookbook_file "/tmp/touchfile" do source "touchfile" mode 0755 end execute "touchfile" do user "root" cwd "/tmp" command "./touchfile" end
cookbook_file
资源会将脚本文件复制到 /tmp
,然后设置模式,以使该文件可执行。execute
资源随后会按如下所示执行文件:
-
user
属性指定命令的用户 (在此示例中为root
)。 -
cwd
属性指定工作目录 (在此示例中为/tmp
)。 -
command
属性指定要执行的脚本 (在此示例中为touchfile
),该脚本位于工作目录中。
运行配方
-
将
recipes/default.rb
中的代码替换为前面的示例。 -
运行
kitchen converge
,然后登录到实例,以验证/tmp
现在是否包含脚本文件 (模式设置为 0755) 以及somefile
。
完成后,运行 kitchen destroy
以关闭实例。下一节将使用新的说明书。