ansible: using with_items with notify handler

后端 未结 4 1767
再見小時候
再見小時候 2020-12-09 18:35

I want to pass a variable to a notification handler, but can\'t find anywhere be it here on SO, the docs or the issues in the github repo, how to do it. What I\'m doing is d

相关标签:
4条回答
  • 2020-12-09 19:02

    I finally solved it by splitting the apps out over multiple instances of the same role. This way, the handler in the role can refer to variables that are defined as role variable.

    In site.yml:

    - hosts: localhost
      roles:
      - role: something
        name: a
      - role: something
        name: b
    

    In roles/something/tasks/main.yml:

    - name: do something
      shell: "echo {{ name }}"
      notify: something happened
    
    - name: do something else
      shell: "echo {{ name }}"
      notify: something happened
    

    In roles/something/handlers/main.yml:

    - name: something happened
      debug:
        msg: "{{ name }}"
    

    Seems a lot less hackish than the first solution!

    0 讨论(0)
  • 2020-12-09 19:10

    Variables in Ansible are global so there is no reason to pass a variable to handler. If you are trying to make a handler parameterized in a way that you are trying to use a variable in the name of a handler you won't be able to do that in Ansible.

    What you can do is create a handler that loops over a list of services easily enough, here is a working example that can be tested locally:

    - hosts: localhost
      tasks:
      - file:  >
          path=/tmp/{{ item }}
          state=directory
        register: files_created
        with_items:
          - one
          - two
        notify: some_handler
    
      handlers:
        - name: "some_handler"
          shell: "echo {{ item }} has changed!"
          when: item.changed
          with_items: files_created.results
    
    0 讨论(0)
  • 2020-12-09 19:12

    To update jarv's answer above, Ansible 2.5 replaces with_items with loop. When getting results, item by itself will not work. You will need to explicitly get the name, e.g., item.name.

    - hosts: localhost
      tasks:
      - file:  >
          path=/tmp/{{ item }}
          state=directory
        register: files_created
        loop:
          - one
          - two
        notify: some_handler
    
      handlers:
        - name: "some_handler"
          shell: "echo {{ item.name }} has changed!"
          when: item.changed
          loop: files_created.results
    
    0 讨论(0)
  • 2020-12-09 19:21

    I got mine to work like this - I had to add some curly brackets

    tasks:
        - name: Aktivieren von Security-, Backport- und Non-Security-Upgrades
          lineinfile:
            path: /etc/apt/apt.conf.d/50unattended-upgrades
            regexp: '^[^"//"]*"\${distro_id}:\${distro_codename}-{{ item }}";'
            line: '        "${distro_id}:${distro_codename}-{{ item }}";'
            insertafter: "Unattended-Upgrade::Allowed-Origins {"
            state: present
          register: aenderung
          loop:
            - updates
            - security
            - backports
          notify: Auskommentierte Zeilen entfernen
    
        handlers:
            - name: Auskommentierte Zeilen entfernen
              lineinfile:
                path: /etc/apt/apt.conf.d/50unattended-upgrades
                regexp: '^\/\/.*{{ item.item }}";.*'
                state: absent
              when: item.changed
              loop: "{{ aenderung.results }}"
    
    0 讨论(0)
提交回复
热议问题