Lineinfile иногда не заменяет строки

Lineinfile иногда не заменяет строки

У меня есть nginx upstream с несколькими бэкендами. Я использую pre_tasksв playbook для отключения бэкендов в конфигурации upstream во время развертывания:

- name: Deploy
  hosts: '{{ list_hosts }}'
  serial: 4

  pre_tasks:

  - name: Disable hosts in nginx upstream
    replace:
      path: /etc/nginx/conf.d/upstream.conf
      regexp: '^        server {{ LAN }}:'
      line: '        #server {{ LAN }}:5001;'
    delegate_to: "{{ item }}"
    with_items: "{{groups['nginx_api']}}"
...

Работает, но не всегда правильно. Иногда отключает не все 4 хоста (серийный: 4). Думаю, это происходит из-за того, что он пытается заменить 4 строки одновременно.

Можно ли выполнять каждую итерацию по одной и сохранять serial: 4?

Обновлять:

Извините, мой последний тест был сreplace

Добавлено регулярное выражение ^(спасибо @bviktor)

- name: Deploy
  hosts: '{{ list_hosts }}'
  serial: 4

  pre_tasks:

  - name: Disable server in nginx upstream
    lineinfile:
      path: /etc/nginx/conf.d/upstream.conf
      regexp: '^        server {{ LAN }}:5001;'
      line: '        #server {{ LAN }}:5001;'
    delegate_to: "{{ item }}"
    with_items: "{{groups['nginx_api']}}"

В наличии

[nginx_api]
api1 ansible_host=x.x.y.1   LAN=10.x.y.1
api2 ansible_host=x.x.y.2   LAN=10.x.y.2
api3 ansible_host=x.x.y.3   LAN=10.x.y.3
api4 ansible_host=x.x.y.4   LAN=10.x.y.4
[app]
app1 ansible_host=x.x.x.1   LAN=10.x.x.1
app2 ansible_host=x.x.x.2   LAN=10.x.x.2
app3 ansible_host=x.x.x.3   LAN=10.x.x.3
app4 ansible_host=x.x.x.4   LAN=10.x.x.4
app5 ansible_host=x.x.x.5   LAN=10.x.x.5
...

Конфигурация upstream перед запуском:

upstream app {
least_conn;
        server 10.x.x.1:5001;
        server 10.x.x.2:5001;
        server 10.x.x.3:5001;
        server 10.x.x.4:5001;
        server 10.x.x.5:5001;
    ...

}

Конфигурация upstream после запуска:

upstream app {
least_conn;
        server 10.x.x.1:5001;
        #server 10.x.x.2:5001;
        server 10.x.x.3:5001;
        server 10.x.x.4:5001;
        server 10.x.x.5:5001;
    ...

}

Ожидаемый результат:

upstream app {
least_conn;
        #server 10.x.x.1:5001;
        #server 10.x.x.2:5001;
        #server 10.x.x.3:5001;
        #server 10.x.x.4:5001;
        server 10.x.x.5:5001;
    ...

}

Просто когда я запускаю плейбук несколько раз, он отключает 4 необходимых хоста в восходящем потоке

решение1

Вы даете нам очень мало для работы, но в целом это не очень хорошая практика — заменять шаблон чем-то, что является надмножеством такого шаблона. Почему? Потому что при последовательных запусках он будет совпадать снова и снова, так как он включает исходный шаблон. Так что server {{ LAN }}становится #server {{ LAN }}, затем ##server {{ LAN }}, затем ###server {{ LAN }}и так далее. Используйте ^или какой-либо другой шаблон для указания предыдущего шаблона. Например, если вы используете что-то вроде

regexp: '^server {{ LAN }}:'

Он будет соответствовать только в том случае, если строка начинается с server, т. е. ей не предшествует никаких символов , и, следовательно , при последовательном выполнении перед ней #не будет добавлено никаких дополнительных символов.#

решение2

Решение состоит в том, чтобы использоватьдроссель

- name: Deploy
  hosts: '{{ list_hosts }}'
  serial: 4

  pre_tasks:

  - name: Disable server in nginx upstream
    lineinfile:
      path: /etc/nginx/conf.d/upstream.conf
      regexp: '^        server {{ LAN }}:5001;'
      line: '        #server {{ LAN }}:5001;'
    delegate_to: "{{ item }}"
    throttle: 1
    with_items: "{{groups['nginx_api']}}"

Связанный контент