2015-03-12 16 views
10

Tôi không thể lấy ví dụ đơn giản này có vẻ để làm việc trong Ansible 1.8.3. Biến nội suy không đá vào tên nhiệm vụ. Tất cả examples Tôi đã thấy dường như đề nghị điều này sẽ làm việc. Cho rằng biến được định nghĩa trong phần vars, tôi mong đợi tên tác vụ để in giá trị của biến. Tại sao nó không hoạt động?Ansible: biến nội suy trong tên tác vụ

Ngay cả ví dụ từ Ansible documentation dường như không in giá trị biến.

--- 
- hosts: 127.0.0.1 
    gather_facts: no 
    vars: 
    vhost: "foo" 
    tasks: 
    - name: create a virtual host file for {{ vhost }} 
     debug: msg="{{ vhost }}" 

Điều này dẫn đến kết quả như sau:

PLAY [127.0.0.1]  
************************************************************** 

TASK: [create a virtual host file for {{ vhost }}] 
**************************** 
ok: [127.0.0.1] => { 
    "msg": "foo" 
} 

PLAY RECAP 
******************************************************************** 
127.0.0.1     : ok=1 changed=0 unreachable=0 failed=0 

Cập nhật này làm việc với 1.7.2 nhưng không làm việc với 1.8.3. Vì vậy, đây là lỗi hoặc tính năng.

+1

này đã được xác nhận là một khiếm khuyết có thể - https://github.com/ansible/ansible/issues/10347 – calvinkrishy

Trả lời

15

Biến không được giải quyết bên trong name. Chỉ trong các nhiệm vụ/điều kiện thực tế, các trình giữ chỗ sẽ được giải quyết. Tôi đoán đây là do thiết kế. Hãy tưởng tượng bạn có một vòng lặp with_items và sử dụng {{ item }} trong name. Các tác vụ name sẽ chỉ được in một lần, nhưng {{ item }} sẽ thay đổi trong mỗi lần lặp lại.

Tôi thấy các ví dụ, ngay cả ví dụ trong tài liệu bạn đã liên kết, sử dụng các biến trong name. Nhưng điều đó không có nghĩa là kết quả sẽ giống như bạn mong đợi. Các tài liệu được quản lý bởi cộng đồng. Nó có thể là một ai đó chỉ cần đặt dòng đó có w/o thử nghiệm nó - hoặc có thể nó được sử dụng để làm việc như thế trong một phiên bản trước của Ansible và các tài liệu chưa được cập nhật sau đó. (Tôi chỉ sử dụng Ansible từ khoảng một năm). Nhưng mặc dù nó không hoạt động như mong muốn, nhưng tôi vẫn sử dụng các biến trong số name của mình, chỉ để chỉ ra rằng nhiệm vụ dựa trên các tham số động. Có thể là các ví dụ đã được viết với cùng một ý định.

Một quan sát thú vị mà tôi đã thực hiện gần đây (Ansible 1.9.4) là, các giá trị mặc định được viết ra trong tên tác vụ.

- name: create a virtual host file for {{ vhost | default("foo") }} 

Khi thực hiện, Ansible sẽ hiển thị tiêu đề công việc như:

TASK: [tạo ra một tập tin máy chủ ảo cho foo]

Bằng cách này bạn có thể tránh được tên công việc xấu xí trong đầu ra.

+2

Đó kinda ... làm cho tinh thần. Giống như bạn đặt ra, điều này được sử dụng để làm việc trong 1.7.x nhưng ngừng làm việc trong 1.8. À ... – calvinkrishy

+0

ah, cảm ơn đã đề cập đến các phiên bản, tôi nghĩ rằng đã xảy ra bởi vì tôi đã thực hiện nhiệm vụ của mình thành một mô-đun, con số tên của tôi đã ngừng nội suy vì tôi đã cập nhật Ansible. – lakesare

-3

Bạn phải bao quanh chuỗi trong dấu ngoặc kép.

tasks: 
    - name: "create a virtual host file for {{ vhost }}" 
     debug: msg="{{ vhost }}" 

Từ ansible documentation:

cú pháp YAML đòi hỏi rằng nếu bạn bắt đầu một giá trị với {{foo}} bạn trích dẫn toàn bộ dòng, vì nó muốn để chắc chắn bạn không cố gắng để bắt đầu một từ điển YAML. Điều này được bao gồm trên trang YAML Syntax.

+0

Nếu bạn ** bắt đầu ** một giá trị với {{foo}} bạn trích dẫn toàn bộ dòng. Nó không phải là cần thiết trong trường hợp OP. –

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