2015-03-25 19 views
22

Làm thế nào nên đi về xác định một pretask cho phụ thuộc vai trò. Tôi hiện đang có một vai trò quan apache rằng có một biến sử dụng như vậy trong vai trò của mình trong <role>/meta/main.yml tôi làm điều gì đó như:Làm cách nào để chỉ định các phần mở đầu ansible cho một vai trò?

--- 
dependencies: 
    - { role: apache, user: proxy } 

Vấn đề vào thời điểm này là tôi vẫn không có người sử dụng tôi chỉ định và khi vai trò cố gắng để bắt đầu apache máy chủ dưới một người dùng không tồn tại, tôi nhận được một lỗi.

tôi đã cố gắng tạo ra một nhiệm vụ trong <role>/tasks/main.yml như:

--- 
- user: name=proxy 

Nhưng người sử dụng được tạo ra chỉ sau khi chạy các nhiệm vụ apache trong phụ thuộc (đó là để được mong đợi). Vì vậy, có cách nào để tạo một tác vụ có thể tạo người dùng trước khi chạy vai trò trong phụ thuộc không?

+0

Bạn có thể gửi playbook đầy đủ cũng như vai trò tùy chỉnh của bạn? – Kashyap

+0

Bạn cũng đã đặt '- user: name = proxy' làm' pre_tasks: 'hoặc' tasks' trong '/tasks/main.yml'? – Kashyap

+0

Thực ra, ngoại trừ phần '---' ở trên dòng '- user: name = proxy' là toàn bộ tập tin tôi có. Tôi đã chỉnh sửa nội dung để làm cho nó rõ ràng hơn như thế nào chính xác các tập tin của tôi nhìn nhưng đó là về tất cả tôi có bây giờ ngoại trừ vai trò apache –

Trả lời

9

Câu trả lời ngắn: Tôi không nghĩ ngôn ngữ cho phép chỉ định pre_tasks cho vai trò.

Bạn có thể lừa gạt/công việc xung quanh bằng cách di chuyển tạo ra người dùng đến một cuốn riêng và include ing PlayBook thay vì role. Một cái gì đó như thế này:

my_fake_role_playbooks/user_and_apache.yml:

- hosts: "{{p_hosts}}" 
    pre_tasks: 
    user: name=proxy 
    roles: [ apache ] 

actual_playbook.yml:

- include: my_fake_role_playbooks/user_and_apache.yml p_hosts=[host1, host2] 

* Mã là chưa được kiểm tra.

HTH

+0

Cảm ơn bạn, 'pre_tasks' đang làm việc! –

8

Bạn chỉ có thể giải quyết việc này với sự phụ thuộc khác hoặc trong giấu tên <role> của bạn hoặc trong vai trò apache.

Tổng số các nội dung của một vai trò proxy-người dùng mới:

--- 
- user: name=proxy 
... 

Sau đó, trong roles/apache/meta/main.yml thêm một phụ thuộc vào nó.

--- 
dependencies: 
    - proxy-user 
... 

Hoặc đặt nó trong roles/<role>/meta/main.yml:

--- 
dependencies: 
    - proxy-user 
    - { role: apache, user: proxy } 
... 
1

tôi có nhu cầu tương tự, và tôi giải quyết nó bằng cách định nghĩa các biến trong vai trò vars. Đó là, tạo ra một <role>/vars/main.yml với

--- 
user: proxy 

rằng nên ghi đè user biến quy định tại module apache, khi viết nó trong thư mục module defaults của bạn thì không.

Tôi đang sử dụng ansible 1.9, không chắc chắn hành vi này đã có mặt bao lâu.

6

Chỉ cần phải giải quyết vấn đề, vấn đề thực sự là nhiệm vụ trước rất có khả năng cụ thể hơn vai trò.Làm một bài đăng dễ dàng, bởi vì bạn chỉ đơn giản là sẽ phụ thuộc vào vai trò mới, điều này được gọi là vai trò bao bọc " " ... hoặc ít nhất đó là những gì họ gọi là ý tưởng trong đầu bếp, khi bạn cố gắng mở rộng thứ gì đó .

Để thực hiện tác vụ trước, bạn phải sửa đổi cấu trúc phân cấp một chút, sử dụng "vai trò bao bọc" và những gì tôi gọi là "vai trò anh chị em". Vì vậy, logic phụ thuộc sẽ xuất hiện như,

  • vai trò wrapper
    • vai trò anh chị em
    • vai trò ban đầu

Wrapper có hai phụ thuộc, nhưng hãy chắc chắn để thêm " vai trò anh chị em "đầu tiên trong danh sách phụ thuộc. Kể từ khi Ansible sẽ đi từ trên xuống dưới.

Cuối cùng, bạn nên đặt các vars của mình trong vai trò của trình bao bọc, để bạn có thể ghi đè lên chúng từ sách bài tập. Bạn muốn các biến theo thứ bậc, càng nhiều càng tốt, và không nhảy qua các anh chị em.

12

Tôi sử dụng pre_tasks để thực hiện một số tác vụ trước vai trò, cảm ơn cho Kashyap.

#!/usr/bin/env ansible-playbook 

--- 
- hosts: all 
    become: true 
    pre_tasks: 
    - name: start tasks and sent notifiaction to HipChat 
     hipchat: 
     color: purple 
     token: "{{ hipchat_token }}" 
     room: "{{ hipchat_room }}" 
     msg: "[Start] Run 'foo/setup.yml' playbook on {{ ansible_nodename }}." 

    roles: 
    - chusiang.vim-and-vi-mode 

    vars: 
    ... 

    tasks: 
    - name: include main task 
     include: tasks/main.yml 

    post_tasks: 
    - name: finish tasks and sent notifiaction to HipChat 
     hipchat: 
     color: green 
     token: "{{ hipchat_token }}" 
     room: "{{ hipchat_room }}" 
     msg: "[Finish] Run 'foo/setup.yml' playbook on {{ ansible_nodename }}." 

# vim:ft=ansible : 
+0

Ngay bây giờ, tôi thích sử dụng 'pre_tasks' và' post_tasks' để làm điều gì đó. –

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