2015-10-14 14 views
26

Tôi có một Playbook Ansible lớn, nơi hình ảnh Docker được xây dựng khi chạy nó. Tôi đang sử dụng số ngày càng tăng làm thẻ để phiên bản chúng. Hiện tại, tôi phải chỉ định điều này trong mọi phần hosts:.Có thể xác định các biến toàn cầu trong Playbook trong Ansible không?

Tôi biết có các biến toàn cục nhưng từ những gì tôi tìm thấy bằng cách tìm kiếm "biến an toàn" "toàn cầu", chúng phải được xác định bên ngoài sách. Có thể xác định các biến toàn cầu toàn cầu cho playbook không?

Trả lời

11

Nếu thẻ/phiên bản bạn đang sử dụng được áp dụng cho tất cả máy chủ, thì sử dụng group_vars/all là một tùy chọn khả thi.

Nếu số sửa đổi cụ thể cho từng mục lưu trữ trong tệp host_vars/host_name có thể tốt hơn.

Nếu bạn muốn đọc và bắt đầu var và sau đó tăng nó sau mỗi lần phát trở nên khó hơn một chút để duy trì thông tin đó trên các lần phát (hoặc mỗi số lần bạn nói) trong sách. Ví dụ, nếu bạn đang tìm kiếm để triển khai N trường Docker bạn có thể làm một số phép thuật tồn kho năng động như thế này:

- hosts: localhost 
    tasks: 
    - add_host: name=docker_{{item}} groups="dockers,other" tag={{item}} 
    with_sequence: start={{ext_def_start}} count={{ext_def_num}} 


- hosts: dockers 
    tasks: 
    - debug: var=tag 
+0

Tôi muốn có các biến trong Playbook vì tôi có nó trong Git. Sau đó tôi sử dụng để chia sẻ các tập tin kiểm kê với các biến, và phải thích ứng với nó. Tôi muốn các biến trong playbook bởi vì một khi tất cả mọi thứ được thiết lập, chúng không thay đổi, nhưng các host trong kho có thể. – rabejens

+0

Cách xử lý ansible biến là một chút clunky nhưng nó là dễ hiểu vì nó phụ thuộc nặng vào ngầm bao gồm (dựa trên hàng tồn kho) và không có khả năng dễ dàng chia sẻ các biến trên các vở kịch. Như ví dụ của tôi cho thấy, tôi đã sử dụng các mô-đun khoảng không quảng cáo để đẩy dữ liệu vào các khoảng không quảng cáo. Sự thật (xem mô-đun set_fact) tồn tại trên các lần phát nhưng chúng nằm trên cơ sở mỗi máy chủ. Hãy nhớ rằng bạn luôn có thể viết kịch bản nhanh (ví dụ: python) để tạo khoảng không quảng cáo động, bao gồm cả vars và nhóm, trông giống như cách bạn muốn. – Petro026

+0

Tôi đã nghĩ về một cái gì đó như thế này (viết một kịch bản tạo ra một hàng tồn kho) của bản thân mình, tôi nghĩ rằng tôi sẽ làm điều đó.Playbook dành cho việc thiết lập một cụm Hadoop cơ bản với hỗ trợ Spark/YARN, cơ sở dữ liệu Cassandra và Zeppelin, và tôi có thể viết một kịch bản lệnh đầu tiên yêu cầu người dùng liệt kê tất cả các máy chủ và sau đó đặt máy chủ lưu trữ dịch vụ nào. – rabejens

10

Ansible có nhóm all mặc định, vui vẻ đủ, chứa tất cả các máy chủ trong tệp khoảng không quảng cáo.

Như vậy bạn có thể làm như thế với bất kỳ nhóm máy chủ nào và cung cấp group_vars cho nhóm lưu trữ.

Như được hiển thị trong liên kết trước, chúng có thể được xác định trực tiếp trong tệp kiểm kê hoặc chúng có thể được chứa trong một tệp riêng biệt được đặt tên theo nhóm trong thư mục group_vars ở cùng cấp thư mục với tệp khoảng không quảng cáo.

Một ví dụ cấu trúc thư mục sau đó có thể giống như thế:

-ansible 
|--inventory 
| |--group_vars 
| | |--all 
| | |--dev 
| | |--test 
| | |--prod 
| | |--webservers 
| | |--databases 
| |--dev 
| |--test 
| |--prod 
|--roles 
    ... 

của bạn tập tin tồn kho dev sau đó có thể giống như thế:

[dev:children] 
webservers 
databases 

[webservers] 
web1.dev 
web2.dev 

[databases] 
database-master.dev 
database-slave.dev 

