Ansible 如何解决;在查找中找不到文件";阅读id_rsa.pub?
在Ansible playbook中,我试图将默认公钥读入一个变量,以便以后使用。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
这是我的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是的,绝对是。它在模块文档中多次指出。