8

我尝试在使用 AWS Code Deploy 进行部署时运行一些脚本,但由于没有运行脚本的权限,它们从未运行过。

这是我的 appspec.yml 文件:

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html
permissions:
  - object: /var/www/html/codedeploy-scripts
    owner: root
    mode: 777
    type:
      - directory
hooks:
  ApplicationStop:
    - location: codedeploy-scripts/application-stop
      timeout: 300
      runas: root
  BeforeInstall:
    - location: codedeploy-scripts/before-install
      timeout: 300
      runas: root
  AfterInstall:
    - location: codedeploy-scripts/after-install
      timeout: 600
      runas: root
  ApplicationStart:
    - location: codedeploy-scripts/application-start
      timeout: 300
      runas: root
  ValidateService:
    - location: codedeploy-scripts/validate-service
      timeout: 300
      runas: root

codedeploy-scripts 文件夹与应用程序一起部署,并且我在文件夹上设置的权限未设置。文件夹的权限始终重置为:

[ec2-user@ip-10-0-8-181 html]$ ls -al
total 156
drwxrwsr-x  7 ec2-user www   4096 Oct 13 16:36 .
drwxrwsr-x  3 ec2-user www   4096 Oct 13 15:01 ..
-rw-rw-r--  1 ec2-user www    740 Oct 13 16:28 appspec.yml
drwxr-sr-x  2 ec2-user www   4096 Oct 13 16:36 codedeploy-scripts
...

文件夹中的文件似乎具有可执行权限:

[ec2-user@ip-10-0-8-181 alio]$ ls -al codedeploy-scripts
total 28
drwxr-sr-x 2 ec2-user www 4096 Oct 13 16:36 .
drwxrwsr-x 7 ec2-user www 4096 Oct 13 16:36 ..
-rwxr-xr-x 1 ec2-user www  343 Oct 13 16:28 after-install
-rwxr-xr-x 1 ec2-user www   12 Oct 13 16:28 application-start
-rwxr-xr-x 1 ec2-user www   12 Oct 13 16:28 application-stop
-rwxr-xr-x 1 ec2-user www  889 Oct 13 16:28 before-install
-rwxr-xr-x 1 ec2-user www   12 Oct 13 16:28 validate-service

为什么不使用我在 appspec 文件中设置的权限部署代码。codedeploy-scripts 文件夹应该有 777 权限,但它从来没有。

这是我在 /var/log/aws/codedeploy-agent/codedeploy-agent.log 中为每个脚本得到的错误:

2015-10-13 16:36:23 WARN  [codedeploy-agent(9918)]: InstanceAgent::Plugins::CodeDeployPlugin::HookExecutor: Script at specified location: codedeploy-scripts/validate-service is not executable.  Trying to make it executable.

任何帮助,将不胜感激。

4

4 回答 4

6

如果没有更多详细信息,我将无法说明为什么将您的脚本设置为可执行解决了您的问题,但除了您看到的日志语句之外,接受的答案不应该解决任何问题。

仔细看一下日志:

2015-10-13 16:36:23 WARN  [codedeploy-agent(9918)]: InstanceAgent::Plugins::CodeDeployPlugin::HookExecutor: Script at specified location: codedeploy-scripts/validate-service is not executable.  Trying to make it executable.

这只是一个警告,而不是错误。Code Deploy 代理注意到您的validate_service.sh脚本不可执行并且它是“试图使其可执行”。如果我们查看相关的 Code Deploy 代理代码,您会看到代理将chmod +x脚本本身。

当您将脚本设置为可执行时,您只会忽略此警告,并且它不应该影响其他任何内容。回顾 L106 中的 Code Deploy 代理代码,如果代理无法使您的脚本可执行,您会在日志中看到错误。

要回答有关权限的问题,您的 appspec.yml 配置错误。当你说:

  permissions:
    - object: /var/www/html/codedeploy-scripts
      owner: root
      mode: 777
      type:
        - directory

您正在告诉 Code Deploy 将所有“目录”类型的文件设置/var/www/html/codedeploy-scripts为具有权限777

您所有的脚本codedeploy-scripts都是“文件”类型(不是“目录”),这就是为什么没有设置它们的权限,并且权限只适用于您指定的目录codedeploy-scripts的文件,这就是为什么目录上的权限没有t 设置。

以下是AWS 文档中 appspec.yml 权限type选项的描述:

类型——可选。要应用指定权限的对象类型。这可以设置为文件或目录。如果指定了文件,则权限将仅应用于复制操作后立即包含在对象中的文件(而不应用于对象本身)。如果指定了目录,则权限将递归地应用于复制操作后对象内任何位置的所有目录/文件夹(但不应用于对象本身)。

于 2016-01-09T20:31:51.153 回答
6

files代理直接从提取的存档包执行脚本,而不是从您可能使用该部分复制它们的任意位置执行脚本。您需要在 S3 或 Git 存储库中的存档中设置执行位。

你拥有的是这样的:

  • 将所有文件复制到/var/www/html.
  • 将目录的权限设置/var/www/html/codedeploy-scripts为 777 的内容,而不是目录本身(请参阅appspec.yml 参考)。这也将受到您可能正在设置的 umask 的影响/etc/profile
  • 从归档根目录执行生命周期事件(发生时)的每个脚本。所以你的 ValidateSerivce 脚本<deployment-archive-root>/codedeploy-scripts/validate-service不是从/var/www/html/codedeploy-scripts/validate-service

注意:ApplicationStop 是特殊的,因为它在下载新的新归档包之前运行。

于 2015-10-13T17:54:48.443 回答
0

我想扩展 Jonathan Turpie 提到的一个问题,它可能会造成非常奇怪的情况。

ApplicationStop上的文档:

此部署生命周期事件甚至在下载应用程序修订之前发生。...用于此部署生命周期事件的 AppSpec 文件和脚本来自先前成功部署的应用程序修订。

现在想象一下这种情况:

  1. 使用拙劣的 ApplicationStop 脚本权限部署了修订。部署仍然很顺利,因为使用了以前的版本。
  2. 一个新的修订被推送并且 ApplicationStop 步骤失败(因为现在它试图从步骤 1 执行拙劣的脚本)。
  3. 你注意到了你的错误,修复了代码,发布了一个新的版本,但它仍然失败并出现同样的错误!

此时无法通过部署新代码来修复错误。你只有两个选择:

  1. 在部署设置中启用“忽略停止失败”(例如,使用--ignore-application-stop-failuresCLI 标志 [1])
  2. 手动修复之前成功部署的根目录中的文件权限。

这涉及任何停止脚本失败,当然不仅仅是权限。

[1] https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html

于 2018-01-22T20:06:34.797 回答
0

解决权限问题:

希望您位于所有脚本.sh文件所在的根目录中:

  1. chmod +x ./*.sh

这使得所有 .sh 文件都可执行

  1. 添加一些脚本 change_permissions.sh 并在文件中添加以下内容:
#!/bin/bash
chmod -R 777 /var/www/html/

这将赋予您的目标文件夹 -/var/www/html/可执行权限。

  1. 最后asspec.yml文件以某种方式添加如下:
  BeforeInstall:
  - location: change_permissions.sh
    timeout: 6
    runas: root

这将在您的 ec2 实例中运行时将可执行权限应用于文件。

于 2022-02-28T11:29:36.677 回答