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 из указанной папки, и он будет подобран при следующем воспроизведении без необходимости добавлять/удалять ключи, явно определенные в самой задаче.