【问题标题】:Ansible define a custom service path and notify only if the service is restartedAnsible 定义自定义服务路径,仅在服务重启时才通知
【发布时间】:2015-03-13 20:05:39
【问题描述】:

我正在 AIX 上进行新的 opsware 代理服务检查,它的代理路径是 /etc/rc.d/init.d/opsware-agent。

首先请告诉我如何定义这个变量路径并调用服务。

其次,仅当此 opsware 代理服务已重新启动时,它才应运行该命令。怎么做,因为下面的一个不起作用。

- name: Ensure Opsware agent is running on AIX 
service: name={{ aix_service_path }} state=started enabled=yes
register: aix_status


 - name: Opsware AIX Notify only if it failed
 when: aix_status|success
 notify:
 - hardware refresh
 - software refresh

- name: hardware refresh
command: chdir=/opt/opsware/agent/pylibs/cog/ ./bs_hardware

- name: software refresh
command: chdir=/opt/opsware/agent/pylibs/cog/ ./bs_Software

【问题讨论】:

    标签: ansible ansible-playbook


    【解决方案1】:

    让我假设 YML 格式是正确的,只是在您的帖子中被破坏了。否则,您首先需要正确缩进。

    然后确保您的处理程序在 handlers/main.yml 内。在您的帖子中,看起来所有内容都在同一个文件中,然后当然会在每次播放时执行。

    最后你可以在服务任务中触发你的处理程序,不需要虚拟任务,这也不起作用,因为实际上没有定义任何动作。

    所以这应该有效:

    your_role/tasks/main.yml:

    ---
    
    - name: Ensure Opsware agent is running on AIX 
      service: name={{ aix_service_path }} state=started enabled=yes
      notify:
      - hardware refresh
      - software refresh
    
    ...
    

    your_role/handlers/main.yml:

    ---
    
    - name: hardware refresh
      command: chdir=/opt/opsware/agent/pylibs/cog/ ./bs_hardware
    
    - name: software refresh
      command: chdir=/opt/opsware/agent/pylibs/cog/ ./bs_Software
    
    ...
    

    只有当服务状态为changed时才会通知处理程序。

    您如何定义aix_service_path 取决于您要归档的内容。你可以在your_role/defaults/main.yml中定义一个默认值:

    ---
    
    aix_service_path: foo
    
    ...
    

    或者通过在your_role/vars/main.yml 中定义它来强制它 - 与上面的默认格式相同。

    您可以在剧本中的角色调用中传递参数,例如

      roles:
        - role: your_role
          aix_service_path: foo
    

    这样传递的参数将覆盖defaults/main.yml 中的定义,但不会覆盖vars/main.yml 中定义的定义。

    您可以在 playbook 的 vars 部分中定义它。

    您可以在调用 playbook 时通过命令行传递它。

    ansible-playbook ... --extra-vars "aix_service_path=foo"
    

    或将其定义为服务器或组变量。您也可以在清单中定义变量......确实有很多用于定义变量的选项。您必须决定哪个适合您的需求。查看variables section in the Ansible docs了解更多详情。

    【讨论】:

    • 谢谢。关于 "role: your_role" 在 /vars/main.yml 中定义了一个角色后,我应该在哪里调用这个角色?我的意思是我应该在 /tasks/main.yml 中调用这个角色吗?如果是,该怎么做。
    • 角色将在您的剧本中被引用。建议您的剧本中没有任务,而只有角色,角色中的所有任务。看看docs.ansible.com/playbooks_roles.html#roles
    • 在这里你可以看到一个基本的目录结构,包括一个示例角色:docs.ansible.com/playbooks_best_practices.html#directory-layout
    • @udondan 处理程序可以在同一个 playbook 文件中,只要它们在 handlers: 块下。见docs.ansible.com/…
    • 是的,但除了剧本中的角色,我们什么都不喜欢,不是吗? :D
    猜你喜欢
    • 2021-01-27
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多