Ansible에서 이미 Serial을 사용하고 있는 경우 다른 호스트로 팬아웃

Ansible에서 이미 Serial을 사용하고 있는 경우 다른 호스트로 팬아웃

내 애플리케이션을 실행하는 호스트가 80개 이상 있으며, 로드 밸런서를 변경하기 위해 기존 Ansible 플레이북을 업데이트하고 있습니다. 현재 로드 밸런서 설정에서는 AWS CLI를 통해 한 번의 실행으로 로드 밸런서에서 호스트를 추가/제거할 수 있습니다. 그러나 우리는 소수의 자체 호스트에 구성된 로드 밸런서로 전환하고 있으며 ansible을 사용하여 해당 호스트의 텍스트 파일을 조작하여 호스트를 가져오거나 가져올 것입니다. 본질적으로 Serial을 사용하는 동안 플레이북 내의 다른 호스트에 대한 내부 루프가 필요합니다.

직렬: 25%를 사용하여 80개의 호스트에 배포하는 동안 blockinfile그룹의 호스트에 명령을 팬아웃할 수 있도록 플레이북을 구성하는 데 문제가 있습니다.tag_Type_edgetag_Type_app

제가 하고 싶은 일은 다음과 같습니다.

---
- hosts: tag_Type_app
  serial: "25%"
  pre_tasks:

    - name: Gathering ec2 facts
      action: ec2_metadata_facts

    - name: Remove from load balancers
      debug:
        msg: "This is where I'd fan out to multiple different hosts from group tag_Type_edge to manipulate
              text files to remove the 25% of hosts from tag_Type_app from the load balancer"

  tasks:
    - name: Do a bunch of work to upgrade the app on the tag_Type_app machines while out of the load balancer
      debug:
        msg: "deploy new code, restart service"


  post_tasks:
    - name: Put back in load balancer
        debug:
          msg: "This is where I'd fan out to multiple different hosts from group tag_Type_edge to manipulate
                 text files to *add* the 25% of hosts from tag_Type_app back into the load balancer"

tag_Type_edge모든 상자에서 serial: 25%를 사용하는 동안 내부 루프 오버를 허용하려면 어떻게 구성해야 합니까 tag_Type_app?

답변1

Ansible에서는 실제로 한 호스트에서 작업을 실행하지만 다른 호스트를 대신하여 다음과 같은 영리한 기능을 사용해야 할 수 있습니다.대표단. 실제로 문서의 예는 로드 밸런서에서 호스트를 꺼내는 것입니다.

모든 작업과 마찬가지로 일부 호스트 이름의 루프에서 여러 번 실행될 수 있습니다. 재생 루프가 아니라 작업 루프입니다. 예를 들어 뼈대를 채택하면 도움이 됩니다.

---
- name: Example loop over load balancers for each app server
  hosts: tag_Type_app
  serial: "25%"

  pre_tasks:
    - name: Gathering ec2 facts
      action: ec2_metadata_facts

    - name: Remove from load balancers
      debug:
        msg: "Remove app instance {{ inventory_hostname }} from edge node {{ item }}"
      delegate_to: "{{ item }}"
      loop: "{{ query('inventory_hostnames', 'tag_Type_edge') }}"

  tasks:
    - name: Do a bunch of work to upgrade the app on the tag_Type_app machines while out of the load balancer
      debug:
        msg: "deploy new code, restart service"

  post_tasks:
    - name: Put back in load balancer
      debug:
        msg: "Add app instance {{ inventory_hostname }} to edge node {{ item }}"
      delegate_to: "{{ item }}"
      loop: "{{ query('inventory_hostnames', 'tag_Type_edge') }}"

Inventory_hostnames는 인벤토리 패턴을 수행하는 조회 플러그인으로, 어떤 패턴이라도 거기에 들어갈 수 있습니다.

이것에 대해 몇 가지 까다로운 점이 있습니다. "에지" 루프에 오류가 발생하면 "앱" 호스트에 오류가 발생합니다. 일부 에지 호스트의 부분 상태는 활성화되고 일부는 활성화되지 않습니다. 그것을 취소하는 구조 기능이 있는 블록과 같은 일부 철회 메커니즘이 없는 한.

작업 루프로 인해 일부 인벤토리 및 플레이 관련 기능이 적용되지 않습니다. --limit명령줄에서는 Edge 호스트를 더 이상 제한할 수 없습니다 . 일괄 처리하는 데 사용할 수도 없습니다 serial. 이는 이미 진행 중입니다.

또한 최소한 app ✕ edge ✕ 2의 상대적으로 많은 수의 작업을 실행합니다. 약간 느릴 수 있습니다. 포크를 늘려 어느 정도 완화할 수 있습니다.

다중 호스트 로드 밸런서에 단일 제어 평면이 있는 경우 너무 많은 호스트를 건드릴 필요가 없습니다. 앱 서버당 하나의 작업을 수행합니다. 현재로서는 이에 대한 설정이 되어 있지 않을 수도 있지만 고려해야 할 사항이 있습니다.

관련 정보