【发布时间】:2021-02-01 04:12:21
【问题描述】:
有一个 shell 脚本在 Amazon Linux EC2 实例的引导脚本中部分工作(脚本作为实例启动之前设置的用户数据)。而且我仍然不知道为什么它作为引导脚本不起作用。
脚本执行以下操作:
- 更新操作系统包
- 安装 Apache2 网络服务器
- 将网络服务器设置为在每次系统启动时启动
- 使用亚马逊安装实用程序安装 PHP
- 重启网络服务
- 下载并安装 Composer
- 使用 Composer 安装 WordPress
这是脚本:
#!/bin/bash
echo Bootstrap script starting at $(date) >> /home/ec2-user/log-bootstrap.txt
echo Updating OS and installing webserver at $(date) >> /home/ec2-user/log-bootstrap.txt
yum update -y
yum install httpd -y
chkconfig httpd on
service httpd start
echo Installing PHP at $(date) >> /home/ec2-user/log-bootstrap.txt
amazon-linux-extras install php7.4 -y
service httpd restart
echo Installing Composer at $(date) >> /home/ec2-user/log-bootstrap.txt
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
chmod +x /usr/local/bin/composer
echo The composer version is $(/usr/local/bin/composer --version) >> /home/ec2-user/log-bootstrap.txt
echo Installing Wordpress. Time: $(date) >> /home/ec2-user/log-bootstrap.txt
cd /var/www/html
/usr/local/bin/composer create-project johnpbloch/wordpress .
shutdown -P +5
目的是通过用户数据脚本在启动时完成机器中的所有操作。
脚本在 Composer 安装之前一直有效。但是echo The composer version is $(/usr/local/bin/composer --version) >> /home/ec2-user/log-bootstrap.txt 是第一行显示一些问题。它不执行$(/usr/local/bin/composer --version) 的部分。它将回声保存在文件中,但打印作曲家版本的位置仍然为空。
但进一步分析显示 Composer 已经安装成功。我可以从脚本中放入完全相同的剩余行,并且一切正常,但是当我通过 ssh 访问机器并执行剩余代码时。使用 composer 安装 WordPress 也可以。 Composer 仅在用户数据脚本中时才起作用。
我尝试通过两种方式模拟问题:
-
在机器上 ssh 登录后,在剪贴板中打印整个脚本并直接在终端中过去。
-
用这个确切的内容创建一个shell脚本文件,通过scp发送到机器并在机器内部执行。
在这两种情况下,脚本都能完美运行!并且我没有忘记在试验前更改为 sudo 以模拟机器执行引导脚本时更相似的东西。
有人知道如何在用户数据中的亚马逊机器的同一脚本中安装和运行composer吗?为什么 Composer 只有在来自 Amazon 实例的用户数据脚本中才能工作,尽管 Composer 已成功下载并且在通过 ssh 访问机器时仍然可以执行?
【问题讨论】:
标签: php amazon-web-services composer-php