在lineinfile模块中使用变量作为文件名和文件内容

时间:2015-02-19 15:58:09

标签: ansible ansible-playbook

我正在尝试读取文件的内容,将它们存储在变量中,然后将它们插入到另一个文件中(如果它们尚不存在)。

所以,我试图解决这个问题的方法如下:

# 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 }}

任何人都可以推荐解决方案或建议我做错了吗?

谢谢,

肖恩

2 个答案:

答案 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文件的一种更简洁的方式。