ansible覆盖变量取决于结果

时间:2017-06-22 16:47:40

标签: ansible

我在ansible playbook中运行了几个shell命令,可能会也可能不会修改配置文件。

剧本中的一个项目是重启服务。但是如果设置了变量,我只想这样做。

我打算在每个shell任务中注册一个结果,但我不想覆盖该变量,如果它已经设置为' restart_needed'或类似的东西。

这个想法是重启应该是最后的事情,如果任何命令设置了restart变量,它将会运行,如果它们都没有,那么服务将不会重新启动。这是我到目前为止的一个例子......

tasks:
  - name: Make a backup copy of file
    copy: src={{ file_path }} dest={{ file_path }}.{{ date }} remote_src=true owner=root group=root mode=644 backup=yes

  - name: get list of items
    shell: |
      grep <file>
    register: result

  - name: output will be 'restart_needed'
    shell: |
      NUM=14"s"; if [ "${NUM}" != "s" ]; then sed -i "${NUM}/no/yes/g" {{ file_path }}; echo "restart_needed"; else echo "nothing_changed" ; fi
    with_items: "{{ result.stdout_lines }}"
    register: output

  - name: output will be 'nothing_changed'
    shell: |
      NUM="s"; if [ "${NUM}" != "s" ]; then sed -i "${NUM}/no/yes/g" {{ file_path }}; echo "restart_needed"; else echo "nothing_changed" ;; fi 
    with_items: "{{ result.stdout_lines }}"
    register: output

  - name: Restart  service
    service: name=myservice enabled=yes state=restarted

在上面的示例中,变量输出将在第一个任务之后设置为restart_needed,但随后将更改为&#39; nothing_changed&#39;在第二个任务中。

我想将变量保持在&#39; restart_needed&#39;如果它已经存在,那么只有当变量设置为restart_needed时才启动重启服务任务。

谢谢!

1 个答案:

答案 0 :(得分:1)

要触发重启,您有两种选择:the when statementhandlers

语句示例时:

tasks:
  - name: check if string "foo" exists in somefile
    shell: grep -q foo somefile
    register: result

  - name: restart service
    service:
      name: myservice
      enabled: yes
      state: restarted
    when: result.rc == 0

处理程序示例:

tasks:
  - name: check if string "foo" exists in somefile
    shell: grep -q foo somefile
    register: result
    changed_when: "result.rc == 0"
    notify: restart service

handlers:
  - name: restart service
    service:
      name: myservice
      enabled: yes
      state: restarted