Ansible - 测试命令输出是否缺少项目

Ansible - 测试命令输出是否缺少项目

我有一个我期望在某些命令的输出中出现的字符串列表。如何创建一个 ansible 脚本来测试并(如果不包含一个或多个条目)执行任务?

所以我的 ansible 脚本可能如下所示:

vars:
  musthave:
    - value1
    - value2
tasks:
- name: Check the configured values
  command: "cat configfile"
  register: current_configuration
  changed_when: false

- set a variable if one or more of the musthave's are missing in current_configuration.stdout
  ...

- name: Execute task to reconfigure system
  command: "reconfigure..."
  when: true = variable

那么有没有类似的东西

variable = false
for s in musthave:
    if not s in current_configuration.stdout:
        variable |= true

答案1

要解决这个问题,不需要中间变量。根据Ansible 文档,使用difference过滤器选择必须具有的值列表与配置文件的输出之间的差异。

变量:
  一定有:
    - 值1
    - 值2

任务:
- name:检查配置值
  命令:“seq -f '值%g' 2 1 5”
  注册:当前配置
  更改时间:假

- 调试:var=current_configuration.stdout_lines

- 名称:执行任务以重新配置系统
  调试:msg =“{{必须有|差异(current_configuration.stdout_lines)}}”
  何时:必备|差异(当前配置.stdout_lines)

debug仅当差异不为空时才执行最后一个任务。

答案2

我最初的请求是检查命令输出中是否存在可能出现的特定值。准备一个工作列表difference是一个缺点,副作用是你可以计算两个方向的差异。

所以现在我不仅可以检查缺失的条目,还可以检查过多的条目。

- name: print hostvars
  debug:
    var: hostvars[{{ ansible_host }}]['certificate_domains']

- name: print certificate
  delegate_to: silver.fritz.box
  command: "openssl x509 -in /home/hiran/homeserver.crt -noout -text"
  register: certificate

- name: grab subject's common name and alternative names
  set_fact:
    commonName: "{{ certificate.stdout | regex_search('Subject.*CN\\s=\\s([\\.a-zA-Z]+)', '\\1') }}"
    altNames: "{{ certificate.stdout | regex_findall('DNS:([\\.a-zA-Z]+)') }}"
- name: prepare the lists so they can be subtracted from each other
  set_fact:
    contained: "{{ (commonName + altNames) | unique }}"
    musthave: "{{ hostvars[{{ ansible_host }}]['certificate_domains'] | unique }}"
- name: calculate differences
  set_fact:
    missing: "{{ musthave | difference(contained) }}"
    toomuch: "{{ contained | difference(musthave) }}"

- name: show difference
  debug:
    msg: Something is wrong
  when: (missing | length)>0 or (toomuch | length)>0

相关内容