Ansible 语法问题:将循环列表项与内联条件子句相结合

Ansible 语法问题:将循环列表项与内联条件子句相结合

我正在尝试在 Ansible 剧本中写入一些检查,以检查和报告给定服务器上主要正在运行的服务的状态。相关代码如下:

用于测试目的的变量:

services: "{{ ['haproxy', 'keepalived'] if server_role == 'haproxy' }}"

第一个任务循环遍历服务中的每个项目,并将检查服务器状态的结果记录为列表:

- name: Check Initial Service Status
  command: "systemctl is-active {{ item }}"
  register: service_status_before
  ignore_errors: yes
  loop: "{{ services }}"
  loop_control:
    loop_var: item
  when: server_role != 'n/a'

这样做没有问题,并且将与命令相关的所有信息正确记录到列表项中。第二个任务应该循环遍历先前注册的列表中的每个项目,并显示一条消息 - 包括其本身的名称,具体取决于 stdout 的内容,这里是我遇到问题的地方:

- name: "Display Initial Service Status"
  debug:
    msg: '{{ "item.item - Service running" if "active" in item.stdout else "item.item - Service is NOT running!" }}'
  loop: "{{ service_status_before.results }}"
  loop_control:
    loop_var: item
  when: server_role != 'n/a'

这给了我以下输出:

"msg": "item.item - Service running"

我已经尝试了几乎所有我能想到的单引号/双引号和花括号的组合,但要么项目名称无法翻译(下面的实例直接与上面的代码片段配对),要么我可以成功评估变量,但条件子句的其余部分被逐字打印:

  "msg": "'haproxy - Service running' if 'active' in item.stdout else 'haproxy - Service is NOT running!'"
      "msg": "'keepalived - Service running' if 'active' in item.stdout else 'keepalived - Service is NOT running!'"

有人能告诉我我做错了什么吗?我正在努力寻找我认为我还没有尝试过的语法组合。

谢谢。

答案1

将服务放入字典中。例如,

  services:
    haproxy: [docker, haproxy, keepalived]
    default: []

鉴于测试库存

shell> cat hosts
localhost server_role=haproxy

以下任务将迭代服务列表,获取活动状态,并将结果注册到变量中服务状态之前

    - command: "systemctl is-active {{ item }}"
      register: service_status_before
      ignore_errors: yes
      loop: "{{ services[server_role]|d(services.default) }}"

声明服务的字典及其活动状态

  services_inactive: "{{ service_status_before.results|
                         items2dict(key_name='item', value_name='failed') }}"

例如,

  services_inactive:
    docker: false
    haproxy: true
    keepalived: true

现在,这份报告微不足道

    - debug:
        msg: "{{ item.key }} {{ item.value|ternary('is NOT', 'is') }} running."
      with_dict: "{{ services_inactive }}"

给出(节选)

  msg: docker is running.
  msg: haproxy is NOT running.
  msg: keepalived is NOT running.

完整测试剧本的示例

- hosts: all

  vars:

    services:
      haproxy: [docker, haproxy, keepalived]
      default: []

    services_inactive: "{{ service_status_before.results|
                           items2dict(key_name='item', value_name='failed') }}"

  tasks:

    - debug:
        var: server_role

    - command: "systemctl is-active {{ item }}"
      register: service_status_before
      ignore_errors: yes
      loop: "{{ services[server_role]|d(services.default) }}"

    - debug:
        var: services_inactive

    - debug:
        msg: "{{ item.key }} {{ item.value|ternary('is NOT', 'is') }} running."
      with_dict: "{{ services_inactive }}"

答案2

现在发现了一个使用连接的有效一行修复程序,如下所示:

- name: "Display Initial Service Status"
  debug:
     msg: '{{ item.item ~ " - Service running" if "active" in item.stdout else item.item ~ " - Service is NOT running!" }}'**
  loop: "{{ service_status_before.results }}"
  loop_control:
    loop_var: item
  when: server_role != 'n/a'

相关内容