我已经按照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]
答案 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"