簡體   English   中英

AWS ECR 獲取登錄命令 - 通過 ansible 沒有這樣的文件或目錄

[英]AWS ECR Get login command - No such file or directory via ansible

我有一個這樣的任務

- name: Login to AWS
   command: $(aws ecr get-login --no-include-email --region us-east-2)

運行這個我得到輸出

失敗:=> {“已更改”,錯誤:“cmd”,“'^$(aws' ecr get-login --no-include-email --region 'us-east-2)'”:“msg”, "[Errno 2] 沒有那個文件或目錄": "rc": 2}

是什么原因? 我相信這個命令應該運行良好

您正在使用的 $(command) 構造是“命令替換”。 shell 運行該命令,捕獲其輸出,並將其插入到包含 $(...) 的命令行中。 它旨在用於從 shell 命令行登錄到 ECS 服務。

Ansible 不會在 shell 模式下啟動命令。 並且在該上下文中不支持 shell 命令替換,並因此報告找不到文件。

來自https://docs.ansible.com/ansible/2.5/modules/command_module.html

給定的命令將在所有選定的節點上執行。 它不會通過 shell 進行處理,因此像 $HOME 這樣的變量和像 "<"、">"、"|"、";" 這樣的操作和“&”將不起作用(如果需要這些功能,請使用 shell 模塊)。

相反,您可以創建一個 shell 腳本來執行 ECS 登錄,以及登錄后需要運行的進程。 然后從命令參數調用該腳本。

請注意,上面的文檔確實提到了可以使用的 shell 模塊。 如果您需要這種類型的命令替換,您應該使用該模塊。

ansible 問題跟蹤器上有幾個問題,它們都指向amazon-ecr-credential-helper作為解決方案。

基本上,您通過普通的包管理器安裝包(例如apt install amazon-ecr-credential-helper對於基於 debian 的系統)並通過credential helpers添加配置到 docker 引擎。 這通常放在~/.docker/config.json文件中。 為此,您必須創建/配置一些方法讓機器通過 AWS 進行身份驗證。 我個人為此使用 EC2 實例角色,但您也可以使用憑證、環境變量或 AWS 提供的其他東西。

例如~/.docker/config.json

{
    "credHelpers": {
        "<ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com": "ecr-login"
    }
}

到達那里的 Ansible 指令:

---
- name: Install docker.io + helper script for ecr
  apt:
    name: "{{ item }}"
    state: latest
  loop:
    - docker.io
    - amazon-ecr-credential-helper

- name: Creates directory
  file:
    path: /home/ubuntu/.docker/
    state: directory

- name: add ECR configuration to docker repositories
  copy: src=config.json dest=/home/ubuntu/.docker/config.json

rc 是命令aws ecr get-login --no-include-email --region us-east-2的返回(退出)代碼,在您的情況下為“2”

下面列出的要點可能有助於排除故障 -

  1. 使用aws --version命令驗證 aws cli 是否安裝正確。

  2. 根據文檔,AWS CLI 從 1.9.15 版本開始提供get-login命令; 推薦使用 1.11.91 版本。 嘗試更新 aws 版本 -

    pip install awscli --upgrade --user

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM