
У меня есть 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']}}"