скопируйте файл с удаленного сервера и замените строку с помощью ansible

#ansible

#ansible

Вопрос:

Я знаю, что вы можете скопировать файл с удаленного сервера на локальный, используя ansible с модулем выборки.. Вы даже можете присвоить файлу имя с некоторыми переменными, относящимися к узлу, с которого вы извлекаете. Что я хочу сделать, это заменить определенную строку в этом файле после его копирования, в идеале с использованием переменных инвентаризации. Возможно ли это вообще? Есть ли какой-либо обходной путь, который не включает в себя сценарии последующей обработки bash?

Комментарии:

1. Я сделал что-то подобное… но это было довольно давно… Я не помню точно, что я сделал, но я использовал, если мне не изменяет память, command: sed ...... во временном файле на ram-диске перед записью файла

2. может быть lineinfile module? вы смотрели на это? line это то, что вы назначаете. Также regex поддерживается.

Ответ №1:

После того, как вы извлекли файл, просто используйте делегирование localhost через delegate_to replace задачу.

Дано /tmp/somefile

 foo bar baz
This is an example string
Lorem Ipsum
The quick brown fox jumps over the lazy dog
  

И сборник пьес:

 - hosts: all
  gather_facts: no
      
  tasks:
    - fetch:
        src: /tmp/somefile
        dest: /tmp/fetched

    - replace:
        path: /tmp/fetched/{{ inventory_hostname }}/tmp/somefile
        regexp: "^This is an example string$"
        replace: "{{ inventory_hostname }}"
      delegate_to: localhost
  

Это приводит к повторению:

 PLAY [all] *********************************************************************************************************

TASK [fetch] *******************************************************************************************************
changed: [host1]

TASK [replace] *****************************************************************************************************
changed: [host1 -> localhost]

PLAY RECAP *********************************************************************************************************
host1                      : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
  

И выдает файл /tmp/fetched/host1/tmp/somefile, содержащий:

 foo bar baz
host1
Lorem Ipsum
The quick brown fox jumps over the lazy dog
  

Комментарии:

1. Это выглядит именно так, как я хочу. Но почему путь замены отличается от пути dest в задаче выборки?

2. Поскольку я не использую flat параметр, so Ansible создает папку в качестве той, которую я передаю как dest , создает подпапку с именем хост, а затем использует, чтобы воспроизвести src путь к файлу.