Ansible playbook可以--key-file在命令行中指定用于ssh连接的密钥.
ansible-playbook -i hosts playbook.yml --key-file "~/.ssh/mykey.pem"
Run Code Online (Sandbox Code Playgroud)
是否可以在playbook文件中指定此键的位置而不是--key-file在命令行上使用?
因为我想将这个键的位置写入一个var.yaml文件,该文件将由ansible playbook读取vars_files:.
以下是我配置的一部分:
vars.yml文件
key1: ~/.ssh/mykey1.pem
key2: ~/.ssh/mykey2.pem
Run Code Online (Sandbox Code Playgroud)
playbook.yml文件
---
- hosts: myHost
remote_user: ubuntu
key_file: {{ key1 }} # This is not a valid syntax in ansible. Does there exist this kind of directive which allows me to specify the ssh key used for this connection?
vars_files:
- vars.yml
tasks:
- name: Echo a hello message
command: echo hello
Run Code Online (Sandbox Code Playgroud)
我试过添加ansible_ssh_private_key_file下vars.但它在我的机器上不起作用.
vars_files:
- vars.yml
vars:
ansible_ssh_private_key_file: "{{ key1 }}"
tasks:
- name: Echo a hello message
command: echo hello
Run Code Online (Sandbox Code Playgroud)
如果我ansible-playbook用playbook.yml以上方式运行.我收到以下错误:
TASK [Gathering Facts] ******************************************************************************************************************************
Using module file /usr/local/lib/python2.7/site-packages/ansible/modules/system/setup.py
<192.168.5.100> ESTABLISH SSH CONNECTION FOR USER: ubuntu
<192.168.5.100> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ubuntu -o ConnectTimeout=10 -o ControlPath=/Users/myName/.ansible/cp/2d18691789 192.168.5.100 '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
<192.168.5.100> (255, '', 'Permission denied (publickey).\r\n')
fatal: [192.168.5.100]: UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey).\r\n",
"unreachable": true
}
to retry, use: --limit @/Users/myName/playbook.retry
Run Code Online (Sandbox Code Playgroud)
我在ssh命令中找不到我的密钥文件的名称.真奇怪.
zig*_*arn 65
您正在寻找的变量名称是ansible_ssh_private_key_file.
你应该把它设置在'vars'级别:
在库存文件中:
myHost ansible_ssh_private_key_file=~/.ssh/mykey1.pem
myOtherHost ansible_ssh_private_key_file=~/.ssh/mykey2.pem
Run Code Online (Sandbox Code Playgroud)在host_vars:
# hosts_vars/myHost.yml
ansible_ssh_private_key_file: ~/.ssh/mykey1.pem
# hosts_vars/myOtherHost.yml
ansible_ssh_private_key_file: ~/.ssh/mykey2.pem
Run Code Online (Sandbox Code Playgroud)group_vars如果您对一组主机使用相同的密钥,则在文件中
在vars您的游戏编辑部分:此解决方案无法正常工作,因为定义变量为时已晚.
- hosts: myHost
remote_user: ubuntu
vars_files:
- vars.yml
vars:
ansible_ssh_private_key_file: "{{ key1 }}"
tasks:
- name: Echo a hello message
command: echo hello
Run Code Online (Sandbox Code Playgroud)E.S*_*rra 21
您可以使用ansible.cfg文件,它应该如下所示(您可能希望包含其他参数):
[defaults]
inventory = <PATH TO INVENTORY FILE>
remote_user = <YOUR USER>
private_key_file = <PATH TO KEY_FILE>
Run Code Online (Sandbox Code Playgroud)
希望这可以为您节省一些打字
如果您运行您的剧本,ansible-playbook -vvv您将看到正在运行的实际命令,因此您可以检查密钥是否实际上包含在 ssh 命令中(您可能会发现问题是错误的用户名而不是丢失的密钥)。
我同意 Brian 上面的评论(以及 zigam 的编辑),即 vars 部分太晚了。我还测试了将密钥包含在主机的动态定义中,如下所示
# fails
- name: Add all instance public IPs to host group
add_host: hostname={{ item.public_ip }} groups=ec2hosts ansible_ssh_private_key_file=~/.aws/dev_staging.pem
loop: "{{ ec2.instances }}"
Run Code Online (Sandbox Code Playgroud)
但这也失败了。
所以这不是一个答案。只是一些调试帮助和不要尝试的事情。
| 归档时间: |
|
| 查看次数: |
98276 次 |
| 最近记录: |