[英]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”
下面列出的要點可能有助於排除故障 -
使用aws --version
命令驗證 aws cli 是否安裝正確。
根據文檔,AWS CLI 從 1.9.15 版本開始提供get-login命令; 推薦使用 1.11.91 版本。 嘗試更新 aws 版本 -
pip install awscli --upgrade --user
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.