ansible:如何在生产中运行“ composer install”?

问题描述

首先:我对ansible非常陌生-我昨天才刚开始。大多数事情都运作良好(安装软件包,克隆我的git repo等),但是我无法运行composer install来拯救我。

这是设置:

  • L@R_404_6460@vel 8.x项目。
  • 开发环境在无家可归的情况下运行(Ubuntu 20.04)
  • 可用版本2.9.6
  • Remote是一个Ubuntu 20.04 EC2实例。
  • 项目根目录为/var/www/roster

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

我尝试了几种变体,但是当我使用root运行剧本时,它会挂起。这是我尝试过的事情:

ansible-playbook -i ./hosts composer_install.yml

...并且:

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

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

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

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

解决方法

问题出在 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 堆栈。
您必须使用下一个构造来修复它

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

正如 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"
,

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