【问题标题】:How to declare a variable for service_facts如何为 service_facts 声明一个变量
【发布时间】:2021-10-07 06:21:09
【问题描述】:

下面是我使用 service_facts 模块检查服务状态的示例 ansible playbook,它运行良好。在这里我需要支持将服务名称定义为变量,但是当我定义它时给出错误,VARIABLE NOT DEFINED:

---
- name: Check service status
  hosts: all
  gather_facts: no
  tasks:
    - name: Service Facts
      service_facts:

    - debug:
        var: ansible_facts.services['firewalld.service']['status']

我需要在任务下方的 vars 部分下声明“firewalld.service”,尝试了各种选项,但没有给出预期的输出。我尝试了以下选项,但它不起作用。

---
- name: Check service status
  hosts: all
  gather_facts: no
  vars:
    - SERVICE: firewalld.service
  tasks:
    - name: Service Facts
      service_facts:

    - debug:
        var: ansible_facts.services[SERVICE]['status']

【问题讨论】:

  • 任务应该是debug: msg: - "{{ ansible_facts.services[SERVICE].status }}"。

标签: variables module ansible


【解决方案1】:

您可以使用conditionals 运行一些任务,例如:

    - name: Get service_facts
    service_facts:

    - name: Open some port
    firewalld:
        port: "{{ some_port }}/tcp"
        permanent: yes
        immediate: yes
        offline: no
        state: enabled
    when: 
        - ansible_facts.services['firewalld.service'].state == 'running'
        - ansible_facts.services['firewalld.service'].status == 'enabled'

【讨论】:

  • 抱歉,我要求通过在名为 SERVICE 的变量中提及“firewalld.service”来概括任务,并在调试部分调用该变量:ansible_facts.services[SERVICE]['status']
【解决方案2】:

只有存在时,service_facts 下才能使用特定服务。如果您想在不知道是否存在的服务上执行任务,那么已经提到的Conditionals 可能会起作用。

- name: Gathering Service Facts
  service_facts:
  tags: remove,stop,disable

- name: Make sure {{ SERVICE }} is stopped and disabled
  systemd:
    name: {{ SERVICE }}
    state: stopped
    enabled: no
  when: ("{{ SERVICE }}" in services)
  tags: remove,stop,disable

- name: Make sure {{ SERVICE }} is removed
  yum:
    name: {{ SERVICE }}
    state: absent
  tags: remove

关于我想补充的评论,你可以做类似的事情

- name: Set facts
  set_fact:
    SERVICE: "firewalld.service" # or "postgresql-10.service" for my working test environment
  tags: facts

- name: Gathering service facts
  service_facts:
  tags: facts

- name: Get facts
  debug:
    msg:
      - "{{ ansible_facts.services[SERVICE].status }}"
  tags: facts

但请注意,您会收到错误提示

The task includes an option with an undefined variable. The error was: 'dict object' has no attribute u'firewalld.service'

如果系统上没有安装firewalld这样的服务。

【讨论】:

  • 抱歉,我要求通过在名为 SERVICE 的变量中提及“firewalld.service”来概括任务,并在调试部分调用该变量:ansible_facts.services[SERVICE]['status']
  • @pugazhendhi,任务应该是debug: msg: - "{{ ansible_facts.services[SERVICE].status }}"。
猜你喜欢
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 2013-05-16
  • 2012-07-30
  • 1970-01-01
相关资源
最近更新 更多