首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ansible:如何执行一个循环来调用一系列处理程序任务?

Ansible:如何执行一个循环来调用一系列处理程序任务?
EN

Stack Overflow用户
提问于 2022-09-15 13:09:21
回答 1查看 88关注 0票数 1

我对ansible非常陌生,我一直致力于编写ansible角色来自动化Jenkins的增量升级过程。此过程的一部分涉及创建一个循环,该循环在实例上安装的Jenkins当前版本比目标版本更早的情况下执行。

代码语言:javascript
复制
# Install the incremental upgraded version of Jenkins
- name: upgrade and restart jenkins on each iterative upgrade
  yum:
    name: "jenkins-{{ item.jenkins_target_version }}"
    state: present
  when: (jenkins_current_version | float) < "{{ item.jenkins_target_version_filtered }}"
  loop: "{{ packages }}"
  notify: restart jenkins
  when: (jenkins_current_version | float) < jenkins_target_filtered

循环应该循环通过包列表,如下所示

代码语言:javascript
复制
packages:
  - { jenkins_target_version: 2.176-1.1, jenkins_target_version_filtered: 2.176 }
  - { jenkins_target_version: 2.190-1.1, jenkins_target_version_filtered: 2.190 }
  - { jenkins_target_version: 2.204-1.1, jenkins_target_version_filtered: 2.204 }
  - { jenkins_target_version: 2.222-1.1, jenkins_target_version_filtered: 2.222 }
  - { jenkins_target_version: 2.235-1.1, jenkins_target_version_filtered: 2.235 }
  - { jenkins_target_version: 2.249-1.1, jenkins_target_version_filtered: 2.249 }
  - { jenkins_target_version: 2.263-1.1, jenkins_target_version_filtered: 2.263 }
  - { jenkins_target_version: 2.277-1.1, jenkins_target_version_filtered: 2.277 }
  - { jenkins_target_version: 2.289-1.1, jenkins_target_version_filtered: 2.289 }
  - { jenkins_target_version: 2.303-1.1, jenkins_target_version_filtered: 2.303 }
  - { jenkins_target_version: 2.319-1.1, jenkins_target_version_filtered: 2.319 }
  - { jenkins_target_version: 2.332-1.1, jenkins_target_version_filtered: 2.332 }
  - { jenkins_target_version: 2.343-1.1, jenkins_target_version_filtered: 2.343 }
  - { jenkins_target_version: 2.346-1.1, jenkins_target_version_filtered: 2.346 }

并且,只有在目标系统上安装版本时,它才是比当前安装的版本新的迭代。循环似乎工作正常,并在目标实例上安装jenkins的升级,问题是,每当jenkins升级时,我都想执行一系列处理程序任务。

处理程序是存储在处理程序文件夹中的一系列任务,这些任务重新启动服务并检查事物是否备份和运行是否正常(除其他事项外)。问题是,每次迭代升级完成后,都不会调用和执行处理程序任务。我正在寻求建议,我如何才能做到这一点,谢谢提前。

EN

回答 1

Stack Overflow用户

发布于 2022-09-15 18:36:48

问:“我想执行一系列处理程序任务。”

答:使用关键字选择更多的任务。例如,给定处理程序

代码语言:javascript
复制
shell> cat handlers/restart_jenkins.yml
- debug:
    msg: Restart service
  listen: restart jenkins

- debug:
    msg: Check that things are back up and running ok
  listen: restart jenkins

- debug:
    msg: |-
      Do whatever you want next
      {{ out.results|json_query('[].stdout') }}
  listen: restart jenkins

剧本

代码语言:javascript
复制
- hosts: test_11
  gather_facts: false
  vars:
    packages:
      - {target: 2.176-1.1, current: 2.176}
      - {target: 2.190-1.1, current: 2.190}
      - {target: 2.204-1.1, current: 2.205}
  tasks:
    - command: "echo install {{ item.target }}"
      register: out
      notify: restart jenkins
      loop: "{{ packages }}"
      when: item.current is version(item.target, "<")
    - meta: flush_handlers
    - debug:
        msg: Continue ...
  handlers:
    - import_tasks: handlers/restart_jenkins.yml

给出

代码语言:javascript
复制
PLAY [test_11] *******************************************************************************

TASK [command] *******************************************************************************
changed: [test_11] => (item={'target': '2.176-1.1', 'current': 2.176})
changed: [test_11] => (item={'target': '2.190-1.1', 'current': 2.19})
skipping: [test_11] => (item={'target': '2.204-1.1', 'current': 2.205}) 

TASK [meta] **********************************************************************************

RUNNING HANDLER [debug] **********************************************************************
ok: [test_11] => 
  msg: Restart service

RUNNING HANDLER [debug] **********************************************************************
ok: [test_11] => 
  msg: Check that things are back up and running ok

RUNNING HANDLER [debug] **********************************************************************
ok: [test_11] => 
  msg: |-
    Do whatever you want next
    ['install 2.176-1.1', 'install 2.190-1.1']

TASK [debug] *********************************************************************************
ok: [test_11] => 
  msg: Continue ...

PLAY RECAP ***********************************************************************************
test_11                    : ok=5    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

备注:

  • 在循环中安装新版本的用例没有意义。这里的剧本唯一的目的是演示handlers.
  • Flush的功能--处理程序--如果您不想等到剧本结束时再看.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73731755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档