Ansible: một máy chủ xuất hiện trong nhiều nhóm và cả hai nhóm có cùng nhiệm vụ trong đó; cách nào để chạy nhiệm vụ một lần?


9

Tôi có một cuốn sách trông giống như thế này:

---
- hosts: group1
  roles:
    - role1
    - role2

- hosts: group2
  roles:
    - role2
    - role3

Bây giờ hãy nói rằng tôi có một tệp lưu trữ có một mục như thế này:

[group1]
host1.example.com

[group2]
host1.example.com

Ansible sẽ chạy các tác vụ trong vai trò TWICE cho host1.example.com vì nó xuất hiện trong 2 nhóm và mỗi nhóm có vai trò 2 được gán cho chúng.

Làm thế nào tôi có thể khiến Ansible nhận ra nó có vai trò tương tự bao gồm hai lần, và do đó nó chỉ nên chạy một lần?


Sẽ là tốt hơn để cung cấp cho chúng tôi các ví dụ thực tế thay vì "vai trò 1", "vai trò 2", v.v., bởi vì có lẽ bạn nên làm điều đó khác đi. Nhưng nó phụ thuộc vào những gì bạn đang thực sự cố gắng để đạt được.
Antonis Christofides

Câu trả lời:


10

Như đã đề cập, đây là do thiết kế. Ansible thực hiện chỉ một lần chơi một lần. Playbook của bạn bao gồm hai lượt (hai mục trong danh sách YAML cấp gốc được xác định bởi tệp playbook). Vở kịch đầu tiên áp dụng vai trò 1 và vai trò 2 cho nhóm1. Vở kịch đó thực thi đầu tiên và chỉ khi nó kết thúc, vở kịch thứ hai mới bắt đầu. Nhưng Ansible không cố gắng hợp nhất các vở kịch với nhau một cách hợp lý. Rốt cuộc, bạn thực sự có thể muốn các tác vụ trong vai trò 2 chạy hai lần.

Để giải quyết vấn đề, có một vài cách bạn có thể giải quyết vấn đề này, và cách bạn chọn sẽ phụ thuộc vào chi tiết của các nhóm và vai trò.

Nếu tất cả các nhiệm vụ trong vai trò 2 là tạm thời, nghĩa là nếu chúng có thể được chạy nhiều lần và kết quả giống nhau mỗi lần, thì tất cả những gì bạn thực sự mất là thời gian và không sao để các vai trò lặp lại. Nếu các vai trò mất nhiều thời gian để áp dụng hoặc nếu bạn không thể thực hiện được, thì hãy xem xét các ý tưởng sau:


Bạn có thể chia playbook thành ba lần và áp dụng riêng từng vai trò:

---
- hosts: group1
  roles:
    - role1

- hosts: group1:group2
  roles:
    - role2

- hosts: group2
  roles:
    - role3

Hoặc nếu vai trò của bạn cần được nhóm lại với nhau, bạn có thể tạo nhóm thứ ba cho các máy chủ cần cả ba vai trò. Bạn không cần phải đưa họ ra khỏi hai nhóm khác. Bạn có thể tạo nhóm trong tệp kho của bạn như thế này:

[group1and2:children]
group1
group2

Sau đó, trong sổ chơi của bạn, bạn có thể lại chia thành ba lần chơi, nhưng sử dụng nhóm thứ ba để tránh các vai trò chạy lại:

---
- hosts: group1:!group1and2
  roles:
    - role1
    - role2

 - hosts: group1and2
   roles:
     - role1
     - role2
     - role3

 - hosts: group2:!group1and2
   roles:
     - role2
     - role3

Điều đó khá xấu nhưng nó có thể hữu ích trong một số trường hợp.


Cảm ơn, tôi nghĩ rằng tôi sẽ đi với một biến thể của tùy chọn (2) - Tôi sẽ làm cho các nhóm và vai trò của mình chi tiết hơn để nhóm các máy chủ của tôi lại với nhau.
Asfand Qazi

Nếu tôi gọi máy chủ thông qua biến là {{host1}} và {{host2}}, làm thế nào tôi có thể đặt chúng lại với nhau?
BMW

Nếu bạn tìm kiếm phần tài liệu: Các mẫu phổ biến
Sahap Asci

3

Đây là do thiết kế. Cách duy nhất để đi là chỉ áp dụng vai trò 2 trong một vở kịch cho một nhóm cụ thể và không sử dụng vai trò 2 trong bất kỳ vở kịch nào khác trên một nhóm có thể có các thành viên chung, như ở đây.

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.