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

실행 전 업스트림 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']}}"

관련 정보