Использование переменных для имени файла и содержимого файла в модуле lineinfile

Я пытаюсь прочитать содержимое файла, сохранить их в переменной и затем вставить их в другой файл, если они еще не существуют.

Итак, как я пытаюсь это сделать:

# 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 следующим образом:

- name: Install SSH authorized key
  lineinfile: create=yes dest=~/.ssh/authorized_keys line=" {{ ssh_public_key }}" mode=0644

Однако, когда я пытаюсь запустить playbook, я получаю следующее сообщение об ошибке:

could not locate file in lookup: {{ ssh_public_key_file }}

Может ли кто-нибудь рекомендовать решение или предложить, что я, возможно, сделал неправильно?

Благодаря,

Seán

Ответ 1

Вы должны изменить строку на:

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

.,

Ответ 2

Сначала я бы удостоверился, что ваша переменная 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.