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


person Seán    schedule 19.02.2015    source источник
comment
Я подозреваю, что jinja2 не расширяется внутри одинарных кавычек. Хотя не на 100% уверен в этом. В любом случае используйте модуль template вместо линейного файла. В дальнейшем будет гораздо меньше беспорядка.   -  person tedder42    schedule 19.02.2015
comment
Эй @ Шон, ты нашел решение своей проблемы? В настоящее время у меня такая же проблема, и, возможно, вы можете поделиться своим решением со мной/другими. Спасибо   -  person ByteNudger    schedule 07.07.2015


Ответы (2)


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

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

. .

person ByteNudger    schedule 08.07.2015

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

person Bruce P    schedule 19.02.2015