google cloud - 通过ansible

时间:2017-10-24 19:17:09

标签: ansible google-cloud-platform

我已经按照Google Cloud Platform Guide for Ansible(http://docs.ansible.com/ansible/latest/guide_gce.html)进行了操作,我可以从一个剧本中成功创建一个实例,但是当我尝试直接运行ansible命令时,它会给我一个Permission Denied消息。

我可以运行' gce.py --list'从库存目录中,它列出了我的所有实例,但是当我尝试运行所有-i inventory -m setup'它给了我许可否认。我已正确设置gce.ini,甚至设置了所有env变量,因为指南建议但没有运气。有任何想法吗?这是我的追踪

  

jonathan @ devopsbox:〜/ ansible $ ansible all -i inventory -m setup -vvv   ansible 2.4.0.0   config file = /home/jonathan/ansible/ansible.cfg   已配置的模块搜索路径= [u' /home/jonathan/.ansible/plugins/modules' ;, u' / usr / share / ansible / plugins / modules']   ansible python module location = /usr/lib/python2.7/dist-packages/ansible   可执行位置= / usr / bin / ansible   python版本= 2.7.13(默认,2017年1月19日,14:48:08)[GCC 6.3.0 20170118]   使用/home/jonathan/ansible/ansible.cfg作为配置文件   使用脚本插件解析/home/jonathan/ansible/inventory/gce.py库存源   META:经营处理程序   使用模块文件/usr/lib/python2.7/dist packages / ansible / modules / system / setup.py    建立用户的SSH连接:无    SSH:EXEC ssh -C -o ControlMaster = auto -o ControlPersist = 60s> -o KbdInteractiveAuthentication = no -o PreferredAuthentications = gssapi-with mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication = no -o ConnectTimeout = 10 -o ControlPath = / home / jonathan / .ansible / cp / 3d50765225 xxx.xxx。 xxx.xxx' / bin / sh -c'"'"' echo~&&睡觉0'''"''    (255,'','权限被拒绝(公钥)。\ r \ n')   myinstancename | UNREACHABLE! => {      "改变了#34;:错误,      " msg":"无法通过ssh连接到主机:Permission denied(publickey)。\ r \ n",      "无法到达":是的   }

它说用户:无。这是否意味着它没有传递我的帐户email / pem_file_path / proj_id?它在gce.ini中设置。

我还在.bashrc中设置了以下内容: GCE_INI_PATH GCE_EMAIL GCE_PROJECT GCE_CREDENTIALS_FILE

我基本上已经尝试了一切,但没有运气。在Ubuntu 17.04上运行Ansible 2.4:

  

ansible --version   ansible 2.4.0.0    config file = /home/jonathan/ansible/ansible.cfg    已配置的模块搜索路径= [u' /home/jonathan/.ansible/plugins/modules' ;, u' / usr / share / ansible / plugins / modules']   ansible python module location = /usr/lib/python2.7/dist-packages/ansible   可执行位置= / usr / bin / ansible   python版本= 2.7.13(默认,2017年1月19日,14:48:08)[GCC 6.3.0 20170118]

2 个答案:

答案 0 :(得分:0)

评论中的回答:

  

您必须告诉ansible / ssh要使用的凭据文件(通过ssh_config或ssh-agent或group_vars)。

-

  

感谢您的提示。事实证明,我所要做的就是运行gcloud compute ssh...来生成密钥。事后一切顺利。 Ansible文档可以更加明确。

答案 1 :(得分:0)

在这个问题上花费了很长时间后,我能够通过 gcoud ssh 隧道传输 ansible 任务,解决方案如下:

创建misc/gssh.sh

#!/bin/bash
host="${@: -2: 1}"
cmd="${@: -1: 1}"

socket="/tmp/ansible-ssh-${host}-22-iap"
ZONE=$(gcloud compute instances list --filter="name:${host}" --format='value(zone)')
gcloud_args="
--tunnel-through-iap
--zone=${ZONE}
--quiet
--no-user-output-enabled
--
-C
-o ControlMaster=auto
-o ControlPersist=20
-o PreferredAuthentications=publickey
-o KbdInteractiveAuthentication=no
-o PasswordAuthentication=no
-o ConnectTimeout=20"

exec gcloud compute ssh "$host" $gcloud_args -o ControlPath="$socket" "$cmd"

还要更改 ansible.cfg

中的一些设置
[ssh_connection]
pipelining = True
ssh_executable = ./misc/gssh.sh
transfer_method = piped

[defaults]
gathering = False # optional
strategy = free # important

也有 gcp.yaml 喜欢:

---
plugin: gcp_compute
projects:
  - <PROJECT NAME>
auth_kind: serviceaccount
service_account_file: /opt/ansible/inventory/service-account.json
hostnames:
  - name
compose:
  ansible_host: name

Ansible 将读取配置文件 ansible.cfg,并知道它必须通过在 gssh.sh 中创建的 gcloud 连接对所有命令进行隧道传输。因此,不需要任何手动 ssh 密钥生成和身份验证。

希望这可以为某人节省一些研究时间。


编辑 1: zone fetching 会减慢进程,这可以通过在 gssh.sh 中对 zone 进行硬编码来解决;只需替换

ZONE=$(gcloud compute instances list --filter="name:${host}" --format='value(zone)')

ZONE=<zone name>

例如

ZONE="us-central1-a"