以编程方式安装 composer 在 vagrant 上工作但不在 EC2 实例上工作

Installing composer programatically working on vagrant but not on EC2 instance

我正在研究 Ansible 剧本。 在 vagrant 机器上配置时,一切顺利,没有错误。 现在我在以编程方式安装 composer 的步骤上遇到了麻烦。

安装-composer.sh(此脚本取自Composer Page

#!/bin/sh

EXPECTED_SIGNATURE="$(wget -q -O - https://composer.github.io/installer.sig)"
echo $EXPECTED_SIGNATURE;
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
ACTUAL_SIGNATURE="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"
echo $ACTUAL_SIGNATURE; <- Here is empty!

if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ]
then
    >&2 echo 'ERROR: Invalid installer signature'
    rm composer-setup.php
    exit 1
fi

php composer-setup.php --quiet
RESULT=$?
rm composer-setup.php
exit $RESULT

EC2 是一个 Ubuntu 16.04 实例,也是在 vagrant 上。

我遇到错误的 Playbook 任务:

 - name: Download Composer
      script: scripts/install_composer.sh
      register: composer_setup
      #when: not composer_stat.stat.exists
      tags:
        - deploy

以及 --verbose:

的完整错误

TASK [Download Composer] ******************************************************* fatal: [18.203.185.87]: FAILED! => {"changed": true, "failed": true, "rc": 1, "stderr": "Shared connection to 18.203.185.87 closed.\r\n", "stdout": "a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1\r\n/home/ubuntu/.ansible/tmp/ansible-tmp-1566333565.4-174304924088429/install_composer.sh: 5: /home/ubuntu/.ansible/tmp/ansible-tmp-1566333565.4-174304924088429/install_composer.sh: php: not found\r\n/home/ubuntu/.ansible/tmp/ansible-tmp-1566333565.4-174304924088429/install_composer.sh: 6: /home/ubuntu/.ansible/tmp/ansible-tmp-1566333565.4-174304924088429/install_composer.sh: php: not found\r\n\r\nERROR: Invalid installer signature\r\nrm: cannot remove 'composer-setup.php': No such file or directory\r\n", "stdout_lines": ["a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1", "/home/ubuntu/.ansible/tmp/ansible-tmp-1566333565.4-174304924088429/install_composer.sh: 5: /home/ubuntu/.ansible/tmp/ansible-tmp-1566333565.4-174304924088429/install_composer.sh: php: not found", "/home/ubuntu/.ansible/tmp/ansible-tmp-1566333565.4-174304924088429/install_composer.sh: 6: /home/ubuntu/.ansible/tmp/ansible-tmp-1566333565.4-174304924088429/install_composer.sh: php: not found", "", "ERROR: Invalid installer signature", "rm: cannot remove 'composer-setup.php': No such file or directory"]} changed:

[192.168.33.10] => {"changed": true, "rc": 0, "stderr": "Shared connection to 192.168.33.10 closed.\r\n", "stdout":

"a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1\r\na5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1\r\n", "stdout_lines": ["a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1", "a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1"]}

知道为什么此行在 ec2 上返回空吗?

"$(php -r "echo hash_file('sha384', 'composer-setup.php');")"

谢谢!

我的第一个猜测是您的 EC2 实例无法访问互联网。你能证实这一点吗?详细日志表明 composer-setup.php 文件在您尝试对其进行哈希处理时不存在。您应该尝试使用当前的 copy() 方法下载该文件,然后执行以下操作:

TESTSTUFF="$(php -r "echo file_exists('composer-setup.php') ? 'FILE EXISTS' : 'FILE DOES NOT EXIST';")"
echo $TESTSTUFF

如果文件不存在,请尝试从某处下载不同的文件,such as a dummy test file from here

所有迹象都表明文件不存在,这可能是由一系列问题引起的。但是,最有可能的是:

  • EC2 上无法访问互联网(您能 ping 通 8.8.8.8 吗?)
  • 执行权限不当php
  • 写入目标文件系统的权限不正确

在尝试了 Aaron 所说的之后,我发现 php 没有正确安装(根本没有安装)

我正在执行:

ansible-playbook ansible/playbook.yml -i ansible/hosts.ini -t deploy --ask-vault-pass --verbose

注意标签 deploy,所以这里假设安装了 php。所要做的就是从我的命令中删除 -t deploy