Использование переменных для имени файла и содержимого файла в модуле 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.