Как использовать sed для вставки после шаблона условно - PullRequest
0 голосов
/ 06 февраля 2019

Пожалуйста, помогите мне понять более продвинутый синтаксис sed.Насколько я понимаю, я могу использовать две команды sed в одной строке для поиска шаблона и последующей его условной вставки после этого шаблона.вот цель.У меня есть такой файл:

[PATTERN]
String

Мне нужно sed для вставки «String» после [PATTERN], только если «String» не существует.

«String» использует Ansible переменныеи в основном выглядит так:

{{ hostname.droplet.name }} ansible_ssh_host={{ hostname.droplet.ip_address }}

это переводится как

hostname ansible_ssh_host=X.X.X.X

Так что в конечном итоге у меня будет следующий пример реального мира (не концептуальный):

[DROPLETS]
ilovetacos ansible_ssh_host=127.0.0.1

Если под [DROPLETS] нет подходящей строки, добавьте строку.Если конкретная строка имени хоста уже существует, не добавляйте ее снова.

Я могу обработать первую часть:

sed '/\[DROPLETS\]/a STRING' inventory

Теперь вот моя первая проблема.Я не знаю, как обрабатывать переменные внутри команды sed?Возможно, вот так?

sed '/\[DROPLETS\]/a "{{ hostname.droplet.name }} ansible_ssh_host={{ hostname.droplet.ip_address }}"' inventory

Следующая часть - добавить условную проверку.Я думал, что сначала нужно просто выполнить grepe для строки, а затем передать в sed, но, похоже, есть лучший способ сделать все это с помощью одной команды sed.Может кто-нибудь помочь мне с этим более сложным синтаксисом?

Спасибо

1 Ответ

0 голосов
/ 07 февраля 2019

Я до сих пор поддерживаю мой комментарий, что в зависимости от вашего варианта использования, сценарии динамической инвентаризации , вероятно, будет правильным.Тем не менее, , если это так, что строка, которую вы хотите добавить, может существовать только один раз в файле , это может удовлетворить ваши требования:

(благодарность Константину Суворову, как этовключает технику, взятую с его сайта )

- name: Build inventory string
  set_fact:
    inventory_string: "{{ hostname.droplet.name }} ansible_ssh_host={{ hostname.droplet.ip_address }}"
    inventory_file: /tmp/sssd.conf
- name: Add inventory string to inventory file if necessary
  shell: |
    grep "^{{ inventory_string }}" {{ inventory_file }} ||
    sed -i '/\[DROPLETS\]/a {{ inventory_string }}' {{ inventory_file }}
  register: output
  changed_when: output.stdout != inventory_string

Несколько вещей, происходящих в задаче shell:

  • Команда shell определяетдве команды, разделенные ||.Эта конструкция оболочки Unix, в которой говорится, что следующая команда будет выполняться только в том случае, если предыдущая команда не будет выполнена.Затем мы используем grep, чтобы увидеть, существует ли строка.Если grep не удается найти его, то команда sed для его добавления запускается
  • Без указания условия changed_when задача всегда сообщит «Изменено».Мы register выводим из задачи.В случае, если grep найдет вашу строку, stdout будет просто содержать вашу строку, поэтому мы можем проверить ее наличие, чтобы выяснить, была ли запущена команда sed.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...