目前環境:
$ 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/"
]
}
```