如何从Ansible的输出中找到丢失的号码

时间:2018-11-13 04:11:55

标签: ansible

我的播放列表包含以下内容

- set_fact:
    missnu={{out.stdout_lines}}
  register: missnu

- debug: msg={{missnu}}

我的输出低于输入值,

TASK [debug] **********************
ok: [192.168.0.10] => {
"msg": [
    "1 2 3 4"
]
}

这是预期的结果,但是我想找到这个缺失的数字。 意思是如果结果是"1 2 4""2 3 4""2 4",我将如何得到那些缺失的数字?

2 个答案:

答案 0 :(得分:0)

您正在从某些命令打印标准输出,但我假设您知道预期的结果并将其存储在某个位置的变量中。为此,我将使用difference过滤器。

- hosts: localhost
  vars:
    sample_out_ml: [ 1, 2, 3, 4 ]
    sample_out_sl: "1 2 3 4"
    expected: [ 1, 2, 3 ,4 ,5 ]
  tasks:

  - name: Show difference when cmd outputs multi-line
    debug:
      msg: "{{ expected | difference(sample_out_ml) }}"

  - name: Show difference when cmd outputs on single line
    debug:
      msg: "{{ expected | difference(sample_out_sl.split(' ') | map('int') ) }}"

编辑根据您的评论,我提供了一个有关如何执行此操作的更可靠的示例。如果您要全心投入Ansible,则应尝试避免使用command模块。希望这会有所帮助。

答案 1 :(得分:0)

尝试下面的代码(这是一个简单的python代码),它对我有用。我设定要测试的极限值在6以下,您可以根据自己的要求进行更改。 因此,通过此操作,您从out.stdout.lines获得的数字将从您设置的限制中删除(6或所需的任何数字),并显示剩余的数字。

- name: Getting Missing Numbers
   shell: python -c "ma = {{ out.stdout_lines }}; num = [int(i) for i in ma[0].split()]; mn = list(set(range(1, 6 + 1)) - set(num)); print(mn)"
  register: mynu

- debug: msg={{mynu.stdout}}