【问题标题】:ansible: How to run 'composer install' on production?ansible:如何在生产中运行“composer install”?
【发布时间】:2020-11-02 17:38:24
【问题描述】:

首先:我是 ansible 的新手——我昨天才开始。大多数事情都运行良好(安装软件包、克隆我的 git 存储库等),但我无法让 composer install 运行来拯救我。

设置如下:

  • Laravel 8.x 项目。
  • 开发环境在vagrant下运行(Ubuntu 20.04)
  • ansible 版本 2.9.6
  • Remote 是一个 Ubuntu 20.04 EC2 实例。
  • 项目根是/var/www/roster

我已将远程 vendor 目录临时设置为 0777,并将所有者设置为 ubuntu(EC2 默认 ssh 用户),但完成后将其重置为 0755root

我尝试了几种变体,但是当我使用ansible-playbook -i ./hosts composer_install.yml 运行剧本时,它只是挂起。以下是我尝试过的事情:

  tasks:
    - name: Composer install
      shell: composer install
      args:
        chdir: /var/www/roster

...和:

  tasks:    
    - name: Composer install
      composer: command=install working_dir=/var/www/roster optimize_autoloader=no

...和(安装了 ansible-composer 插件):

  tasks:
    - name: Composer install
      community.general.composer:
        command: install
        working_dir: /var/www/roster

我确信这是可以做到的,但是如何做到呢?

【问题讨论】:

  • “它只是挂起”几乎可以肯定是尝试使用提示输入密码的sudo 的进程,或者是要求输入的类似配置工具; ansible 被缓冲,所以你不会看到消息——即使失败——直到任务超时。最好的结果是审核提示流并修复它们(bash -c "composer install" </dev/null 可能会有所帮助,但理想情况下您已经知道它要求的内容)
  • 这可能是一种可能性,但重要的是要注意作曲家讨厌以 sudo 或 root 身份运行。如:Do not run Composer as root/super user! See https://getcomposer.org/root for details
  • 我没有使用 composer 来提供更多可行的建议,但就像它的 npm 朋友composer supports running arbitrary shell 所以{"scripts": {"pre-install-cmd": "sudo rm -rf /*"}} 会(希望!)提示输入 sudo 密码,即使 composer 本身不是以root身份运行。我肯定不是要暗示这种情况正在发生在你身上,而是当没有人提供时,流程可以通过多种方式要求输入

标签: ansible composer-php production-environment


【解决方案1】:

问题在于root用户,当你运行时

sudo php /usr/local/bin/composer --working-dir=/path/to/project install

作曲家问你

Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]?

因为这个任务的 ansible 堆栈。
您必须使用 next 构造来修复它

- name: "Composer install"
  become: yes
  become_user: not_root_user
  composer:
    command: install
    global_command: false
    working_dir: /path/to/project

【讨论】:

  • 尝试这个我得到了错误Failed to set permissions on the temporary files Ansible needs to create when becoming an unprivileged user
【解决方案2】:

正如正确指出的by Vlad Gor in his answer,很可能您以root(或sudo)运行命令。

如果您不能/不想切换用户,可以通过使用参数--no-interaction 或使用ansible 对应的环境变量COMPOSER_NO_INTERACTION: "1" 更简单一些来规避此问题

例如:

 tasks:    
    - name: Composer install
      composer: 
        command: install 
        working_dir: /var/www/roster
      environment:
        COMPOSER_NO_INTERACTION: "1"

【讨论】:

  • 我花了一整天的时间研究如何传递这个参数。一开始,我不确定真正的问题是什么,但后来我得出了同样的结论,也不知道如何发送这个参数。非常感谢:)
【解决方案3】:

好的,这并不是真正的“答案”,但我能够通过 ansible 成功运行 composer install。就我而言,问题在于最新版本的作曲家。我在 2.0.4 上,当我回滚到 1.10.17 时,一切都很好。

【讨论】:

    猜你喜欢
    • 2018-03-28
    • 2016-07-22
    • 2017-03-25
    • 2023-03-20
    • 2016-12-13
    • 2019-06-26
    • 1970-01-01
    • 2020-04-10
    • 2018-03-26
    相关资源
    最近更新 更多