我正在尝试通过 Ansible 通过 SSH 连接到 Compute Engine 虚拟机,以便能够与 GKE 私有集群进行交互。该虚拟机位于 Ansible 动态清单中,当我说我想通过 SSH 访问它时,我的意思是我希望能够在其中运行 ansible playbook,而不是从控制节点以外的另一台计算机显式通过 SSH 运行。
我能够通过 SSH 连接到该虚拟机,但是,显然,当我这样做时,我使用虚拟机附加的服务帐户在虚拟机上进行了身份验证,并且我想使用我自己的 GCP 帐户的凭据,[我是能够使用
gcloud compute ssh
在 Ansible 控制节点计算机上执行此操作,因为我已使用该计算机上的 gcloud CLI 进行了身份验证。]*
有什么方法可以让我使用这些凭据通过 Ansible 通过 SSH 连接到该虚拟机吗?
我知道我可以为虚拟机服务帐户提供所需的 IAM 角色或使用另一个服务帐户,方法是生成服务帐户密钥,将其复制到虚拟机并使用虚拟机内的 gcloud CLI 使用该密钥进行身份验证,但是出于安全原因,我试图避免这两种选择。欢迎其他替代方案。
*编辑:显然,当我通过
gcloud auth ssh
进行 SSH 时,我没有通过我自己的身份验证。在虚拟机上运行 gcloud auth list
表明虚拟机内唯一可用的凭据是虚拟机的服务帐户。
编辑 2:提到了动态库存并提供了更详细的解释。
1- 在 Ansible 控制节点机器上安装 ansible-galaxy 角色 google-auth。
2 - 创建一个 Ansible playbook,使用 gcp_compute_auth 插件通过 GCP 进行身份验证,然后使用 ssh 模块通过 SSH 连接到 Compute Engine VM
3 - 请检查我在剧本中使用的代码来实现此目的
- name: SSH into Compute Engine VM with GCP credentials
hosts: compute_engine_vm
tasks:
- name: Authenticate with GCP
google.auth.gcp_compute_auth:
scopes:
- "https://www.googleapis.com/auth/cloud-platform"
register: auth_result
- name: SSH into Compute Engine VM
ssh:
user: "your-username"
host: "{{ inventory_hostname }}"
port: 22
become: true
delegate_to: localhost
environment:
ACCESS_TOKEN: "{{ auth_result.access_token }}"
Ansible 控制节点机器并将生成的访问令牌存储在 access_token 变量中。然后,ssh 模块使用此访问令牌通过 SSH 连接到 Compute Engine 虚拟机。我希望这可以根据您的安全要求满足您的需求
目前(8 月 24 日)我在 ansible Galaxy 中找不到 google-auth 角色的痕迹。 也许它已经被重构了。 我认为大多数人都是在外部生成 ssh 密钥。