Điều duy nhất tôi có thể nghĩ đến là kết hợp bộ từ điển với một nhiệm vụ set_fact
khi tình trạng của bạn được đáp ứng. Điều này dựa trên combine
filter được giới thiệu trong Ansible 2.0.
- hosts: localhost
connection: local
gather_facts: no
vars:
- tags:
Name: xxx
Env: "{{ env }}"
- optional_tags:
InterestingVar: "{{ test_var }}"
tasks:
- name: combine tags
set_fact:
tags: "{{ tags | combine(optional_tags) }}"
when: test_var is defined
- name: debug tags
debug: var=tags
Những kết quả đầu ra sau đây thì test_var không được định nghĩa:
[email protected]:~$ ansible-playbook -i "localhost," conditional_key.yml -e "env=test"
PLAY ***************************************************************************
TASK [combine tags] ************************************************************
skipping: [localhost]
TASK [debug tags] **************************************************************
ok: [localhost] => {
"changed": false,
"tags": {
"Env": "test",
"Name": "xxx"
}
}
PLAY RECAP *********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0
Và sản lượng này khi nó được định nghĩa:
[email protected]:~$ ansible-playbook -i "localhost," conditional_key.yml -e "env=test" -e "test_var=123"
PLAY ***************************************************************************
TASK [combine tags] ************************************************************
ok: [localhost]
TASK [debug tags] **************************************************************
ok: [localhost] => {
"changed": false,
"tags": {
"Env": "test",
"InterestingVar": "123",
"Name": "xxx"
}
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
Nếu bạn không thể sử dụng 2.0+ sau đó lựa chọn khác có thể thay đổi Ansible's hash behaviour để hợp nhất từ điển thay vì ghi đè chúng bằng cách đặt:
hash_behaviour=merge
trong số ansible.cfg
.
Với điều này sau đó bạn có thể sử dụng một cái gì đó như thế này:
- hosts: localhost
connection: local
gather_facts: no
vars:
- tags:
Name: xxx
Env: "{{ env }}"
- tags:
InterestingVar: "{{ test_var }}"
tasks:
- name: debug tags
debug: var=tags
Với vars của bạn được xác định trong các tập tin sau đây:
[email protected]:~$ cat tags.yml
tags:
Name: xxx
Env: "{{ env }}"
[email protected]:~$ cat optional_tags.yml
tags:
InterestingVar: "{{ test_var }}"
này sau đó cung cấp cho bạn kết quả bạn muốn nhưng bạn phải chắc chắc chắn không bao gồm optional_vars.yml
khi bạn không có test_var
được xác định:
[email protected]:~$ ansible-playbook -i "localhost," conditional_key.yml -e "env=test" -e "test_var=123" [email protected] [email protected]_tags.yml
PLAY [localhost] **************************************************************
TASK: [debug tags] ************************************************************
ok: [localhost] => {
"var": {
"tags": {
"Env": "test",
"InterestingVar": "123",
"Name": "xxx"
}
}
}
PLAY RECAP ********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0
Xin lưu ý rằng khi sử dụng phương pháp này, bất kỳ sự ghi đè dự đoán nào của từ điển thông qua kế thừa sẽ kết hợp từ điển thay vì vậy điều này có thể không hữu ích đối với bất kỳ ai ghi đè những thứ trong kho của họ.
Bất kỳ cơ hội nào để có giải pháp để sử dụng logic này trong ansible 1.8? –
Tôi đã chỉnh sửa bài đăng của tôi để cung cấp cho một cách tiếp cận hơi sạch hơn nhưng điều này vẫn còn 2,0 + không may. Có tùy chọn để có được Ansible để hợp nhất dicts hơn là thay thế chúng mà không có bộ lọc 'kết hợp' nhưng điều này có thể có tác dụng xấu ở nơi khác nếu bạn đang mong đợi thừa kế để ghi đè lên mọi thứ. Tôi sẽ thêm nó vào câu trả lời của tôi. – ydaetskcoR
Tôi đã thêm một cách giải quyết trước 2.0 nhưng nó không phải là một khá một tiếc là và có thể có tác dụng phụ tồi tệ hơn (như đã đề cập trong bình luận ở trên của tôi). Nếu bạn thực sự muốn chức năng này thì tôi sẽ xem xét nâng cấp lên 2.0. – ydaetskcoR