2015-10-14 18 views
8

Tôi muốn viết một sổ tay bootstrapper cho các máy mới trong Ansible sẽ cấu hình lại các thiết lập mạng. Tại thời điểm các máy đích thực thi đầu tiên sẽ có địa chỉ được gán DHCP.Làm thế nào để nhắc người dùng cho một máy chủ mục tiêu trong Ansible?

Người dùng được yêu cầu thực thi playbook biết địa chỉ IP được chỉ định của máy mới. Tôi muốn nhắc người dùng là giá trị.

vars_prompt mô-đun cho phép nhận dữ liệu nhập từ người dùng, tuy nhiên nó được xác định trong phần hosts ngăn chặn hiệu quả địa chỉ máy chủ làm giá trị bắt buộc.

Có thể không sử dụng tập lệnh trình bao bọc sửa đổi tệp khoảng không quảng cáo không?

Trả lời

13

Cách đúng để thực hiện việc này là tạo máy chủ động với add_host và pl ace nó trong một nhóm mới, sau đó bắt đầu một vở kịch mới nhắm mục tiêu nhóm đó. Bằng cách đó, nếu bạn có các vars kết nối khác cần được đặt trước thời hạn (thông tin đăng nhập/khóa/v.v.), bạn có thể đặt chúng trên một nhóm trống trong khoảng không quảng cáo, sau đó thêm máy chủ lưu trữ vào động. Ví dụ:

- hosts: localhost 
    gather_facts: no 
    vars_prompt: 
    - name: target_host 
    prompt: please enter the target host IP 
    private: no 
    tasks: 
    - add_host: 
     name: "{{ target_host }}" 
     groups: dynamically_created_hosts 

- hosts: dynamically_created_hosts 
    tasks: 
    - debug: msg="do things on target host here" 
4

Thay vào đó, bạn có thể vượt qua nó bằng extra-vars.

Đơn giản chỉ cần làm cho phần hosts bạn một biến như {{ hosts_prompt }} và sau đó vượt qua chủ nhà trên dòng lệnh như sau:

ansible-playbook -i inventory/environment playbook.yml --extra-vars "hosts_prompt=192.168.1.10" 

Hoặc nếu bạn đang sử dụng default inventory file location của /etc/ansible/hosts bạn chỉ có thể sử dụng:

ansible-playbook playbook.yml --extra-vars "hosts_prompt=192.168.1.10" 
+1

Lệnh 'phần hàng tồn kho/environment' chỉ là một ví dụ (như với' playbook.yml').Nếu bạn không cung cấp một tập tin kiểm kê với '-i' thì Ansible sẽ đơn giản lấy tập tin lưu trữ mặc định'/etc/ansible/hosts' mà không bình thường những gì bạn muốn ngay cả khi bạn chỉ định các host bằng 'extra- vars' – ydaetskcoR

+1

Đó là một ví dụ về cách vượt qua 'thêm vars', không phải là" đây là dòng chính xác bạn cần phải nhập ". Và một khoảng không quảng cáo _is_ một đối số cần thiết, nó chỉ mặc định là '/ etc/ansible/hosts' và nếu tệp đó không tồn tại thì nó sẽ thất bại. – ydaetskcoR

+1

@techraf: Các chỉnh sửa được đề xuất của bạn đã bị từ chối trong hàng đợi đánh giá. ydaetskcoR không có gì để làm với điều đó. Các chỉnh sửa như thế đơn giản là không được chấp nhận trên SO. Vì câu trả lời này _does_ hiện đang cung cấp câu trả lời cho bạn, bạn thực sự nên chấp nhận nó, vì lợi ích của khách truy cập trong tương lai. – Cerbrus

1

Tuyên bố từ chối trách nhiệm: The accepted answer cung cấp giải pháp tốt nhất cho sự cố. Trong khi điều này đang làm việc nó được dựa trên một hack và tôi để nó như là một tài liệu tham khảo.

tôi phát hiện ra nó đã có thể sử dụng một hiện cung cấp tài liệu hack (tín dụng để Bruce P đã chỉ cho tôi đến bưu điện) có thể biến giá trị của -i/--inventory tham số vào một danh sách quảng cáo hoc vạn quân (reference). Chỉ với tên máy chủ/địa chỉ ip và một dấu cách (như dưới đây) nó đề cập đến một máy chủ duy nhất mà không cần tệp tồn kho tồn tại.

Command:

ansible-playbook -i "192.168.1.21," playbook.yml 

Và theo đó playbook.yml có thể chạy chống lại tất cả các host (mà trong ví dụ trên sẽ bằng một máy chủ duy nhất 192.168.1.21):

- hosts: all 

Danh sách này có thể chứa nhiều nhiều địa chỉ ip -i "192.168.1.21,192.168.1.22"

+2

Tôi không thích cách tiếp cận này bởi vì nếu ai đó chạy sách vở mà không có thông số do nhầm lẫn thì ** địa ngục bị ngắt **. – sorin

1

Thêm vào câu trả lời của Matt cho nhiều máy chủ.

dụ đầu vào sẽ là 192.0.2.10,192.0.2.11

- hosts: localhost 
    gather_facts: no 
    vars_prompt: 
    - name: target_host 
    prompt: please enter the target host IP 
    private: no 
    tasks: 
    - add_host: 
     name: "{{ item }}" 
     groups: dynamically_created_hosts 
     with_items: "{{ target_host.split(',') }}" 


- hosts: dynamically_created_hosts 
    tasks: 
    - debug: msg="do things on target host here" 
Các vấn đề liên quan