0

我必须从 mysql 查询中获取两个数组,并且我想进行主机比较。例如 mysql 结果的结果类似于 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'}]) 

我怎样才能解决这个问题 ?

4

1 回答 1

0

您是在使用其他列表还是应该使用其他列表 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 模板。
  • 有时最好为任务创建参数以在循环中阐明变量的属性
  • 您可以将信息设置为变量或附加到列表,而不是使用调试
  • 请注意始终使用更好的数据变化和使用来测试您的代码,blockrescue防止致命的运行时错误。

我真的不知道你在做什么,但你可以通过使用选择过滤器来改进你的代码,包括一个任务文件,同时循环第一个列表,然后与第二个列表进行比较,使用模板和其他东西......案例,我们可以提供更好的帮助。

于 2021-03-30T05:21:54.597 回答