Specifying ssh key in ansible playbook file

可视剧本可以在命令行上使用 --key-file指定用于 ssh 连接的键。

ansible-playbook -i hosts playbook.yml --key-file "~/.ssh/mykey.pem"

是否可以在剧本文件中指定此键的位置,而不是在命令行上使用 --key-file

因为我想把这个密钥的位置写入一个 var.yaml文件中,这个 var.yaml文件可以用 vars_files:的可视剧本来读取。

以下是我的配置的一部分:

vars.yml file

key1: ~/.ssh/mykey1.pem
key2: ~/.ssh/mykey2.pem

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

我试过在 vars下面加入 ansible_ssh_private_key_file,但是它在我的机器上不起作用。

vars_files:
- vars.yml
vars:
ansible_ssh_private_key_file: "{{ key1 }}"
tasks:
- name: Echo a hello message
command: echo hello

如果我用上面的 playbook.yml运行 ansible-playbook,我会得到以下错误:

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

在 ssh 命令中没有找到密钥文件的名称,这很奇怪。

249740 次浏览

您要查找的变量名是 ansible_ssh_private_key_file

您应该将其设置为“ vars”级别:

  • 在库存文件中:

    myHost ansible_ssh_private_key_file=~/.ssh/mykey1.pem
    myOtherHost ansible_ssh_private_key_file=~/.ssh/mykey2.pem
    
  • host_vars:

    # host_vars/myHost.yml
    ansible_ssh_private_key_file: ~/.ssh/mykey1.pem
    
    
    # host_vars/myOtherHost.yml
    ansible_ssh_private_key_file: ~/.ssh/mykey2.pem
    
  • 如果对一组主机使用相同的密钥,则在 group_vars文件中

  • in the vars section of an entry in a play:

    - 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
    
  • in 设定一个事实 in a play entry (task):

    - name: 'you name it'
    ansible.builtin.set_fact:
    ansible_ssh_private_key_file: "\{\{ key1 }}"
    

库存文件

您可以使用 ansible.cfg 文件,它应该是这样的(您可能还想包含其他参数) :

[defaults]
inventory = <PATH TO INVENTORY FILE>
remote_user = <YOUR USER>
private_key_file =  <PATH TO KEY_FILE>

Hope this saves you some typing

如果您使用 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 }}"

但也失败了。

所以这不是一个答案,只是一些调试帮助和不要尝试的东西。