我正在尝试读取文件的内容,将它们存储在变量中,然后将它们插入到另一个文件中(如果它们尚不存在)。
所以,我试图解决这个问题的方法如下:
# Create a variable that represents the path to the file that you want to read from
ssh_public_key_file: '../../jenkins_master/files/{{ hostvars[inventory_hostname]["environment"] }}/id_rsa.pub'
# Create a variable that represents the contents of this file:
ssh_public_key: "{{ lookup('file', '{{ ssh_public_key_file }}') }}"
然后我在Ansible playbook中使用这些变量如下:
- name: Install SSH authorized key
lineinfile: create=yes dest=~/.ssh/authorized_keys line=" {{ ssh_public_key }}" mode=0644
但是,当我尝试运行该剧本时,我收到以下错误消息:
could not locate file in lookup: {{ ssh_public_key_file }}
任何人都可以推荐解决方案或建议我做错了吗?
谢谢,
肖恩
答案 0 :(得分:23)
您必须将行更改为:
# Create a variable that represents the contents of this file:
ssh_public_key: "{{ lookup('file', ssh_public_key_file) }}"
如果需要连接变量和字符串,可以这样做:
# Example with two variables
ssh_public_key: "{{ lookup('file', var_1+var_2) }}"
# Example with string and variable
ssh_public_key: "{{ lookup('file", '~/config/'+var_1) }}"
答案 1 :(得分:1)
首先,我要确保您的ssh_public_key_file
变量已正确设置。如果您添加如下所示的任务,它会显示什么?
- name: display variable
debug: var=ssh_public_key_file
如果输出看起来像这样,那么变量没有被正确定义(例如,"环境"事实对主机不存在):
ok: [localhost] => {
"ssh_public_key_file": "../../jenkins_master/files/{{ hostvars[inventory_hostname][\"environment\"] }}/id_rsa.pub"
}
但是,如果一切都已正确定义,那么输出应显示用正确值替换的变量:
ok: [localhost] => {
"ssh_public_key_file": "../../jenkins_master/files/foo/id_rsa.pub"
}
一旦您确认了,那么我会对您的ssh_public_key
变量做同样的事情。只需使用调试模块输出其值即可。它应该显示为公钥文件的内容。
我强烈建议的另一件事是完全避免使用lineinfile。由于您正在使用SSH密钥,我建议您使用authorized_key模块。它是管理authorized_keys文件的一种更简洁的方式。