ссылка задача в зависимости от содержимого - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть 3 задачи.

первая задача проверяет, содержит ли файл <ip> <hostname> pattern

вторая задача добавляет строку, если искомая строка отсутствует.

третье задание исправляет строку, если она плохая.

3 задачи работают независимо друг от друга, но я хочу, чтобы они выполнялись вместе как-то связанными.

У меня есть следующий playbook, использующий в качестве модели / etc / hosts.

---
- name: check hosts playbook
  hosts: centos

  tasks:

  - name: check whether a line in the form of '<ip> <hostname>' exists
    lineinfile:
      path: /var/tmp/hosts
      regexp: '^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s\w+'
      state: absent
    check_mode: true
    register: line_exists

  - name: append_host_file 
    lineinfile:
      path: /var/tmp/hosts
      insertafter: '^(127\.0\.0\.1|)(?:\d{1,3}\.){3}\d{1,3}'
      line: '{{ ansible_default_ipv4.address }} {{ansible_hostname }}'
      backup: yes
    when: not line_exists.changed

  - name: correct_hosts_file
    lineinfile:
     path: /var/tmp/hosts
     regexp: '^(?!{{ ansible_default_ipv4.address }}\s{{ ansible_hostname }})(?:\d{1,3}\.){3}\d{1,3}\s\w+'
     line: '{{ ansible_default_ipv4.address }} {{ansible_hostname }}'
    when: line_exists.changed

Проблема, с которой я сталкиваюсь, заключается в том, что правильная задача выполняется при правильной строке ... поэтому мне нужно использовать какой-то другой вид критериев, чтобы предотвратить ее выполнение при правильной строке в файле.если строка в файле неправильная, она работает, потому что заменяет ее.

1 Ответ

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

Это обычная проблема с lineinfile, она не так полезна, как кажется.

Мой совет: загрузить содержимое файла в переменную (- command: cat /etc/hosts), зарегистрировать его (register: old_hosts), а затем выполнять итерацию по каждой строкеэтой переменной в шаблоне.

- name: get hosts
  command: cat /etc/hosts
  register: old_hosts
- name: write hosts
  template:
  src: hosts.j2
  dest: /etc/hosts

hosts.j2:

{% for line in old_hosts.stdout_lines %}
{% if line (....) %}
  ... 
{% endif %}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...