Rollerde tanımlanan Ansible işleyicileri, tüm oyun kitabından veya rolden sonra mı çalışıyor?


13

Ansible 2.0 kullanıyorum ve bunu sadece çalıştırabilirdim, ama aynı zamanda deneysel testlerim tarafından doğru olmayan bir şeye inanmak için kandırılmış olabilirim ve işleyicilerin ne zaman çalıştırılması gerektiğini söyleyecek hiçbir belge bulamıyorum.

Eğer işleyiciler görevlerinin sonunda çalıştırılmazsa, bu benim muammamdır. İçinde 5 rol olan bir oyun kitabım var, sonuna 4. rolün işleyicilerinin başlamadan önce tamamlanması gereken 6 rol eklemek istiyorum.

Ansible'ı başka bir şey yapmadan önce tamamlanmış bir işleyiciye (yani tamamen tamamlanmış bir rol) güvenmek için çalıştırmanın herhangi bir yolu var mı yoksa işleyicileri yanlış mı kullanıyorum?

Yanıtlar:


17

İşleyiciler yürütülür:

  • bir oyunun sonunda (oyun kitabı değil)
  • meta: flush_handlersgörevi yerine getirirken

Yani " sonuna 4. rol işleyicileri olması gereken 6 rol eklemek için " gerekir:

  • rol atamasını ayrı oyunlara bölmek;
  • veya bir meta görev ekleyin ve 6. rolü include_rolemodüle ekleyin :

    roles:
      - role4
    tasks:
      - meta: flush_handlers
      - include_role:
          name: role6
    

Kullanım durumunuz için, include_rolemodül hala çok taze ve kullanırken gariplikler olduğu için ilk yöntemi öneririm (SO'daki bu soruya bakın ).


Ayrıca, işleyicilerin adlarının ve dinleme çağrılarının global olduğunu unutmayın, bu nedenle aynı isme sahip olmaları ve her iki rolün de tek bir oyunda atanmaları durumunda, ayrı rollerdeki iki işleyici çatışacaktır. (ref. Handlers: Değişken İşlemleri Çalıştırma )

İşleyicilere [] genel olarak benzersiz bir adla başvurulur ve bildiriciler tarafından bildirilir. [] bir işleyici, belirli bir oyunda tüm görevler tamamlandıktan sonra yalnızca bir kez çalışır.

İşleyici adları ve dinleme konuları genel bir ad alanında yayınlanır.


  • Ampirik kanıt (işleyicilerin oyunun sonunda yürütüldüğünü doğrulamak için bu kabuk komut dosyasını çalıştırın - burada çelişkili yorumlar ve cevaplar vardı):

    #!/bin/bash
    
    mkdir -p ./sf831880/roles/role1
    mkdir -p ./sf831880/roles/role1/handlers
    mkdir -p ./sf831880/roles/role1/tasks
    mkdir -p ./sf831880/roles/role2
    mkdir -p ./sf831880/roles/role2/handlers
    mkdir -p ./sf831880/roles/role2/tasks
    
    cat >./sf831880/roles/role1/tasks/main.yml <<TASKS1_END
    ---
    - name: Always true in role1
      command: echo role1
      notify: handler1
    TASKS1_END
    
    cat >./sf831880/roles/role2/tasks/main.yml <<TASKS2_END
    ---
    - name: Always true in role2
      command: echo role2
      notify: handler2
    TASKS2_END
    
    cat >./sf831880/roles/role1/handlers/main.yml <<HANDLERS1_END
    ---
    - name: handler1
      debug:
        msg: "This is a handler in role1"
    HANDLERS1_END
    
    cat >./sf831880/roles/role2/handlers/main.yml <<HANDLERS2_END
    ---
    - name: handler2
      debug:
        msg: "This is a handler in role2"
    HANDLERS2_END
    
    cat >./sf831880/playbook.yml <<PLAYBOOK_END
    ---
    - hosts: localhost
      gather_facts: no
      connection: local
      roles:
        - role1
        - role2
      tasks:
        - debug:
            msg: "This is a task in a play"
    PLAYBOOK_END
    
    ansible-playbook ./sf831880/playbook.yml
    

    Sonuç:

    PLAY [localhost] ***************************************************************
    
    TASK [role1 : Always true in role1] ********************************************
    changed: [localhost]
    
    TASK [role2 : Always true in role2] ********************************************
    changed: [localhost]
    
    TASK [debug] *******************************************************************
    ok: [localhost] => {
        "msg": "This is a task in a play"
    }
    
    RUNNING HANDLER [role1 : handler1] *********************************************
    ok: [localhost] => {
        "msg": "This is a handler in role1"
    }
    
    RUNNING HANDLER [role2 : handler2] *********************************************
    ok: [localhost] => {
        "msg": "This is a handler in role2"
    
  • Oyun, aşağıdakileri içerecek şekilde değiştirildi meta: flush_handlers:

    ---
    - hosts: localhost
      gather_facts: no
      connection: local
      roles:
        - role1
        - role2
      tasks:
        - meta: flush_handlers
        - debug:
            msg: "This is a task in a play"
    

    Sonuç:

    PLAY [localhost] ***************************************************************
    
    TASK [role1 : Always true in role1] ********************************************
    changed: [localhost]
    
    TASK [role2 : Always true in role2] ********************************************
    changed: [localhost]
    
    RUNNING HANDLER [role1 : handler1] *********************************************
    ok: [localhost] => {
        "msg": "This is a handler in role1"
    }
    
    RUNNING HANDLER [role2 : handler2] *********************************************
    ok: [localhost] => {
        "msg": "This is a handler in role2"
    }
    
    TASK [debug] *******************************************************************
    ok: [localhost] => {
        "msg": "This is a task in a play"
    

2

İşleyiciler, genel olarak benzersiz bir adla başvurulan ve bildiriciler tarafından bildirilen normal görevlerden gerçekten farklı olmayan görev listeleridir. Hiçbir şey bir işleyiciyi bilgilendirmezse, çalışmaz. Kaç işin bir işleyiciyi bilgilendirdiğine bakılmaksızın, belirli bir oyunda tüm görevler tamamlandıktan sonra yalnızca bir kez çalışır. ansible doc

1) Aynı şeyi yapan işleyiciler aynı şekilde adlandırılmalıdır.
restart nginxDAİMA nginx'i yeniden başlatır, değil handler1vehandler2

2) İşleyiciler bölümlerinizin kapsamındaki bir oyunun sonunda "Oynat" ın sonunda çalıştırılır.

3) Yeniden başlatılması gereken görevler için registerve whenişlevlerini kullanırdım, bu varlığın yanınızda taşıması gerektiğini unutmayın.

