2015-03-01 19 views
8

Tôi đã có một playbook bao gồm và các thẻ vai trò khác nhau:Ansible - Default/Explicit Thẻ

- name: base 
    hosts: "{{ host | default('localhost') }}" 

roles: 

    - { role: apt,    tags: [ 'base', 'apt', 'ubuntu']} 
    - { role: homebrew,   tags: [ 'base', 'homebrew', osx' ]} 
    - { role: base16,   tags: [ 'base', 'base16', 'osx' ]} 
    - { role: nodejs,   tags: [ 'base', 'nodejs' ]} 
    - { role: tmux,    tags: [ 'base', 'tmux' ]} 
    - { role: vim,    tags: [ 'base', 'vim' ]} 
    - { role: virtualenv,  tags: [ 'base', virtualenv', 'python' ]} 
    - { role: homebrew_cask, tags: [ 'desktop', 'homebrew_cask', osx' ]} 
    - { role: gnome_terminator, tags: [ 'desktop', 'gnome_terminator', ubuntu' ]} 

Hầu hết các nhiệm vụ đang sử dụng khi khoản để xác định hệ điều hành họ nên chạy trên, ví dụ:

- name: install base packages 
    when: ansible_distribution == 'MacOSX' 
    sudo: no 
    homebrew: 
    name: "{{ item.name }}" 
    state: latest 
    install_options: "{{ item.install_options|default() }}" 
    with_items: homebrew_packages 

Nếu tôi chạy ansible-playbook base.yml mà không chỉ định bất kỳ thẻ nào, tất cả tác vụ sẽ chạy. Nếu tôi chỉ định thẻ, ví dụ: ansible-playbook base.yml --tags='base', chỉ các vai trò được gắn thẻ với base run.

Theo mặc định (nếu không có thẻ nào được chỉ định), tôi chỉ muốn chạy các vai được gắn thẻ với 'base'không các vai được gắn thẻ với 'desktop'. Nó cũng sẽ thực sự tốt đẹp để thiết lập một thẻ 'os' mặc định, dựa trên hệ điều hành hiện tại, để tránh bao gồm tất cả các nhiệm vụ cho ubuntu khi tôi đang chạy playbook trên OSX (và ngược lại) .

Bất kỳ ý tưởng nào nếu điều này là có thể và cách tôi có thể làm điều đó?

Trả lời

4

Rất tiếc, không có tính năng nào như vậy. Xử lý thẻ trong Ansible hiện thời rất hạn chế. Bạn không thể đặt thẻ mặc định và bạn không thể loại trừ thẻ theo mặc định.

Có một số chủ đề trong nhóm người dùng Google và các yêu cầu tính năng về github về vấn đề này. Nhưng chưa có kết quả. Câu trả lời chung cho đến nay là, bạn nên tạo một kịch bản shell và đặt nó ở phía trước của playbook của bạn. Tập lệnh này sau đó có thể đặt --tags--skip-tags cho phù hợp với nhu cầu của bạn. Rất khó chịu nhưng theo như tôi biết là lựa chọn duy nhất ngay bây giờ.

2

Nếu tôi chạy ansible-playbook base.yml mà không chỉ định bất kỳ thẻ nào, tất cả tác vụ sẽ chạy.

Có, điều này rất nguy hiểm. Nếu bạn quên thêm '--tags = xxxxx', nó có thể chạy các tác vụ không mong muốn ...

Có một cách giải quyết, nó khó chịu, nhưng nó sẽ ngăn chạy Tác vụ của bạn khi không có thẻ trong dòng lệnh.

Bạn có thể sử dụng --extra-vars và sử dụng nó trong playbook của bạn, sau đó chạy:

ansible-playbook base.yml -e'SOMEVAR=TRUE' 

Và trong playbook của bạn:

- hosts: localhost 
    tasks: 
    - name: some task 
    ping: 
    tags: 
     - sometag 

    - name: Register SOMEVARANS 
    set_fact: SOMEVARANS={{SOMEVAR | default('False')}} 
    tags: 
     - every_tag_you_know_since_there_is_no_ALL_option 
     - sometag 

    - debug: msg="{{SOMEVARANS}}" 
    tags: 
     - every_tag_you_know_since_there_is_no_ALL_option 
     - sometag 

    - debug: msg="run only with extravars SOMEVAR=True" 
    when: SOMEVARANS 
    tags: 
     - every_tag_you_know_since_there_is_no_ALL_option 
     - sometag 

Kết quả:

$ ansible-playbook -i /subsystem/ansible/etc/inventory-qa.ini tags.yml 

PLAY [localhost] ************************************************************** 

TASK: [some task] ************************************************************* 
ok: [localhost] 

TASK: [Register SOMEVARANS] *************************************************** 
ok: [localhost] 

TASK: [debug msg="{{SOMEVARANS}}"] ******************************************** 
ok: [localhost] => { 
    "msg": "False" 
} 

TASK: [debug msg="run only with extravars SOMEVAR=True"] ********************** 
skipping: [localhost] 

PLAY RECAP ******************************************************************** 
localhost     : ok=3 changed=0 unreachable=0 failed=0 



WITH 'SOMEVAR=True' 
    $ ansible-playbook -i /subsystem/ansible/etc/inventory-qa.ini tags.yml -e 'SOMEVAR=True' 

    PLAY [localhost] ************************************************************** 

    TASK: [some task] ************************************************************* 
    ok: [localhost] 

    TASK: [Register SOMEVARANS] *************************************************** 
    ok: [localhost] 

    TASK: [debug msg="{{SOMEVARANS}}"] ******************************************** 
    ok: [localhost] => { 
     "msg": "True" 
    } 

    TASK: [debug msg="run only with extravars SOMEVAR=True"] ********************** 
    ok: [localhost] => { 
     "msg": "run only with extravars SOMEVAR=True" 
    } 

    PLAY RECAP ******************************************************************** 
    localhost     : ok=4 changed=0 unreachable=0 failed=0 


ALL IN ONE :) 
$ ansible-playbook -i /subsystem/ansible/etc/inventory-qa.ini tags.yml -e 'SOMEVAR=True' --tags=sometag 

PLAY [localhost] ************************************************************** 

TASK: [some task] ************************************************************* 
ok: [localhost] 

TASK: [Register SOMEVARANS] *************************************************** 
ok: [localhost] 

TASK: [debug msg="{{SOMEVARANS}}"] ******************************************** 
ok: [localhost] => { 
    "msg": "True" 
} 

TASK: [debug msg="run only with extravars SOMEVAR=True"] ********************** 
ok: [localhost] => { 
    "msg": "run only with extravars SOMEVAR=True" 
} 

PLAY RECAP ******************************************************************** 
localhost     : ok=4 changed=0 unreachable=0 failed=0 
2

Tôi sử dụng ghi đè biến dòng lệnh (-e) để đạt được điều này:

$ ansible-playbook playbook.xml -e desktop=true 

Thay vì xác định desktop làm thẻ, thay vào đó, thẻ có thể được định nghĩa là biến có giá trị mặc định là false. Sau đó, đối với các vai trò yêu cầu desktop là đúng, hãy thay thế thẻ bằng mệnh đề when.Sách bài được đăng trong câu hỏi có thể được viết lại như thế này:

- name: base 
    hosts: "{{ host | default('localhost') }}" 

    # default value to prevent errors when not overridden 
    vars: 
    desktop: false 

    roles: 

    # no change to "base" roles 
    - { role: apt, tags: [ 'base', 'apt', 'ubuntu'] } 
    # ... 

    # "desktop" roles get a "when" clause 
    - role: homebrew_cask 
     when: desktop | bool 
     tags: [ 'homebrew_cask', 'osx' ] 
    - role: gnome_terminator 
     when: desktop | bool 
     tags: [ 'gnome_terminator', ubuntu' ] 

Đây có lẽ chỉ là một phiên bản đơn giản của một trong các câu trả lời hiện có. Như đã nêu ở nơi khác, các thẻ không phải là câu trả lời vào lúc này để mặc định một số hành động không chạy trừ khi có điều gì đó được chỉ định rõ ràng. Các biến, mặt khác, là hoàn hảo cho việc này.

1

Có 3 từ khóa đặc biệt khác cho thẻ, ‘được gắn thẻ’, ‘không được gắn thẻ’ và ‘tất cả’, chỉ chạy được gắn thẻ, không được gắn thẻ và tất cả các tác vụ tương ứng. Theo mặc định, ansible chạy như thể ‘–tags all’ đã được chỉ định.

Bạn có thể kiểm tra các tài liệu ở đây: http://docs.ansible.com/ansible/playbooks_tags.html#special-tags

0

Lý do để sử dụng mặc định thường là: Tôi muốn gõ như ít càng tốt trong trường hợp sử dụng phổ biến nhất của tôi. Vì vậy, tôi nghĩ rằng những gì OP thực sự muốn là:

Có cách nào để chạy tác vụ 'cơ sở' với ít đối số nhất có thể.

Như những người khác đã chỉ ra, không có thẻ "mặc định" trong ansible. Nhưng luôn có nhiều cách.

cách đầu tiên chỉ được sử dụng kịch bản để bọc nó, giống như viết một run.sh như thế này:

ansible-playbook -t base base.yml 

Nó là ngắn hơn nhiều để gõ ./run.sh thay vì lệnh đầy đủ.

Cách thứ hai là dành cho những người đang tìm kiếm giải pháp an toàn thuần khiết. Bạn có thể có hai playbooks như:

base.yml

- { role: apt,    tags: [ 'base', 'apt', 'ubuntu']} 
- { role: homebrew,   tags: [ 'base', 'homebrew', osx' ]} 
- { role: base16,   tags: [ 'base', 'base16', 'osx' ]} 
- { role: nodejs,   tags: [ 'base', 'nodejs' ]} 
- { role: tmux,    tags: [ 'base', 'tmux' ]} 
- { role: vim,    tags: [ 'base', 'vim' ]} 
- { role: virtualenv,  tags: [ 'base', virtualenv', 'python' ]} 

desktop.yml

- { role: homebrew_cask, tags: [ 'desktop', 'homebrew_cask', osx' ]} 
- { role: gnome_terminator, tags: [ 'desktop', 'gnome_terminator', ubuntu' ]} 

Đối với chỉ căn cứ nhiệm vụ, chạy ansible-playbook base.yml; cho các tác vụ chỉ dành cho máy tính để bàn, chạy ansible-playbook desktop.yml; cho tất cả các tác vụ, chạy ansible-playbook base.yml desktop.yml
Nó cũng dễ bị lỗi hơn việc xác định thẻ 'mặc định'.

OP cũng muốn thẻ OS mặc định. Nó rất dễ dàng để đạt được điều đó với when

- { role: some_role, when: "ansible_os_family == 'Debian'" } 

với when, bạn không cần phải làm bất cứ điều gì trong dòng lệnh, ansible phát hiện loại và chạy các nhiệm vụ tương ứng cho bạn.