我试图在部署AWS代码部署时运行几个脚本,但由于没有运行脚本的权限,它们从未运行过。
这是我的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与应用程序一起部署码部署-脚本文件夹,并且我在文件夹上设置的权限没有设置。文件夹上的权限总是被重置为:
[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文件夹应该有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.任何帮助都将不胜感激。
发布于 2015-10-13 17:54:48
代理直接从提取的归档包执行脚本,而不是从您可能使用files部分复制它们的任意位置执行脚本。您需要在S3或Git存储库中的存档中设置执行位。
你所拥有的是这样的:
/var/www/html。/var/www/html/codedeploy-scripts内容的目录的权限设置为777,但不设置目录本身(请参阅appspec.yml参考)。这也会受到umask的影响,您可能正在设置/etc/profile。<deployment-archive-root>/codedeploy-scripts/validate-service运行的,而不是从/var/www/html/codedeploy-scripts/validate-service运行的。注意: ApplicationStop是特殊的,因为它在下载新的归档包之前运行。
发布于 2016-01-09 20:31:51
如果没有更多的细节,我将无法解释为什么要将脚本设置为可执行文件来解决问题,但是接受的答案不应该解决您所看到的日志语句之外的任何其他问题。
仔细看看日志:
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脚本不是可执行的,而是“尝试使其可执行”。如果我们查看相关代码部署代理代码,您将看到代理将chmod +x脚本本身。
当您将脚本设置为可执行时,您只会沉默此警告,并且它不应该影响任何其他内容。回顾一下L106中的代码,如果代理无法使脚本可执行,您就会在日志中看到一个错误。
要回答有关权限的问题,您有一个配置错误的appspec.yml。当你说:
permissions:
- object: /var/www/html/codedeploy-scripts
owner: root
mode: 777
type:
- directory您正在告诉Code将/var/www/html/codedeploy-scripts中所有类型为“目录”的文件设置为具有777权限。
codedeploy-scripts下的所有脚本都是"file“类型(而不是”目录“),这就是为什么没有设置它们的权限,并且权限只适用于您指定的目录下的文件,这就是为什么没有设置对codedeploy-scripts目录的权限。
下面是appspec.yml权限的type选项的描述,来自AWS文档
类型-可选。要对其应用指定权限的对象类型。这可以设置为文件或目录。如果指定了文件,权限将仅应用于复制操作后立即包含在对象中的文件(而不是对象本身)。如果指定目录,权限将递归应用于复制操作后对象内任何位置的所有目录/文件夹(但不应用于对象本身)。
发布于 2018-01-22 20:06:34
我想详述一下乔纳森·图皮提到的一个问题,它会造成一个非常奇怪的情况。
从ApplicationStop上的文档
此部署生命周期事件甚至在下载应用程序修订之前就会发生。..。用于此部署生命周期事件的AppSpec文件和脚本来自先前成功部署的应用程序修订版。
现在想象一下这种情况:
此时,不可能通过部署新代码来修复错误。你只有两个选择:
--ignore-application-stop-failures CLI标志1)这涉及到任何停止脚本失败,当然不仅仅是权限。
https://stackoverflow.com/questions/33108309
复制相似问题