我在使用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.
任何帮助都将不胜感激。
答案 0 :(得分:6)
代理程序直接从解压缩的归档捆绑包中执行脚本,而不是使用files
部分从您复制它们的任何位置执行。您需要在S3或Git存储库中设置存档中的执行位。
你拥有的是这样的:
/var/www/html
。/var/www/html/codedeploy-scripts
内容目录的权限设置为777,而不是目录本身(请参阅appspec.yml reference)。这也会受到umask的影响,您可能正在设置/etc/profile
。<deployment-archive-root>/codedeploy-scripts/validate-service
而不是/var/www/html/codedeploy-scripts/validate-service
注意:ApplicationStop很特殊,因为它在下载新的归档包之前运行。
答案 1 :(得分:5)
如果没有更多详细信息,我将无法说明为什么将脚本设置为可执行文件可以修复您的问题,但是接受的答案除了您看到的日志语句之外不应该解决任何问题。
仔细查看日志:
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.
这只是一个警告,而不是错误。代码部署代理注意到您的validate_service.sh
脚本不可执行,并且“尝试使其可执行”。如果我们查看relevant Code Deploy agent code,您会看到代理将chmod +x
脚本本身。
当您将脚本设置为可执行时,您只会使此警告静音,并且不会影响其他任何内容。回顾一下代码部署代理程序代码,在L106中,如果代理程序无法使您的脚本可执行,那么您的日志中就会出现错误。
要回答有关权限的问题,您的apppec.yml配置错误。当你说:
permissions:
- object: /var/www/html/codedeploy-scripts
owner: root
mode: 777
type:
- directory
您告诉Code Deploy将/var/www/html/codedeploy-scripts
中所有类型为“directory”的文件设置为具有777
权限。
codedeploy-scripts
下的所有脚本都是“文件”类型(不是“目录”),这就是为什么他们的权限没有设置,权限只适用于下的文件您指定的目录,这就是未设置codedeploy-scripts
目录上的权限的原因。
以下是来自the AWS docs的appspec.yml权限type
选项的说明:
type - 可选。要应用指定权限的对象类型。这可以设置为文件或目录。如果指定了file,则权限将仅应用于复制操作后立即包含在对象中的文件(而不是对象本身)。如果指定了directory,则权限将以递归方式应用于复制操作后对象内任何位置的所有目录/文件夹(但不能对象本身)。
答案 2 :(得分:0)
我想扩展Jonathan Turpie提到的一个问题,这可能会造成一种非常奇怪的情况。
来自 ApplicationStop 的文档:
即使在下载应用程序修订版之前,也会发生此部署生命周期事件。 ...用于此部署生命周期事件的AppSpec文件和脚本来自先前成功部署的应用程序修订版。
现在想象一下这种情况:
此时,无法通过部署新代码来修复错误。您只有两个选择:
--ignore-application-stop-failures
CLI标志[1])这涉及任何停止脚本失败,当然不仅仅是权限。
[1] https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html