2014-11-20 15 views
9

Kịch bản ansible-playbook được gọi với qua trong hiệp phụ var:Ansible set_fact không làm thay đổi giá trị biến

-e my_var=init_value 

Sau đó, trong vai trò một mã giá trị có nghĩa vụ phải thay đổi thông qua cuộc gọi set_fact (giá trị other_var biến là "new_value"):

set_fact: my_var: {{ other_var }} 

Điều này dẫn đến một kết quả đẹp cho là xác nhận thay đổi:

{"ansible facts": {"my_var": "new_value"}} 

Tuy nhiên vang vọng biến sau khi thay đổi nó cho thấy những giá trị cũ:

echo {{ my_var }} 
-> "echo init_value" 

Để thêm vào đó, khi tôi đặt hai biến trong ví dụ trên:

set_fact: my_var: {{ other_var }} 
set_fact: new_var: {{ other_var }} 

Các new_var được thiết lập đúng cách.

Biến có một cách nào đó không thay đổi được không? Làm thế nào để sử dụng set_fact để cập nhật giá trị của biến?

Trả lời

12

Mô-đun 'set_fact' có hiệu quả thêm một thực tế lưu trữ khác, ví dụ: "một thực tế được khám phá về hệ thống". Từ tài liệu (http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable), bạn có thể thấy rằng những sự kiện đó có mức độ ưu tiên thấp và sẽ bị ghi đè bởi các siêu phụ và nhiều thứ khác. Điều này có thể gây nhầm lẫn vì sử dụng 'set_fact' có thể làm cho nó có vẻ như bạn đang thay đổi giá trị của biến tại thời điểm đó, nhưng có thể tên là chìa khóa để hiểu - nó không phải là 'set_variable', đó là 'set_ (máy chủ) thực tế ', và sự thật máy chủ có ưu tiên thấp. Ưu tiên quan trọng hơn thứ tự mà giá trị được gán.

Một cách giải quyết khác nếu bạn muốn cung cấp giá trị thông qua các biến thừa được ghi đè sau đó sẽ gán lại giá trị thừa cho một biến khác thông qua set_fact ở đầu sách, sau đó gán lại biến mới sau sử dụng set_fact lần nữa. Vì chúng ở cùng một mức độ ưu tiên, 'ghi đè' sẽ hoạt động như bạn mong đợi.

+0

Cảm ơn bạn đã trả lời, tôi tin rằng tôi đã giải quyết nó tương tự như bạn đề xuất: Tôi đã xác định một vai trò mới, với tập hợp các sự kiện, là sự phụ thuộc vào nhiệm vụ muốn tùy chỉnh các giá trị. Nhờ đó, hai vai trò có thể sử dụng lại mã vai trò thứ ba, chỉ thay đổi giá trị. – hauron

+0

Tôi cũng sẽ chấp nhận câu trả lời này vì nó mô tả lý do tại sao "thực tế" là bất biến, mặc dù thứ tự các hoạt động cho thấy nó có thể là. – hauron

+1

Cảm ơn bạn đã giải thích, khía cạnh này của Ansible khá là khó hiểu - ưu tiên là chìa khóa ở đây. – RichVel

4

Biến dòng lệnh có mức độ ưu tiên cao nhất của tất cả các loại biến. Mọi thứ bạn định nghĩa trên dòng lệnh sẽ ghi đè bất kỳ định nghĩa nào khác của biến đó.

Tài liệu về mức độ ưu tiên biến trong Ansible là ở đây http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable Liệt kê tất cả các địa điểm khác bạn có thể đặt giá trị ban đầu/mặc định của mình.

+0

Xin chào, đúng, nhưng một khi đã được chuyển qua dòng lệnh, giá trị có thay đổi không? Không nên "set_fact" cập nhật nó (như đầu ra mở rộng từ mô-đun đó gợi ý)? – hauron

+0

Thành thật mà nói, tôi không chắc chắn. Giải thích của tôi về các tài liệu là một dòng lệnh var không thực sự bất biến - nhưng nó cũng có thể được, bởi vì không có cách nào khác để thiết lập giá trị có thể ghi đè lên nó. Nếu bạn nhìn vào phương thức 'get_inject_vars' trong nguồn của ansible/lib/ansible/runner/__ init__.py (https://github.com/ansible/ansible/blob/be4dbe76b9fbdd7e377f0d0c3ace61fa6e855e04/lib/ansible/runner/__init__.py), bạn có thể thấy cách họ thiết lập các vars với dòng lệnh cuối cùng/ưu tiên cao nhất. Có lẽ một yêu cầu cho các tài liệu rõ ràng hơn sẽ là tốt? – dodgio

+0

Đây dường như là hai điều khác nhau: đặt giá trị biến, xem xét ưu tiên (ví dụ: mất mặc định, nhóm vars ở đâu đó ở giữa, dòng trcmps cmd) là một điều, trong khi thực hiện ghi đè trong playbook, vai trò, nhiệm vụ được xác định biến là một biến khác - nó xảy ra sau phần thu thập thông tin. Bây giờ, ngay cả tên cho thấy khả năng thay đổi: "extraVars". – hauron

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