답변 : 호스트별로 하나의 작업 호스트를 실행하는 방법은 무엇입니까?


15

플레이 레벨에서는 serial: 1한 번에 한 호스트 씩 전체 플레이를 실행할 수 있어야 합니다. 그러나 단일 작업 에서이 작업을 수행하는 간단한 방법을 찾지 못했습니다. 문제의 작업이 어떤 이유로 든 적절한 잠금을 수행하지 않는 경우 특히 관련이 있습니다.

명백한 대답 중 하나는 작업을 자체적으로 수행하는 것입니다. 그러나 그것은 역할에 도움이되지 않습니다. ( serial: 1역할을 해 나가는 것은 실제로 직관적이지 않습니다.)

답변:


11

플레이 북의 단계를 수행 할 때 병렬 처리를 원하지 않으면 포크 레벨을 1로 설정하십시오.

ansible-playbook --forks=1 ...

이 파일을 사용 가능한 cfg 파일에 넣을 수도 있습니다.

[defaults]
forks=1

그러나 개별적으로 원하는 경우 위의 명령 행 옵션을 사용하십시오.

편집하다:

serial: 1완전히 다른 일을합니다. 즉, 각 호스트에 대해 플레이 북을 차례로 실행하여 다음 호스트로 이동하기 전에 전체 플레이 북이 완료되기를 기다리는 것과 같습니다. forks=1즉, 다음 호스트에서 동일한 작업을 실행하기 전에 한 호스트에서 재생중인 첫 번째 작업을 실행하므로 다음 작업을 수행하기 전에 각 호스트에 대해 첫 번째 작업이 실행됩니다.

그래서 당신 forks=1은 단 한 번의 놀이 를 원합니다 . 불행히도 현재 불가능합니다.


2
나는 이것을 전체 플레이 북에서 설정하려고하지 않았습니다. 그것은 비 과립 적입니다. serial: 1최소한 놀이로 설정하도록하겠습니다. 그러나 나는 그것을 놀이의 하위 항목에만 설정하고 싶습니다 (정확한 이름이 무엇이든간에 그것은 "작업"이라고 생각했지만 위의 의견은 동의하지 않는 것 같습니다).
Elrond

3
serial: 1완전히 다른 일을합니다. 즉, 각 호스트에 대해 플레이 북을 차례로 실행하여 다음 호스트로 이동하기 전에 전체 플레이 북이 완료되기를 기다리는 것과 같습니다. forks=1즉 , 다음 호스트 에서 동일한 작업을 실행하기 전에 한 호스트에서 재생중인 첫 번째 작업을 실행하므로 다음 작업을 수행하기 전에 각 호스트에 대해 첫 번째 작업이 실행됩니다. 그래서 당신 forks=1은 단 한 번의 놀이 를 원합니다 . 불행히도 현재 불가능합니다.
wurtel

좋은 지적! 답변에 추가 하시겠습니까?
Elrond

2

이 문제에 대한 해결 방법이 있습니다. 호스트 (또는 그룹) 목록을에 전달한 with_items다음 delegate_to이 목록과 함께 사용할 수 있습니다 . 이런 식으로 작업이 호스트별로 실행됩니다.

예를 들면 다음과 같습니다.

- name: start and enable rabbitmq (run task host by host)
  service:
    name: "rabbitmq-server"
    state: "started"
    enabled: true
  delegate_to: "{{ item }}"
  with_items: "{{ groups['rabbitmq-cluster'] }}"
  run_once: true

run_once: true거기에 궁금해하는 사람들을 위해 그것을 꺼내보십시오. 당신은 무슨 일이 일어나지 않을 것입니다. (너무 많은 반복 실행 aaaahhhh)
Almenon

1

단일 컴퓨터에서 실행하는 경우 둘 이상의 호스트에 대해 독점 잠금 문제가 발생하므로 모든 호스트에 대해 하나씩 실행해야합니다 --forks=1. 예 : ansible-playbook webserver.yml --forks=1webserver.yml의 내부 에는 app01 및 app02 가 있습니다.[webserver]


0

당신이 원하는 것을 생각하십시오

run_once : true


4
nope : "run_once : true"는 호스트 목록에서 정확히 하나의 호스트에 대한 작업을 실행하는 것을 의미합니다. 목록의 각 호스트마다 하나씩 실행하고 싶습니다.
Elrond

0

로컬로 실행할 수있는 명령의 경우 루프를 사용하여 재생중인 모든 호스트를 반복하십시오. 명령을 로컬로 실행할 수있는 경우에만 작동합니다. 키가 설정되어 있으면 이러한 방식으로 ssh를 사용하여 원격 시스템에 명령을 하나씩 실행할 수 있지만 에스컬레이션에 대해 이야기 할 때 어려워집니다.

EG :

- name: Init New Appliances - Remove the known hosts entry for the server in case it has changed
  run_once: yes
  connection: local
  become: no
  command: "ssh-keygen -R {{ item }}"
  with_items:
  - "{{ inventory_hostname }}"

1
이라는 이름의 호스트 대신 호스트 목록 을 제공해야합니다 inventory_hostname. 그렇지 않으면 루프가 의미가 없습니다.
Konstantin Suvorov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.