Ansible - как объединить содержимое файлов в переменную
как я могу объединить содержимое нескольких файлов в переменную?
вот проблема: я пытаюсь установить открытые ключи пользователя на удаленной машине. Пример из документация authorized_key что почти работает:
- name: Set up authorized_keys for the deploy user
authorized_key: user=deploy
key="{{ item }}"
with_file:
- public_keys/doe-jane
- public_keys/doe-john
но на самом деле мне нужно использовать exclusive=yes
, поэтому после обновления все не предоставленные открытые ключи удаляются.
если exclusive=yes
предоставляется, тогда только последний открытый ключ, указанный в (также сообщается как ошибка).
мой нынешний подход:
- name: create empty temporary keys file
local_action: "shell > /tmp/auth_keys"
- name: concat keys to temporary file
local_action: "shell echo {{ item }} >> /tmp/auth_keys"
with_file:
- public_keys/doe-jane
- public_keys/doe-john
- name: set up authorized_keys
authorized_key: user=deploy
key="{{ lookup('file', '/tmp/auth_keys') }}"
exclusive=yes
это работает, но первые две команды всегда производят "изменен". Кроме того, я чувствую, что для этого должно быть более элегантное решение.
Итак, есть ли способ объединить содержимое нескольких файлов в переменную? Или есть какой-то лучший подход вообще для этой задачи?
1 ответов
нет ничего чрезмерно плохого в вашем первом варианте, а затем, как упоминает ваш комментарий, просто используя changed_when: False
признать, что это не то, что вы заботитесь о результате его изменения, является допустимым вариантом.
ответить на фактическое название вопроса Вы можете, как указано в GitHub "проблема" вы связаны, просто объедините поиски непосредственно в задаче так:
- name: set up authorized_keys
authorized_key: user=deploy
key="{{ lookup('file', 'public_keys/doe-jane') + lookup('file', 'public_keys/doe-john')}}"
exclusive=yes
, чище вариант можно использовать модуль собрать чтобы объединить ваши ключи.
это изменило бы ваш текущий подход в нечто большее, чем:
- name: create concatenated keys file
local_action: "assemble src=roles/ssh_keys/files/ssh_keys/ dest=/tmp/ssh_keys_file"
- name: set up authorized_keys
authorized_key: user=deploy
key="{{ lookup('file', '/tmp/ssh_keys_file' }}"
exclusive=yes
Это будет помечено только как измененный, если файл назначения изменился вообще, поэтому запуск его снова и снова оставляет прекрасную зеленую стену.
Это зависит от ваших ssh-ключей, все из которых являются файлами и находятся в одной папке (сборка обычно используется для поворота conf.D каталоги стилей в один .файл conf для программы, которые не используют конф.конфигурация стиля d), но это, вероятно, самый разумный способ их удержания в любом случае.
преимущество этого заключается в том, что вы можете просто добавить/удалить ключи ssh из указанной папки, и он будет подобран при следующем воспроизведении без необходимости добавлять/удалять ключи, явно определенные в самой задаче.