Làm thế nào để truy cập biến chủ của một máy chủ khác với Ansible?


45

Giả sử có một máy chủ thu thập một số dữ liệu và nó nằm trong một nhóm [collectors]. Tôi cũng có chủ nhà trong nhóm [reporters]. Vì vậy, tôi muốn đặt một biến trên các phóng viên từ groups['collectors'][0]địa chỉ IP. Nhưng sổ chơi để thiết lập các phóng viên không chạy theo [collectors]nhóm nên các sự kiện cho máy chủ này không được thu thập. Có cách nào để không mã hóa địa chỉ IP không?

Câu trả lời:


87

Bạn có thể truy cập khá nhiều bất kỳ sự kiện / biến hàng tồn kho nào bằng cách thực hiện một cái gì đó như thế này:

{{ hostvars['foo.example.com']['ansible_eth0']['ipv4']['address'] }}

hoặc, nếu bạn muốn làm điều đó thông qua một chỉ mục thành một nhóm:

{{ hostvars[groups['collectors'][0]]['ansible_eth0']['ipv4']['address'] }}

Thủ thuật lớn là bạn cần thu thập dữ kiện cho tất cả các máy chủ / nhóm bạn quan tâm. Vì vậy, bạn muốn sửa đổi sổ chơi của mình chạy theo nhóm phóng viên để bao gồm một nhiệm vụ không áp dụng (giả) được áp dụng đến nhóm người sưu tầm. Điều đó sẽ khiến Ansible thu thập thông tin về các máy chủ lưu trữ để có thể truy cập chúng từ nhóm phóng viên. Vì vậy, bạn có thể muốn thêm một cái gì đó như thế này vào đầu cuốn sách phóng viên của bạn:

- hosts: collectors
  name: Gather facts from collectors
  tasks: [ ]

Các dấu ngoặc rỗng về cơ bản có nghĩa là sẽ không có tác vụ nào được thực thi, nhưng điều này vẫn sẽ buộc Ansible thu thập các sự kiện về người thu thập để sau đó bạn có thể tham chiếu chúng trong các tác vụ mà bạn chạy với các phóng viên của mình.

Chỉnh sửa số 1

Tôi nhận thấy rằng tôi cũng nên đề cập rằng kể từ phiên bản 1.8 của Ansible, có một tính năng lưu trữ thực tế hiện có sẵn. Bộ nhớ đệm thực tế dựa trên một máy chủ redis để lưu trữ các sự kiện giữa các lần chạy playbook. Khi được bật, một playbook có thể tham chiếu các sự kiện có được từ một playbook khác đã được chạy trước đó. Ví dụ về tài liệu Ansible đưa ra:

Ví dụ, hãy tưởng tượng một cơ sở hạ tầng rất lớn với hàng ngàn máy chủ lưu trữ. Bộ nhớ đệm thực tế có thể được cấu hình để chạy hàng đêm, nhưng cấu hình của một bộ máy chủ nhỏ có thể chạy đặc biệt hoặc định kỳ trong suốt cả ngày. Khi bộ nhớ đệm thực tế được kích hoạt, sẽ không cần thiết phải tấn công vào tất cả các máy chủ để tham khảo các biến và thông tin về chúng.


2
Có cách nào để thiết lập chỉ số kết hợp như một biến không? trong ví dụ ansible localhost --extra-vars "metamorphosis_ip = 172.16.3.73" -a "echo {{hostvars [{{metamorphosis_ip}}] [ 'inv_domain']}}"
corretge

Để thêm vào câu trả lời ở trên, hãy đảm bảo rằng bạn tham khảo Câu hỏi thường gặp về Ansible tại đây: docs.ansible.com/ansible/faq.html giải thích chi tiết mọi thứ, như lặp qua một nhóm máy chủ hoặc đặt biến để nhận máy chủ lưu trữ cụ thể trong một nhóm.
einarc

Cảm ơn bạn đã có ý tưởng tìm nạp các sự kiện từ một nút với danh sách tác vụ trống.
pedz
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.