it-swarm.com.ru

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

15
Seán

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

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

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

1
Bruce P