与Google Cloud Platform GCE配合使用

时间:2018-06-26 03:26:31

标签: google-cloud-platform ansible

我按照以下准则使用了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用户名和凭据。在这种情况下,我会说我没有为Ansible将用于进行连接的ssh连接设置用户名和私钥。

我应该做些什么来确保提供了相应的凭据来建立连接吗?

在搜索过程中,我认为一个问题刚刚提到您可以使用gcloud compute ssh...命令。但是,有没有一种方法可以在Ansible中指定不使用经典的ssh而使用gcloud呢?

1 个答案:

答案 0 :(得分:6)

要在实例上使用Ansible SSH并对其进行配置,您需要为Ansible实例上的用户接受的匹配公共密钥提供Ansible私钥和用户。 GCP为GCE实例提供了automate and manage key distribution的几种方式。

例如,您可以使用OS Login功能来管理密钥。要使用OS登录:

  1. 在通过Ansible创建GCE实例时,通过metadata parameter将“ enable-oslogin”元数据字段设置为“ TRUE”,从而在实例上启用OS登录。
  2. 使用roles/iam.serviceAccountUser and roles/compute.osLoginAdmin permissions来创建IAM用户。
  3. 要么生成一个新密钥,要么选择一个现有的SSH密钥对,然后选择upload the public key以用于OS登录:gcloud compute os-login ssh-keys add --key-file [KEY_FILE_PATH] --ttl [EXPIRE_TIME](其中--ttl指定您希望此公共密钥可以使用多长时间-对于例如--ttl 1d将使其在1天后过期)
  4. 从这里,您应该能够将Ansible配置为使用服务用户的名称和上载的公共密钥的对应私钥,以便成功地通过SSH进入任何启用了OS登录功能的GCE实例。例如,可以通过覆盖ansible_useransible_ssh_private_key_file库存参数,或将--private-key--user参数传递到ansible-playbook来完成此操作。