2015-11-13 18 views
8

Làm cách nào để có thể phát một cuốn sách khác của Ansible playbook register trong biến số kết quả của including một sách khác?Làm thế nào có thể Ansible "đăng ký" trong một biến kết quả của việc bao gồm một playbook?

Ví dụ: điều sau đây có đăng ký kết quả thực hiện tasks/foo.yml trong result_of_foo không?

tasks: 
    - include: tasks/foo.yml 
    - register: result_of_foo 

Làm cách nào khác có thể ghi lại kết quả của chuỗi nhiệm vụ?

Trả lời

7

Câu trả lời ngắn gọn là điều này không thể thực hiện được.

Tuyên bố register được sử dụng để lưu trữ đầu ra của một tác vụ duy nhất thành một biến. Nội dung chính xác của biến đăng ký có thể khác nhau tùy thuộc vào loại tác vụ (ví dụ: tác vụ shell sẽ bao gồm đầu ra stderout & stderr từ lệnh bạn chạy trong biến đã đăng ký, trong khi tác vụ stat sẽ cung cấp chi tiết của tệp được chuyển đến nhiệm vụ).

Nếu bạn có tệp bao gồm một số nhiệm vụ tùy ý trong đó thì Ansible sẽ không biết cách lưu trữ gì trong biến trong ví dụ của bạn.

Mỗi tác vụ riêng lẻ trong tệp bao gồm của bạn có thể đăng ký biến và bạn có thể tham chiếu các biến đó ở nơi khác, vì vậy thực sự không cần phải làm điều gì đó như thế này.

+0

Có một nhu cầu nếu bạn đối xử với một playbook như một hộp đục (tức là một chức năng) với một đơn giản, rõ ràng giao diện. Tại sao một Playbook không có biến có phạm vi và trả về giá trị? –

+3

Playbook Ansible gặp một số vấn đề mà tôi đã quan sát thấy trong các ngôn ngữ cụ thể của miền (DSL) khác như Ant, một ngôn ngữ xây dựng cho Java. Các ngôn ngữ như vậy chủ yếu là khai báo, nhưng cũng có hành vi chức năng hoặc bắt buộc không đầy đủ. Playbook ansible đã được gia tăng điền vào những khoảng trống bắt buộc, nhưng như trường hợp này chứng minh, vẫn còn có lỗ để điền vào. Một cách tiếp cận khác là căn cứ vào thiết kế của một DSL trên một ngôn ngữ lập trình hiện có, nhưng theo một cú pháp hẹp hơn hoặc chỉ cung cấp các chức năng cụ thể. (YAML và XML là * không * ngôn ngữ lập trình.) –

+0

Điều này vẫn không khả thi ngay cả khi chỉ có một tác vụ duy nhất trong một cuốn sách? Bạn có thể đăng ký kết quả của nhiệm vụ đó, và sau đó tham khảo nó trở lại trong cuốn sách gốc? – user3270760

3

Tôi có thể thực hiện việc này bằng cách chuyển tên biến như một biến được sử dụng trong tác vụ. Tôi đã bao gồm tệp main.yaml của mình và bao gồm các tệp cgw.yaml bên dưới.

main.yaml:

- name: Create App A CGW 
    include: cgw.yaml 
    vars: 
    bgp_asn: "{{ asn_spoke }}" 
    ip_address: "{{ eip_app_a.public_ip }}" 
    name: cgw-app-a 
    region: "{{ aws_region }}" 
    aws_access_key: "{{ ec2_access_key }}" 
    aws_secret_key: "{{ ec2_secret_key }}" 
    register: cgw_app_a 

cgw.yaml:

- name: "{{ name }}" 
    ec2_customer_gateway: 
    bgp_asn: "{{ bgp_asn }}" 
    ip_address: "{{ ip_address }}" 
    name: "{{ name }}" 
    region: "{{ region }}" 
    aws_access_key: "{{ aws_access_key }}" 
    aws_secret_key: "{{ aws_secret_key }}" 
    register: "{{ register }}" 
Các vấn đề liên quan