
我正在尝试在 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'