Kod Kaynağı

PLAY [localhost] ***************************************************************

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "Play 1"
}

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role2 : Run if change in task c of role 1] *******************************
changed: [localhost]

TASK [role2 : Always true in role2] ********************************************
changed: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "This is a task in a play"
}

RUNNING HANDLER [role1 : handler] **********************************************
ok: [localhost] => {
    "msg": "This is a handler in role1"
}

PLAY [localhost] ***************************************************************

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "Play 2"
}

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role1 : Always true in role1] ********************************************
changed: [localhost]

TASK [role2 : Run if change in task c of role 1] *******************************
changed: [localhost]

TASK [role2 : Always true in role2] ********************************************
changed: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "This is a task in a play"
}

RUNNING HANDLER [role1 : handler] **********************************************
ok: [localhost] => {
    "msg": "This is a handler in role1"
}

PLAY RECAP *********************************************************************
localhost                  : ok=20   changed=14   unreachable=0    failed=0

Aynı görevi yapmanın birçok yolu. İşleyiciler, web sitelerinin, SSL sertifikalarının ve hizmetin yeniden başlatılmasını gerektiren diğer görevlerin bulunduğu bir nginx sunucusunda birden çok değişiklik yapılması gibi aynı işlemin birden çok kez yeniden başlatılmasını önlemek için tasarlanmıştır.


" Belirli bir oyunda tüm görevler tamamlandıktan sonra yalnızca bir kez çalıştırın " ve sonra tamamen farklı bir şey olduğunu iddia edersiniz " her rolün sonunda bir görev yürüt ". İddianız da gerçeklikten farklı.
techraf

hayır yanlış anlıyorum, ben aynı işleyiciyi meta rolünden sunucudan 4 kez çağırırsam. sadece bir kez çalışır
Jacob Evans

Soru açık: işleyiciler ne zaman çalışıyor? Kaç kez çalıştırıldıklarını değil. Ve bir oyunun sonunda, bir rolün sonunda değil, yönetilirler. Dönemi. Bu iddiayı yanlış gösteren örneklerle cevabımı gönderdikten sonra yapmış olsanız bile, başka türlü iddia eden üçüncü bir kişisiniz.
techraf

ve cevabım, rolleri içinde yeniden başlatılması gereken öğeler için işleyicileri değil görevleri kullanmaktır.
Jacob Evans

@techraf oradasınız.
Jacob Evans
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.