模板化字符串时出现错误模板错误:没有名为 'json_query' 的过滤器
Getting error template error while templating string: No filter named 'json_query'
有了这个剧本
---
- name: ReadJsonfile
hosts: localhost
tasks:
- name: Display the JSON file content
shell: "cat config.json"
register: result
- name: save the Json data to a Variable as a Fact
set_fact:
jsondata: "{{ result.stdout | from_json }}"
- name: setDomainName
set_fact:
domain_name: "{{ jsondata | json_query(jmesquery) }}"
vars:
jmesquery: '[].domain[].name'
我的 Linux 服务器上有两个用户:user1
和 user2
python3.8
、pip
、ansible-core
、ansible-base
和 jmespath
已安装。
我用 user1
登录,上面的剧本 运行 没问题
ansible-playbook test.yml
但是,当我使用 user2
和 运行 登录时,出现以下错误
TASK [setDomainName]
****************************************************************************************** Monday 21 March 2022 01:16:40 -0500 (0:00:00.140) 0:00:04.221
********** fatal: [localhost]: FAILED! => {"msg": "template error while templating string: No filter named 'json_query'.. String: {{
jsondata | json_query(jmesquery) }}"}
注意: 当 运行 和 user1
时,剧本工作正常。错误是 运行 只有 user2
时。
我使用 user2
进行设置的方式有问题吗?
以下是 user2
的详细信息
[user2@myhost Migrator]$ ansible --version
ansible [core 2.12.3]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/user2/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/user2/.local/lib/python3.8/site-packages/ansible
ansible collection location = /home/user2/.ansible/collections:/usr/share/ansible/collections
executable location = /bin/ansible
python version = 3.8.12 (default, Mar 21 2022, 00:59:19) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
jinja version = 3.0.3
libyaml = True
[user2@myhost Migrator]$ ansible-playbook --version
ansible-playbook [core 2.12.3]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/user2/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/user2/.local/lib/python3.8/site-packages/ansible
ansible collection location = /home/user2/.ansible/collections:/usr/share/ansible/collections
executable location = /bin/ansible-playbook
python version = 3.8.12 (default, Mar 21 2022, 00:59:19) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
jinja version = 3.0.3
libyaml = True
[user2@myhost Migrator]$ pip --version
bash: pip: command not found
[user2@myhost Migrator]$ pip3 --version
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
pip 21.3.1 from /home/user2/.local/lib/python3.6/site-packages/pip (python 3.6)
[user2@myhost Migrator]$ pip3 install jmespath
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: jmespath in /usr/local/lib/python3.6/site-packages (0.10.0)
[user2@myhost Migrator]$
[user2@myhost Migrator]$ python3.8 --version
Python 3.8.12
JmesPath 安装如下:
$ sudo pip3.8 install jmespath
Collecting jmespath
Downloading jmespath-1.0.0-py3-none-any.whl (23 kB)
Installing collected packages: jmespath
Successfully installed jmespath-1.0.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
你能提出解决问题的建议吗?
因为您确实使用 pip 包 ansible-core
和 ansible-base
安装了 Ansible,所以您没有集合 community.general
,这个过滤器是其中的一部分。
您有多种选择:
- 使用有问题的用户登录时,安装丢失的集合:
ansible-galaxy collection install community.general
- 安装完整的 Ansible 包:
pip uninstall ansible-core ansible-base
pip install ansible
- 重新安装共享文件夹中的集合,选项
-p
ansible-galaxy collection install community.general \
-p /usr/share/ansible/collections
有了这个剧本
---
- name: ReadJsonfile
hosts: localhost
tasks:
- name: Display the JSON file content
shell: "cat config.json"
register: result
- name: save the Json data to a Variable as a Fact
set_fact:
jsondata: "{{ result.stdout | from_json }}"
- name: setDomainName
set_fact:
domain_name: "{{ jsondata | json_query(jmesquery) }}"
vars:
jmesquery: '[].domain[].name'
我的 Linux 服务器上有两个用户:user1
和 user2
python3.8
、pip
、ansible-core
、ansible-base
和 jmespath
已安装。
我用 user1
登录,上面的剧本 运行 没问题
ansible-playbook test.yml
但是,当我使用 user2
和 运行 登录时,出现以下错误
TASK [setDomainName] ****************************************************************************************** Monday 21 March 2022 01:16:40 -0500 (0:00:00.140) 0:00:04.221 ********** fatal: [localhost]: FAILED! => {"msg": "template error while templating string: No filter named 'json_query'.. String: {{ jsondata | json_query(jmesquery) }}"}
注意: 当 运行 和 user1
时,剧本工作正常。错误是 运行 只有 user2
时。
我使用 user2
进行设置的方式有问题吗?
以下是 user2
[user2@myhost Migrator]$ ansible --version
ansible [core 2.12.3]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/user2/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/user2/.local/lib/python3.8/site-packages/ansible
ansible collection location = /home/user2/.ansible/collections:/usr/share/ansible/collections
executable location = /bin/ansible
python version = 3.8.12 (default, Mar 21 2022, 00:59:19) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
jinja version = 3.0.3
libyaml = True
[user2@myhost Migrator]$ ansible-playbook --version
ansible-playbook [core 2.12.3]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/user2/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/user2/.local/lib/python3.8/site-packages/ansible
ansible collection location = /home/user2/.ansible/collections:/usr/share/ansible/collections
executable location = /bin/ansible-playbook
python version = 3.8.12 (default, Mar 21 2022, 00:59:19) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
jinja version = 3.0.3
libyaml = True
[user2@myhost Migrator]$ pip --version
bash: pip: command not found
[user2@myhost Migrator]$ pip3 --version
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
pip 21.3.1 from /home/user2/.local/lib/python3.6/site-packages/pip (python 3.6)
[user2@myhost Migrator]$ pip3 install jmespath
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: jmespath in /usr/local/lib/python3.6/site-packages (0.10.0)
[user2@myhost Migrator]$
[user2@myhost Migrator]$ python3.8 --version
Python 3.8.12
JmesPath 安装如下:
$ sudo pip3.8 install jmespath
Collecting jmespath
Downloading jmespath-1.0.0-py3-none-any.whl (23 kB)
Installing collected packages: jmespath
Successfully installed jmespath-1.0.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
你能提出解决问题的建议吗?
因为您确实使用 pip 包 ansible-core
和 ansible-base
安装了 Ansible,所以您没有集合 community.general
,这个过滤器是其中的一部分。
您有多种选择:
- 使用有问题的用户登录时,安装丢失的集合:
ansible-galaxy collection install community.general
- 安装完整的 Ansible 包:
pip uninstall ansible-core ansible-base pip install ansible
- 重新安装共享文件夹中的集合,选项
-p
ansible-galaxy collection install community.general \ -p /usr/share/ansible/collections