Lineinfile 有時不會取代行

Lineinfile 有時不會取代行

我有 nginx 上游和多個後端。我在劇本中使用pre_tasks在部署期間停用上游配置中的後端:

- 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 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;
    ...

}

預期結果:

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']}}"

相關內容