ansible,jinja2,json - 在 Jinja 中使用 json_query?
ansible, jinja2, json - Using json_query in Jinja?
开发者社区您好!
我目前正在开发一些 Ansible 剧本来管理 Citrix NetScaler 配置,并希望获得有关以下内容的一些帮助。我在变量文件中定义了以下数据结构:
nsadc_config_file_textfsm_nsapp_lb_service_parsed
{
"bind_lbvserver_NotParsed": "",
"bind_lbvserver_analyticsprofile": "",
"bind_lbvserver_gotopriorityexpression": "",
"bind_lbvserver_name": "VSRV-CS-Client1",
"bind_lbvserver_policyname": "",
"bind_lbvserver_priority": "",
"bind_lbvserver_service_group_name": "SVC_Client1_App1_Server1_Port1",
"bind_lbvserver_type": "",
"bind_lbvserver_weight": ""
},
{
"bind_lbvserver_NotParsed": "",
"bind_lbvserver_analyticsprofile": "",
"bind_lbvserver_gotopriorityexpression": "NEXT",
"bind_lbvserver_name": "VSRV_Client2_App2",
"bind_lbvserver_policyname": "policy_Client2_Rewrite",
"bind_lbvserver_priority": "80",
"bind_lbvserver_service_group_name": "",
"bind_lbvserver_type": "REQUEST",
"bind_lbvserver_weight": ""
},
我想在 Jinja 文件中查询这个 JSON 结构 ,尝试了以下方法,但不幸的是它不起作用。我不是 100% 确定是否可以在 Jinja 文件中使用“json_query”。
servicebindings:
{% for item_1 in nsadc_config_file_textfsm_nsapp_lb_vserver_binding_parsed %}
{% if (item_0.add_lbvserver_name == item_1.bind_lbvserver_name) and (item_1.bind_lbvserver_service_group_name in nsadc_config_file_textfsm_nsapp_lb_service_parsed) %}
- servicename: "{{ item_1.bind_lbvserver_service_group_name }}"
{% if item_1.bind_lbvserver_weight is defined and item_1.bind_lbvserver_weight %}
weight: "{{ item_1.bind_lbvserver_weight }}"
{% endif %}
{% endif %}
{% endfor %}
我没有使用上面的 (item_1.bind_lbvserver_service_group_name in nsadc_config_file_textfsm_nsapp_lb_service_parsed)
,而是尝试直接在 Jinja 中包含一个 json_query 语句,但没有成功。恐怕使用引号和转义字符可能存在问题。
{% if (item_0.add_lbvserver_name == item_1.bind_lbvserver_name) and (nsadc_config_file_textfsm_nsapp_lb_service_parsed | json_query(\"[?add_svc_name == '\" + item_1.bind_lbvserver_service_group_name + \"']\")) %}
有人能告诉我是否可以直接在 Jinja 中查询 JSON 结构吗?
非常感谢!
json_query
是一个 Jinja 过滤器,因此您当然可以在模板中使用它...或者 Jinja 表达式有效的任何其他地方。
例如,如果我在这样的剧本(和模板任务)中有数据:
- hosts: localhost
gather_facts: false
vars:
var1:
- name: thing1
color: red
- name: thing2
color: blue
var2:
- name: bob
likes: blue
- name: alice
likes: green
tasks:
- template:
src: template.in
dest: output.txt
我可以编写一个如下所示的模板:
{% for person in var2 %}
{% for thing in var1|json_query('[?color == `{}`]'.format(person.likes)) %}
- {{ person.name }} likes {{ thing.name }}
{% endfor %}
{% endfor %}
这将在 output.txt
中产生以下输出:
- bob likes thing2
注意模板中 json_query
表达式的两点:
- 因为我们正在寻找文字字符串,所以我们需要使用反引号来引用该值。
- 我们正在使用 Python 字符串格式来将我们的目标值包含在查询字符串中。
我们可以这样写来代替字符串格式化语法:
json_query('[?color == `' + person.likes + '`]')
开发者社区您好!
我目前正在开发一些 Ansible 剧本来管理 Citrix NetScaler 配置,并希望获得有关以下内容的一些帮助。我在变量文件中定义了以下数据结构:
nsadc_config_file_textfsm_nsapp_lb_service_parsed
{
"bind_lbvserver_NotParsed": "",
"bind_lbvserver_analyticsprofile": "",
"bind_lbvserver_gotopriorityexpression": "",
"bind_lbvserver_name": "VSRV-CS-Client1",
"bind_lbvserver_policyname": "",
"bind_lbvserver_priority": "",
"bind_lbvserver_service_group_name": "SVC_Client1_App1_Server1_Port1",
"bind_lbvserver_type": "",
"bind_lbvserver_weight": ""
},
{
"bind_lbvserver_NotParsed": "",
"bind_lbvserver_analyticsprofile": "",
"bind_lbvserver_gotopriorityexpression": "NEXT",
"bind_lbvserver_name": "VSRV_Client2_App2",
"bind_lbvserver_policyname": "policy_Client2_Rewrite",
"bind_lbvserver_priority": "80",
"bind_lbvserver_service_group_name": "",
"bind_lbvserver_type": "REQUEST",
"bind_lbvserver_weight": ""
},
我想在 Jinja 文件中查询这个 JSON 结构 ,尝试了以下方法,但不幸的是它不起作用。我不是 100% 确定是否可以在 Jinja 文件中使用“json_query”。
servicebindings:
{% for item_1 in nsadc_config_file_textfsm_nsapp_lb_vserver_binding_parsed %}
{% if (item_0.add_lbvserver_name == item_1.bind_lbvserver_name) and (item_1.bind_lbvserver_service_group_name in nsadc_config_file_textfsm_nsapp_lb_service_parsed) %}
- servicename: "{{ item_1.bind_lbvserver_service_group_name }}"
{% if item_1.bind_lbvserver_weight is defined and item_1.bind_lbvserver_weight %}
weight: "{{ item_1.bind_lbvserver_weight }}"
{% endif %}
{% endif %}
{% endfor %}
我没有使用上面的 (item_1.bind_lbvserver_service_group_name in nsadc_config_file_textfsm_nsapp_lb_service_parsed)
,而是尝试直接在 Jinja 中包含一个 json_query 语句,但没有成功。恐怕使用引号和转义字符可能存在问题。
{% if (item_0.add_lbvserver_name == item_1.bind_lbvserver_name) and (nsadc_config_file_textfsm_nsapp_lb_service_parsed | json_query(\"[?add_svc_name == '\" + item_1.bind_lbvserver_service_group_name + \"']\")) %}
有人能告诉我是否可以直接在 Jinja 中查询 JSON 结构吗?
非常感谢!
json_query
是一个 Jinja 过滤器,因此您当然可以在模板中使用它...或者 Jinja 表达式有效的任何其他地方。
例如,如果我在这样的剧本(和模板任务)中有数据:
- hosts: localhost
gather_facts: false
vars:
var1:
- name: thing1
color: red
- name: thing2
color: blue
var2:
- name: bob
likes: blue
- name: alice
likes: green
tasks:
- template:
src: template.in
dest: output.txt
我可以编写一个如下所示的模板:
{% for person in var2 %}
{% for thing in var1|json_query('[?color == `{}`]'.format(person.likes)) %}
- {{ person.name }} likes {{ thing.name }}
{% endfor %}
{% endfor %}
这将在 output.txt
中产生以下输出:
- bob likes thing2
注意模板中 json_query
表达式的两点:
- 因为我们正在寻找文字字符串,所以我们需要使用反引号来引用该值。
- 我们正在使用 Python 字符串格式来将我们的目标值包含在查询字符串中。
我们可以这样写来代替字符串格式化语法:
json_query('[?color == `' + person.likes + '`]')