目前環境:
$ ansible --version
ansible 2.0.0.2
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
$ pip show jinja2
---
Name: Jinja2
Version: 2.7.2
Location: /usr/lib/python2.7/dist-packages
Requires: markupsafe
而 equalto 的用法是 Jinja2 2.8 之後才支援的 Orz
只好硬解一下:
$ sudo pip install jinja2 --upgrade
$ pip show jinja2
---
Name: Jinja2
Version: 2.8
Location: /usr/local/lib/python2.7/dist-packages
Requires: MarkupSafe
接著,就沒事了 :P 來一個完整範例紀錄:
- hosts: localhost
  vars:
    rpm_list:
      - name: "my-service-package-1"
        install_dir: "/opt/my-service-package-1/"
      - name: "my-service-package-2"
        install_dir: "/opt/my-service-package-2/"
  task:
    - set_fact: x="{{rpm_list | selectattr('name','equalto','my-service-package-2') | map(attribute='install_dir') |list}}"
    - debug: var={{x}}
執行:
TASK [set_fact] ****************************************************************
ok: [localhost]
TASK [debug] *******************************************************************
ok: [localhost] => {
    "/opt/my-service-package-2/": "VARIABLE IS NOT DEFINED!"
}
---
更新:
$ cat echo.sh
#!/bin/sh
echo '{"all":["127.0.0.1"]}'
$ cat test.xml
---
- hosts: all 
  vars:
    rpm_list:
      - name: "my-service-package-1"
        install_dir: "/opt/my-service-package-1/"
      - name: "my-service-package-2"
        install_dir: "/opt/my-service-package-2/"
  tasks:
    - set_fact: x="{{rpm_list | selectattr('name','equalto','my-service-package-2') | map(attribute='install_dir') |list}}"
    - debug: var=x
$ ansible-playbook -i echo.sh test.xml 
PLAY [all] ***********************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************
ok: [127.0.0.1]
TASK [set_fact] ******************************************************************************************************************************************
ok: [127.0.0.1]
TASK [debug] *********************************************************************************************************************************************
ok: [127.0.0.1] => {
    "x": [
        "/opt/my-service-package-2/"
    ]
}
PLAY RECAP ***********************************************************************************************************************************************
127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
其他參考資料:
ㄟ,不是啊,你的範例跑出來的結果是 "VARIABLE IS NOT DEFINED!" 耶...
回覆刪除改成這樣即可:`- debug: var=x`
回覆刪除```
TASK [set_fact] ******************************************************************************************************************************************
ok: [127.0.0.1]
TASK [debug] *********************************************************************************************************************************************
ok: [127.0.0.1] => {
"x": [
"/opt/my-service-package-2/"
]
}
```