2015-10-19 17 views
38

Đây là một đoạn của một cuốn mà tôi đang sử dụng (server.yml):Override host biến Ansible playbook từ dòng lệnh

- name: Determine Remote User 
    hosts: web 
    gather_facts: false 
    roles: 
    - { role: remote-user, tags: [remote-user, always] } 

tập tin host của tôi có nhiều nhóm khác nhau của máy chủ, ví dụ

[web] 
x.x.x.x 

[droplets] 
x.x.x.x 

Bây giờ tôi muốn thực hiện ansible-playbook -i hosts/<env> server.yml và ghi đè hosts: web từ server.yml để chạy playbook này cho [droplets].

Tôi chỉ có thể ghi đè dưới dạng một lần tắt mà không cần chỉnh sửa trực tiếp server.yml?

Cảm ơn.

Trả lời

50

Tôi không nghĩ Ansible cung cấp tính năng này, mà nó cần. Dưới đây là một cái gì đó mà bạn có thể làm:

hosts: "{{ variable_host | default('web') }}"

và bạn có thể vượt qua variable_host từ một trong hai dòng lệnh hoặc từ một tập tin vars, ví dụ:

ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)" 
+2

Yêu cầu hiệu chỉnh nhỏ. Nó phải là 'host: '{{variable_host | default (' web ')}}" ' – SPM

+0

oh yeah, xấu của tôi. Cảm ơn bạn đã chỉ ra :) – wallydrag

+10

Đây là một lưu ý rằng tôi cảm thấy sẽ hoàn thành câu trả lời cho người mới ansible tìm kiếm giải pháp này: Ví dụ: 'ansible-playbook server.yml --extra-vars" variable_host = newtarget (s) "' – Frobbit

2

Nếu bạn muốn chạy một tác vụ được liên kết với máy chủ lưu trữ, nhưng trên máy chủ khác, bạn nên thử delegate_to.

Trong trường hợp của bạn, bạn nên uỷ thác cho localhost của bạn (ansible thạc sĩ) và gọi ansible-playbook lệnh

25

Đối với bất cứ ai có thể đi tìm kiếm các giải pháp .
Chơi Sách

- hosts: '{{ host }}' 
    tasks: 
    - debug: msg="Host is {{ ansible_fqdn }}" 

Inventory

[web] 
x.x.x.x 

[droplets] 
x.x.x.x 

Command:ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets" Vì vậy, bạn có thể chỉ định tên nhóm trong ngoài vars

+0

FYI, đây sẽ là câu trả lời đúng. – OzNetNerd

4

Đây là hơi muộn , nhưng tôi nghĩ bạn có thể sử dụng --limit or -l lệnh để giới hạn mẫu cho các máy chủ cụ thể hơn. (Phiên bản 2.3.2.0)

Bạn có thể có - hosts: all (or group) tasks: - some_task

và sau đó ansible-playbook playbook.yml -l some_more_strict_host_or_pattern và sử dụng --list-hosts cờ để xem trên mà chủ cấu hình này sẽ được áp dụng.

+2

Tôi rất mới để ansible nhưng tôi xem xét đây là một giải pháp rất hiệu quả, nhỏ gọn hơn nhiều so với những người khác. Tại sao nó lại bị downvoted? –

+1

Điều này rất nguy hiểm. Trong trường hợp người ta quên 'giới hạn' danh sách các máy chủ bị ảnh hưởng, sách bài tập có thể gây ra nhiều thiệt hại. –

+0

Tôi thấy rằng việc sử dụng '--extra-vars 'variable_host = newtarget (s)" 'giống như giải pháp được chấp nhận là nguy hiểm và một giải pháp phức tạp hơn. Nó sử dụng một máy chủ mặc định của 'web' có thể được áp dụng ở đây thay vì' all'. Bạn có thể sử dụng nhóm máy chủ nghiêm ngặt làm mặc định để tránh nhầm lẫn và sử dụng cờ '--list-hosts' để hiểu rõ về máy chủ nào bạn đang tác động. –

Các vấn đề liên quan