Ansible 如何解决;在查找中找不到文件";阅读id_rsa.pub?

Ansible 如何解决;在查找中找不到文件";阅读id_rsa.pub?,ansible,ansible-2.x,Ansible,Ansible 2.x,在Ansible playbook中,我试图将默认公钥读入一个变量,以便以后使用。 这是我的yml: - hosts: hostsGroup become: false vars: publicKey: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" 脚本中断,出现以下错误: fatal: [redacted-ip]: FAILED! => {"msg": "An unhandled e

在Ansible playbook中,我试图将默认公钥读入一个变量,以便以后使用。
这是我的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"}
fatal:[修订的ip]:失败!=>
{“msg”:“在模板化“{lookup('file',lookup('env','HOME')+”/.ssh/id_rsa.pub')}”时发生未经处理的异常。错误为,
原始消息:运行查找插件“文件”时发生未处理的异常。错误为,
原始消息:在查找中找不到文件:/root/.ssh/id\u rsa.pub“}
该文件已确认存在于该位置

有更好的办法吗?或者我做错了什么?

引用:

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

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

- name: get remote file contents
  command: "cat {{ ansible_env.HOME }}/.ssh/id_rsa.pub"
  register: key
- name: show key contents
  debug:
    var: key.stdout
然后,您可以访问以下内容:

- name: get remote file contents
  command: "cat {{ ansible_env.HOME }}/.ssh/id_rsa.pub"
  register: key
- name: show key contents
  debug:
    var: key.stdout
但是!注意,这里我使用的是
ansible\u env.HOME
。这是在收集事实时由Ansible填充的,从Ansible用于身份验证的用户的角度来看,它将表示
HOME
环境变量的值。如果您使用的是
成为\u用户
,则该值不会更改以反映新用户。

如中所述

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


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

您提到的变为:false。这意味着您要强制ansible_用户在/home/目录中查找。 但是,playbook正在根位置查找密钥:在查找中找不到文件:/root/.ssh/id_rsa.pub


假设您想要ansible_用户的get publick密钥,您的playbook每次连接到远程服务器时都会升级到根用户,并在本地计算机(而不是远程计算机)中进行查找搜索。

我投了反对票,因为对于这种用例,
slurp
模块比
命令
模块更受欢迎。我不确定它是否正确。当然,这是一个选项,但要将纯文本内容放入变量中,
命令
任务通常要简单得多。这取决于您尝试执行的操作。
slurp
与平台无关,其存在仅用于“获取包含远程文件中数据的base64编码blob”
命令
非常通用,它是替换几个模块的一个选项,也就是说,
命令
是执行
mysqldump
的一个选项,但是出于这个目的,
mysql_db
模块是首选的(
状态:dump
)。谢谢,还有一个提醒,您的答案是
ansible\u env
而不是
ansbible\u env
,上面有一个打字错误:D@Krismorte谢谢你抓住了打字错误;我已经更新了答案。请注意,当文件被slurped时,它是一个Base64编码的字符串,需要通过管道通过
b64decode
@BenH是的,绝对是。它在模块文档中多次指出。