由于不必要的聊天而比较两个数组时出现问题
Problem while comparing two arrays due to unecessary chars
我必须从 mysql 查询中获取两个数组,并且我想进行主机比较。
例如,mysql result 的结果类似于 list1 & list2.
- name:
set_fact:
list1:
- host: '[\"X.XXX.XX.XXX\"]'
username: username1
- host: '[\"X.XXX.XX.XXX\"]'
username: username2
- host: '[\"X.XXX.XX.XXX\"]'
username: username3
- host:
- '[\"XX.XXX.XX.XXX\"]'
- '[\"XX.X.X.XXX\"]'
username: username4
- host: '[\"XX.X.X.XXX\"]'
username: username5
- host: '[\"localhost\"]'
username: username6
- host: '[\"XX.XXX.XX.XXX\"]'
username: username7
list2:
- host: 'X.XXX.XX.XXX'
username: username1
- host: 'localhost'
username: username2
- host: 'XX.XXX.XX.XXX'
username: username3
- host: 'localhost'
username: username4
- host: 'XX.X.X.XXX'
username: username5
tags: [diff]
如您所见,mysql 查询中的 list2 发回了带有一些不必要字符的主机,我想删除它们,因为在进行比较时,条件为假。
- name: Comparison of two lists
debug:
msg: "{{ item.0.username }}({{ item.0.host }}) == {{ item.1.username }}({{ item.1.host }}) {{ item.0.username == item.1.username }}"
loop: "{{ list1 | product(list2) | list }}"
when:
- "{{ item.0.host == item.1.host }} == True"
register: output
tags: [diff]
这是 Ansible 的输出:
skipping: [staging1-sql0] => (item=[{'host': '[\"X.XXX.XX.XXX\"]', 'username': 'username1'}, {'host': 'X.XXX.XX.XXX', 'username': 'username1'}])
skipping: [staging1-sql0] => (item=[{'host': '[\"X.XXX.XX.XXX\"]', 'username': 'username2'}, {'host': 'localhost', 'username': 'username2'}])
skipping: [staging1-sql0] => (item=[{'host': '[\"X.XXX.XX.XXX\"]', 'username': 'username3'}, {'host': 'XX.XXX.XX.XXX', 'username': 'username3'}])
我该如何解决这个问题?
您使用的是其他列表还是应该 loop: "{{ list1 | product(list2) | list }}"
?
我试过这段代码并且有效:
- hosts: localhost
gather_facts: no
tasks:
- name:
set_fact:
list1:
- host: '[\"X.XXX.XX.XXX\"]'
username: username1
- host: '[\"X.XXX.XX.XXX\"]'
username: username2
- host: '[\"X.XXX.XX.XXX\"]'
username: username3
- host:
- '[\"XX.XXX.XX.XXX\"]'
- '[\"XX.X.X.XXX\"]'
username: username4
- host: '[\"XX.X.X.XXX\"]'
username: username5
- host: '[\"localhost\"]'
username: username6
- host: '[\"XX.XXX.XX.XXX\"]'
username: username7
list2:
- host: 'X.XXX.XX.XXX'
username: username1
- host: 'localhost'
username: username2
- host: 'XX.XXX.XX.XXX'
username: username3
- host: 'localhost'
username: username4
- host: 'XX.X.X.XXX'
username: username5
tags: [diff]
- name: Comparison of two lists
debug:
msg:
- "{{ list1_username }}{{ list1_host }} == {{ list2_username}}({{ list2_host}}) {{ list1_username == list2_username }}"
loop: "{{ list1 | product(list2) | list }}"
when: list1_host == list2_host
register: output
tags: [diff]
vars:
list1_host: "{{ (item.0.host|replace('[\\"','')|replace('\\"]','')) }}"
list1_username: "{{ item.0.username }}"
list2_host: "{{ item.1.host }}"
list2_username: "{{ item.1.username }}"
提示:
- 无需在
when
子句中使用 jinja 模板。
- 有时最好为任务创建参数以在循环中阐明变量的属性
- 您可以将信息设置为变量或附加到列表,而不是使用调试
- 请注意始终使用更好的数据变化来测试您的代码,并使用
block
和 rescue
来防止致命的运行时错误。
我真的不知道你在做什么,但你可以通过使用 select 过滤器来改进你的代码,包括一个任务文件,同时循环遍历第一个列表,然后与第二个列表进行比较,使用模板和其他事情...分享整个案例,我们可以提供更好的帮助。
我必须从 mysql 查询中获取两个数组,并且我想进行主机比较。 例如,mysql result 的结果类似于 list1 & list2.
- name:
set_fact:
list1:
- host: '[\"X.XXX.XX.XXX\"]'
username: username1
- host: '[\"X.XXX.XX.XXX\"]'
username: username2
- host: '[\"X.XXX.XX.XXX\"]'
username: username3
- host:
- '[\"XX.XXX.XX.XXX\"]'
- '[\"XX.X.X.XXX\"]'
username: username4
- host: '[\"XX.X.X.XXX\"]'
username: username5
- host: '[\"localhost\"]'
username: username6
- host: '[\"XX.XXX.XX.XXX\"]'
username: username7
list2:
- host: 'X.XXX.XX.XXX'
username: username1
- host: 'localhost'
username: username2
- host: 'XX.XXX.XX.XXX'
username: username3
- host: 'localhost'
username: username4
- host: 'XX.X.X.XXX'
username: username5
tags: [diff]
如您所见,mysql 查询中的 list2 发回了带有一些不必要字符的主机,我想删除它们,因为在进行比较时,条件为假。
- name: Comparison of two lists
debug:
msg: "{{ item.0.username }}({{ item.0.host }}) == {{ item.1.username }}({{ item.1.host }}) {{ item.0.username == item.1.username }}"
loop: "{{ list1 | product(list2) | list }}"
when:
- "{{ item.0.host == item.1.host }} == True"
register: output
tags: [diff]
这是 Ansible 的输出:
skipping: [staging1-sql0] => (item=[{'host': '[\"X.XXX.XX.XXX\"]', 'username': 'username1'}, {'host': 'X.XXX.XX.XXX', 'username': 'username1'}])
skipping: [staging1-sql0] => (item=[{'host': '[\"X.XXX.XX.XXX\"]', 'username': 'username2'}, {'host': 'localhost', 'username': 'username2'}])
skipping: [staging1-sql0] => (item=[{'host': '[\"X.XXX.XX.XXX\"]', 'username': 'username3'}, {'host': 'XX.XXX.XX.XXX', 'username': 'username3'}])
我该如何解决这个问题?
您使用的是其他列表还是应该 loop: "{{ list1 | product(list2) | list }}"
?
我试过这段代码并且有效:
- hosts: localhost
gather_facts: no
tasks:
- name:
set_fact:
list1:
- host: '[\"X.XXX.XX.XXX\"]'
username: username1
- host: '[\"X.XXX.XX.XXX\"]'
username: username2
- host: '[\"X.XXX.XX.XXX\"]'
username: username3
- host:
- '[\"XX.XXX.XX.XXX\"]'
- '[\"XX.X.X.XXX\"]'
username: username4
- host: '[\"XX.X.X.XXX\"]'
username: username5
- host: '[\"localhost\"]'
username: username6
- host: '[\"XX.XXX.XX.XXX\"]'
username: username7
list2:
- host: 'X.XXX.XX.XXX'
username: username1
- host: 'localhost'
username: username2
- host: 'XX.XXX.XX.XXX'
username: username3
- host: 'localhost'
username: username4
- host: 'XX.X.X.XXX'
username: username5
tags: [diff]
- name: Comparison of two lists
debug:
msg:
- "{{ list1_username }}{{ list1_host }} == {{ list2_username}}({{ list2_host}}) {{ list1_username == list2_username }}"
loop: "{{ list1 | product(list2) | list }}"
when: list1_host == list2_host
register: output
tags: [diff]
vars:
list1_host: "{{ (item.0.host|replace('[\\"','')|replace('\\"]','')) }}"
list1_username: "{{ item.0.username }}"
list2_host: "{{ item.1.host }}"
list2_username: "{{ item.1.username }}"
提示:
- 无需在
when
子句中使用 jinja 模板。 - 有时最好为任务创建参数以在循环中阐明变量的属性
- 您可以将信息设置为变量或附加到列表,而不是使用调试
- 请注意始终使用更好的数据变化来测试您的代码,并使用
block
和rescue
来防止致命的运行时错误。
我真的不知道你在做什么,但你可以通过使用 select 过滤器来改进你的代码,包括一个任务文件,同时循环遍历第一个列表,然后与第二个列表进行比较,使用模板和其他事情...分享整个案例,我们可以提供更好的帮助。