在Ansible Playbook文件中指定SSH密钥


79

Ansible剧本可以--key-file在命令行上使用来指定用于ssh连接的密钥。

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

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

因为我想将此密钥的位置写入一个var.yaml文件,该文件将由ansible剧本使用读取vars_files:

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

vars.yml文件

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

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

我试过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

如果我ansible-playbookplaybook.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

我在ssh命令中找不到密钥文件的名称。真奇怪。


1
我认为--private-key=~/.ssh/keys/id_rsa可以。
zx1986 '19

@ zx1986--private-key key_file_path也为我工作。
Kaustubh Desai

Answers:


89

您要查找的变量名称是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

    # hosts_vars/myHost.yml
    ansible_ssh_private_key_file: ~/.ssh/mykey1.pem
    
    # hosts_vars/myOtherHost.yml
    ansible_ssh_private_key_file: ~/.ssh/mykey2.pem
    
  • 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
    

库存文件


2
ansible_ssh_private_key_file底下vars没有在我的机器上工作。真奇怪。
布莱恩(Brian

我不想在清单中指定密钥。因为我无法vars.yml从清单文件加载。
布莱恩(Brian

确切:从vars现在起,我认为为时已晚。如果您不想将其放入库存,则应使用host_varsgroup_vars文件。
zigarn

看到在保管库中拥有私钥的最佳实践将是一件很有趣的事情,因此可以将私钥推入git repo中而不会感到那么糟糕。
ferdy

@fabiog是的,我只是使用Ansible 2.9降到1.8对其进行了测试,所有(主要)版本均与本vars:节中定义的私钥一起使用。
zigarn

30

您可以使用ansible.cfg文件,该文件应如下所示(可能还需要包含其他参数):

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

希望这可以为您节省一些打字时间


0

如果在运行您的剧本的同时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 }}"

但这也失败了。

所以这不是答案。只是一些调试帮助,不要尝试的事情。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.