使用 ansible-playbook 安装 docker-compose 时出错

Error when installing docker-compose using ansible-playbook

我有一个非常简单的 Ansible 剧本,为 docker-compose 和 docker 安装了所有依赖项,但是在安装 docker-compose 时出现错误,这是任务我的剧本在 CentOS7 环境中安装 docker-compose。

    #ensure docker-compose and chmod +x /usr/local/bin/docker-compose
  - name: Ensure docker-compose is installed and available
    command: curl -L https://github.com/docker/compose/releases/download/1.7.0-rc1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  - name: Ensure permissions docker-compose
    command: chmod +x /usr/local/bin/docker-compose

出现以下错误:

TASK: [Ensure docker-compose is installed and available] ********************** 
failed: [nutrilife-aws] => {"changed": true, "cmd": ["curl", "-L", "https://github.com/docker/compose/releases/download/1.7.0-rc1/docker-compose-`uname", "-s`-`uname", "-m`", ">", "/usr/local/bin/docker-compose"], "delta": "0:00:00.004592", "end": "2016-03-26 14:19:41.852780", "rc": 2, "start": "2016-03-26 14:19:41.848188", "warnings": ["Consider using get_url module rather than running curl"]}
stderr: curl: option -s`-`uname: is unknown
curl: try 'curl --help' or 'curl --manual' for more information

FATAL: all hosts have already failed -- aborting

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/home/mmaia/playbook.retry

nutrilife-aws              : ok=4    changed=0    unreachable=0    failed=1 

我被这个简单的错误困扰了几个小时。我从标准 docker 站点获得命令并直接在 shell 中测试并且它有效。 我也尝试过使用双引号将命令括起来,例如 command: "curl ..." 但它并没有改变错误。

command 未通过 shell 处理。使用 shell.

  - name: Ensure docker-compose is installed and available
    shell: curl -L https://github.com/docker/compose/releases/download/1.7.0-rc1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

作为 helloV you need to use the shell 模块,如果你想利用 shell 扩展或 shell 的环境变量。

但是,在 Ansible 中,您通常最好使用更高级别的模块,并且只有在您无法使用其他模块执行所需操作时才求助于 shellcommand 模块。这种方法免费为您提供了更好的执行控制,例如轻松的幂等性和更好的输出可见性。

在你的情况下,你可以使用 get_url(我相信如果你试图 shell out with curl 你可能会更好地使用这个模块,我相信 Ansible 实际上会警告你)从中获取东西互联网。

在您的情况下,您的任务可能如下所示:

  - name: Ensure docker-compose is installed and available
    get_url: 
      url : https://github.com/docker/compose/releases/download/1.7.0-rc1/docker-compose-{{ ansible_system }}-{{ ansible_userspace_architecture }}
      dest: /usr/local/bin/docker-compose
      mode: 'u+x,g+x'

上述任务使用目标主机上 gathering facts 返回的特殊变量,因此您的任务在 Linux 系统或 OS X 上应该 运行 正常(你需要 .exe 的条件后缀才能使 Windows link 工作,显然需要不同的目标路径等)。

它还使用 file 模块中的 mode 参数为用户和组添加执行权限,这样您就可以避免 chmod 任务。