Tất cả những host bây giờ sẽ nhận bất kỳ cấu hình vào máy cụ thể (có thể được xác định bằng dòng hoặc, giống như với group_vars có thể được đưa vào một thư mục host_vars) và cũng cấu hình cho các nhóm cụ thể mà chúng đang ở như và sau đó các nhóm họ cũng kế thừa từ như dev b ut cũng theo mặc định, all.

Điều này sau đó có thể được sử dụng để định cấu hình mọi thứ theo cách thô hơn mỗi máy chủ lưu trữ.

Mọi thứ như máy chủ NTP có thể muốn được xác định trong khi máy chủ DNS có thể muốn được xác định ở cấp môi trường (nếu mạng của bạn được phân đoạn thành dev, kiểm tra và sản xuất có thể cần cài đặt máy chủ DNS khác nhau trong /etc/resolv.conf) trong khi các loại máy chủ khác nhau có thể có cấu hình khác nhau xung quanh những thứ như danh sách các gói sẽ được cài đặt. Cuối cùng, một số điều có thể cần phải được lưu trữ cụ thể như thiết lập máy chủ MySQL id trong một nhóm nhân rộng.

Nếu, thay vào đó, bạn chỉ muốn xác định cài đặt toàn cầu playbook chứ không phải qua hàng tồn kho (và như vậy có thể được truy cập bởi playbooks khác) sau đó bạn chỉ cần một khối vars trong định nghĩa play bạn như vậy:

- hosts: webservers 
    vars: 
    http_port: 80 
    tasks: 
    - name: Task1 to be ran against all the webservers 
     ... 

Như đã đề cập trước đó, bạn luôn có thể sử dụng nhóm all đây quá:

- hosts: all 
    vars: 
    ntp_pool: 
     - ntp1.domain 
     - ntp2.domain 
    tasks: 
    - name: Task1 to be ran against all the servers 
     ... 

Nhìn chung, mặc dù tôi rất muốn giới thiệu sử dụng vai trò cấu trúc điều gì đang chạy chống h nhất định osts và sau đó sử dụng hàng tồn kho để giải thích máy chủ là loại gì và sau đó sử dụng một thư mục group_vars ở cấp khoảng không quảng cáo để chứa tất cả các biến cho các nhóm máy chủ đó. Làm mọi thứ theo cách này sẽ giúp bạn giữ mọi thứ ở những nơi hợp lý và cho phép bạn dễ dàng sử dụng lại cơ sở mã của mình.

+0

Hmm, đặt một '[{host: 'tất cả', vars: {kiểm tra: 'hello'}}, {hosts: 'web': roles: [...]} 'Khi tôi nhận được vai trò sau giai đoạn thiết lập trên 'tất cả', tôi vẫn nhận được' một biến không phải là undefined.' lỗi: ( – ThorSummoner

+0

@ThorSummoner Tôi cũng nhận được điều đó. Tôi nghĩ rằng các biến đó chỉ hợp lệ cho một nhiệm vụ được gọi bên trong nhóm máy chủ đó. –

+0

Nếu bạn quan tâm, tôi sẽ viết giải pháp của tôi. –

0

Vâng, vars toàn cầu có thể xảy ra như thế này,

mẫu thiết lập Splunk playbook

splunk/ 
    setup_splunk_playbook.yaml 
    roles/base 
      /tasks/main.yaml 
      /tasks/install.yaml 
     search_head 
      /tasks/configure.yaml 
     indexer 
      /tasks/configure.yaml 
     some_other_role 
      /tasks/some_task.yaml 
    hosts 
    config.yaml 

Đặt vars của bạn vào config.yaml

mèo Splunk/config.yaml

--- 
# global Splunk variables 
splunk_version: 7.0.0 

trong playbook của bạn, bao gồm vai trò

mèo setup_splunk_playbook.yaml

- hosts: "search_heads" 
    become_user: root 
    become: true 
    gather_facts: true 

    roles: 
    - base 
    - search_head 

trong Vai trò của bạn, bao gồm các Vars toàn cầu trong một nhiệm vụ

vai trò mèo/base/tasks/main.yaml

--- 
# install Splunk Base 

- name: include vars 
    include_vars: "{{ playbook_dir }}/config.yaml" 

- include: install.yaml 

vars có thể truy cập vào các nhiệm vụ hiện nay, vai trò

mèo/cơ sở/nhiệm vụ/install.yaml

- name: echo version 
    debug: splunk version is {{ splunk_version }} 
+0

Không hoạt động để sử dụng các biến trong thuộc tính "hosts:". – hakre

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