我使用Ansible按照以下指南创建了一个gce集群:https ://docs.ansible.com/ansible/latest/scenario_guides/guide_gce.html
在GCE创建结束时,我使用add_host
Ansible模块将所有实例注册到其对应的组中。e.g. gce_master_ip
但是,当我尝试在创建任务之后运行以下任务时,它们将无法工作:
- name: Create redis on the master hosts: gce_master_ip connection: ssh become: True gather_facts: True vars_files: - gcp_vars/secrets/auth.yml - gcp_vars/machines.yml roles: - { role: redis, tags: ["redis"] }
在该auth.yml
文件中,我已经提供了服务帐户电子邮件,json凭证文件的路径和项目ID。但是显然这还不够。我收到如下错误:
UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey).\r\n", "unreachable": true}
不允许或未提供的典型ssh用户名和凭据。在这种情况下,我会说我没有为ssh
Ansible将用于进行连接的连接设置任何用户名和私钥。
我应该做些什么来确保提供了相应的凭据来建立连接?
在搜索过程中,我认为一个问题刚刚提到您可以使用该gcloud compute ssh...
命令。但是有没有办法我可以在Ansible中指定不使用经典版本ssh
而使用gcloud呢?
为了将Ansible SSH用于实例并对其进行配置,您需要向实例上的用户接受的匹配公钥提供Ansible私钥和用户。GCP提供了两种方式来自动化和管理 GCE实例的密钥分发。
例如,您可以使用OS登录功能来管理密钥。要使用OS登录:
在通过Ansible 创建GCE实例时通过metadata参数将“ enable-oslogin”元数据字段设置为“ TRUE”,从而在生成的实例上启用OS登录。
使用角色/iam.serviceAccountUser和角色/compute.osLoginAdmin权限创建IAM用户。
要么生成一个新的密钥对,要么选择一个现有的SSH密钥对,然后上载公钥以用于OS Login :(gcloud compute os-login ssh-keys add --key-file [KEY_FILE_PATH] --ttl [EXPIRE_TIME]
其中--ttl
指定了您希望该公钥可用的时间-例如,--ttl 1d
将使其在1天后失效)
从这里,您应该能够将Ansible配置为使用服务用户的名称和上载的公共密钥的对应私钥,以便成功地通过SSH进入任何启用OS登录功能的GCE实例。例如,这可以通过覆盖ansible_user
和ansible_ssh_private_key_file
库存参数或将--private-key
和--user
参数传递给来完成ansible-playbook
。