2015-10-28 15 views
7

Giả sử tôi muốn thêm InterestingVar khóa dict và giá trị được liên kết khi biến test_var tồn tại (được thông qua với -e in command line), làm cách nào để thực hiện điều đó?Làm cách nào để thêm khóa/giá trị vào dict trong sách hướng dẫn an toàn, có điều kiện

# ansible-playbook ./add_to_dict_on_condition.yml -i 127.0.0.1, -e env=test -e test_var=123 
- hosts: localhost 
    gather_facts: no 
    vars: 
    - tags: 
     InterestingVar: "{{test_var}}" # How to omit this line if test_var == '' ? 
     Name: xxx 
     Env: "{{ env }}" 

    tasks: 
    - debug: var=tags 

Tôi đã thử nghiệm

InterestingVar: "{{test_var|default(omit)}} 

nhưng tôi nhận được:

"InterestingVar": "__omit_place_holder__caca01e207397883640613b08e8ce3a8fbdd6" 

thay vì không có gì.

Mọi trợ giúp sẽ được đánh giá cao.

tôi sử dụng ansible 1.8

Trả lời

6

Đ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ọ.

+0

Bất kỳ cơ hội nào để có giải pháp để sử dụng logic này trong ansible 1.8? –

+0

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

+0

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

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