Lineinfile が行を置き換えないことがある

Lineinfile が行を置き換えないことがある

pre_tasks複数のバックエンドを持つ nginx アップストリームがあります。デプロイメント中にアップストリーム構成でバックエンドを無効にするためにプレイブックで使用します:

- 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 つの回線を同時に置き換えようとするため発生するものだと思います。

各反復を 1 つずつ実行して保持することは可能ですか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
...

実行前のアップストリーム conf:

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

}

実行後のアップストリーム conf:

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

関連情報