Ansible: Làm thế nào để chạy một Máy chủ nhiệm vụ bằng Máy chủ?


14

Ở cấp độ chơi, chúng tôi phải serial: 1cho phép chúng tôi chạy toàn bộ một máy chủ lưu trữ cùng một lúc. Nhưng tôi đã không tìm thấy một cách đơn giản để làm điều này trên một nhiệm vụ duy nhất. Điều này đặc biệt có liên quan, nếu tác vụ được đề cập không thực hiện khóa thích hợp (vì bất kỳ lý do gì).

Một câu trả lời rõ ràng là đặt nhiệm vụ trong trò chơi riêng của mình. Nhưng điều đó không giúp ích gì cho vai trò. (Phải đưa serial: 1vào vở kịch bằng cách sử dụng vai trò không thực sự trực quan.)

Câu trả lời:


10

Nếu bạn không muốn có bất kỳ sự song song nào trong việc thực hiện các bước trong sổ chơi của mình, hãy đặt cấp độ ngã ba thành 1:

ansible-playbook --forks=1 ...

Bạn cũng có thể đặt nó trong tệp cfg ansible của bạn:

[defaults]
forks=1

nhưng nếu bạn muốn nó trên cơ sở cá nhân, hãy sử dụng tùy chọn dòng lệnh ở trên.

BIÊN TẬP:

serial: 1thực hiện một cái gì đó hoàn toàn khác: giống như chạy lần lượt playbook cho từng máy chủ, chờ hoàn thành playbook hoàn chỉnh trước khi chuyển sang máy chủ tiếp theo. forks=1có nghĩa là chạy tác vụ đầu tiên trong một lần phát trên một máy chủ trước khi chạy cùng một tác vụ trên máy chủ tiếp theo, do đó, nhiệm vụ đầu tiên sẽ được chạy cho mỗi máy chủ trước khi tác vụ tiếp theo được chạm vào.

Vì vậy, bạn muốn forks=1cho chỉ một lần chơi; tiếc là hiện tại không thể.


2
Tôi đã không tìm cách thiết lập điều này trên toàn bộ một cuốn sách. Đó là nhiều để không hạt. serial: 1hãy để tôi đặt nó trên một vở kịch ít nhất Nhưng tôi chỉ muốn đặt nó trên một phần phụ của một vở kịch (tên chính xác của nó là gì. Tôi nghĩ, đó là "nhiệm vụ", nhưng bình luận ở trên dường như không đồng ý).
Elrond

3
serial: 1thực hiện một cái gì đó hoàn toàn khác: giống như chạy lần lượt playbook cho từng máy chủ, chờ hoàn thành playbook hoàn chỉnh trước khi chuyển sang máy chủ tiếp theo. forks=1có nghĩa là chạy tác vụ đầu tiên trong một lần phát trên một máy chủ trước khi chạy cùng một tác vụ trên máy chủ tiếp theo, do đó, tác vụ đầu tiên sẽ được chạy cho mỗi máy chủ trước khi tác vụ tiếp theo được chạm vào. Vì vậy, bạn muốn forks=1cho chỉ một lần chơi; tiếc là hiện tại không thể.
wurtel

Điểm tốt! Bạn có phiền thêm câu đó vào câu trả lời không?
Elrond

1

Nếu bạn đang thực thi nó trên một máy duy nhất, thì sẽ xảy ra sự cố khóa độc quyền cho nhiều máy chủ. Vì vậy, bạn nên thực hiện từng cái một cho tất cả các máy chủ. Điều này bạn cần phải --forks=1được đặt khi gọi lệnh playbook ansible. Ví dụ hay: ansible-playbook webserver.yml --forks=1nơi webserver.yml có app01 và app02 bên trong của bạn[webserver]


1

Có một cách giải quyết cho vấn đề này - người ta có thể chuyển danh sách máy chủ (hoặc một nhóm) sang with_items, sau đó sử dụng delegate_tovới danh sách này. Nhiệm vụ theo cách này sẽ được thực hiện bởi máy chủ.

Ví dụ:

- 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

Đối với những người tự hỏi tại sao run_once: truecó trong đó, hãy thử lấy nó ra. Bạn sẽ không thích những gì xảy ra. (rất nhiều lần chạy lặp đi lặp lại aaaahhhh)
Almenon

0

Hãy nghĩ những gì bạn muốn là

run_once: đúng


4
nope: "run_once: true" có nghĩa là chạy tác vụ cho chính xác một máy chủ trong danh sách máy chủ. Tôi muốn chạy nó cho từng máy chủ trong danh sách, nhưng lần lượt từng cái một.
Elrond

0

Đối với các lệnh có thể chạy cục bộ, sử dụng vòng lặp để lặp lại tất cả các máy chủ trong khi phát. CHỈ này hoạt động nếu lệnh có thể được chạy cục bộ. Bạn cũng có thể chạy một lệnh với ssh trong các máy từ xa theo cách này, nếu các phím được thiết lập, nhưng nó trở nên khó khăn khi nói về sự leo thang.

VÍ DỤ:

- 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
Bạn phải cung cấp một danh sách các máy chủ thay vì chỉ trên máy chủ có tên inventory_hostname, nếu không vòng lặp không có ý nghĩa.
Konstantin Suvorov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.