ssh - 使用 ansible 配置一个由 ansible 创建的 Google Compute Instance

标签 ssh google-cloud-platform ansible google-compute-engine

我正在使用 gcp_compute_instance ansible 模块来创建一个实例,基本上是复制 this document 中的内容.这可以很好地创建实例,但是在创建实例后,我无法使用不同的剧本对其进行配置,因为该实例无法将服务帐户识别为有效的 ssh 用户。运行第二个剧本时出现的错误是

Failed to connect to the host via ssh: ansible@35.196.226.99: Permission denied (publickey).

我没有在任何关于 gce/ansible 的文档或教程中找到如何配置对新创建实例的 ssh 访问。所有文档都暗示它应该只与您为实际创建实例而配置的内容一起工作,显然情况并非如此。我尝试的是给服务帐户一个具有 compute.instances.osAdminLogin 权限的角色但是还有两条我不知道的信息。
  • 用于连接的用户名是什么。我现在的第二本剧本有 remote_user设置为服务帐户的名称,但这不起作用。如何在 ansible 中自动配置它,以便我可以在没有手动干预的情况下背靠背运行两个剧本?
  • 如何将 ssh key 与服务帐户关联?使用 gcloud compute os-login ssh-keys add将其添加到我的个人帐户,而不是服务帐户

  • 请注意,我可以使用我的个人帐户 ssh 进入实例,它使用 GCE 的操作系统登录功能和我的个人 ssh key ,但我想使用具有自己的 ssh key 的服务帐户运行第二个 ansible 剧本,而不是我的个人帐户,以便我可以与其他人或 CI/CD 服务共享整个过程

    最佳答案

    操作所遵循的文档中的脚本已损坏。我刚刚花了大约一天的时间来解决这个问题,问题是实例最终连接到创建的网络而不是项目默认值。然后,您无法通过云控制台或远程使用 SSH 连接 os_login 或 key 或防火墙规则都无关紧要。作为消除此问题的第一步:

  • 删除创建网络的节
  • 重写创建实例的 ansible 节:
  • - name: create a instance
        gcp_compute_instance:
          state: present
          name: "{{ system_name }}"
          machine_type: "{{ system_type }}"
          disks:
            - auto_delete: true
              boot: true
              source: "{{ disk }}"
          network_interfaces:
               - access_configs:
                  - name: 'External NAT'
                    nat_ip: "{{ address }}"
                    type: 'ONE_TO_ONE_NAT'
          zone: "{{ zone }}"
          project: "{{ gcp_project }}"
          auth_kind: "{{ gcp_cred_kind }}"
          service_account_file: "{{ gcp_cred_file }}"
          scopes: 
             - "{{ gcp_scopes }}"
      register: instance
    
    当然,一旦 vm 工作并允许 ssh 访问。您可以返回并评估是否需要额外的网络以及如何使用它。

    关于ssh - 使用 ansible 配置一个由 ansible 创建的 Google Compute Instance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56094129/

    相关文章:

    ssh - Vagrant 无法连接到虚拟机

    java - 如何在Debian服务器上持续自动运行.jar?

    regex - Grep Info 然后只显示单引号之间的文本?

    git - 使用 ssh 连接到实时服务器并将我的 git 推送到其中

    apache-kafka - KafkaIO withLogAppendTime 与 withProcessingTime

    redis - Ansible:不同主机的配置文件中相同变量的不同值

    ansible - 使用 Ansible ad-hoc 命令删除多个用户

    python - 使用 Google Storage Bucket 下载速度缓慢

    google-app-engine - 在 GAE Flex 中运行的 Java servlet 中,如何以编程方式获取包含的 GCP 项目 ID?

    Ansible:检查列表,如果找到,则删除一个或多个项目