如何解决读取id_rsa.pub的“在查找中找不到文件”?

时间:2019-01-25 21:41:27

标签: ansible ansible-2.x

在Ansible剧本中,我试图将默认的公共密钥读入变量以供以后使用。
这是我的yml:

- hosts: hostsGroup
  become: false
  vars:
    publicKey: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"

该脚本因以下错误而中断:

fatal: [redacted-ip]: FAILED! => 
{"msg": "An unhandled exception occurred while templating '{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}'. Error was a <class 'ansible.errors.AnsibleError'>, 
original message: An unhandled exception occurred while running the lookup plugin 'file'. Error was a <class 'ansible.errors.AnsibleError'>, 
original message: could not locate file in lookup: /root/.ssh/id_rsa.pub"}

确认该文件存在于该位置。

有更好的方法吗?还是我做错了什么?

3 个答案:

答案 0 :(得分:1)

Lookup plugins documentation

中所述
  

就像所有模板一样,这些插件在Ansible上进行评估   控制机器,而不是目标/远程机器上。

您可以使用slurp module来获取远程密钥的内容。

答案 1 :(得分:0)

引用source

  

查找发生在本地计算机上,而不是在远程计算机上。

要获取远程文件的内容,可以使用如下任务:

- name: get remote file contents
  command: "cat {{ ansbible_env.HOME }}/.ssh/id_rsa.pub"
  register: key

然后您可以访问如下内容:

- name: show key contents
  debug:
    var: key.stdout

但是!请注意,这里我使用的是ansible_env.HOME。 Ansible在收集事实时会填充此字段,并且从Ansible用来进行身份验证的任何用户的角度来看,它将代表HOME环境变量的值。如果您使用的是become_user之类的值,则该值不会更改以反映新用户。

答案 2 :(得分:0)

您提到的变成:错误。这意味着您想强制在/ home /目录中进行ansible_user查找。 但是,剧本正在根位置中查找密钥:无法在查找中找到文件:/root/.ssh/id_rsa.pub

假设您想要获取ansible_user的publick密钥,则您的剧本每次连接到远程服务器时都会升级为root用户+在本地计算机而非远程计算机上进行查找搜索。