Ansible'da paralel_öğe döngüleri ile çalıştırmanın bir yolu var mı?


12

Ansible 2.2 kullanıyorum, ancak yardımcı olursa yükseltebilirim.

Gördüğüm bu ve oldukça heyecanlı, ama o yanıtlayıcı 'belgelerin bu (veya herhangi) sürüm olması görünmüyor.

Çözmeye çalıştığım problem Centos kutusunda yönetmem gereken 1000 kullanıcı var.

Bu görevi seri olarak çalıştırmak biraz zaman alır. Ve daha da can sıkıcı, her şey değişmiş olarak görünür, çünkü kullanıcı modülündeki "son kullanma tarihi" komutu her zaman değişmiş olarak işaretler.

Bu da umut verici görünüyordu, ama with_items döngüsünde her komutu çalıştırmak için aynı miktarda zaman aldı ve daha hızlı gitmedi (sonuna kadar almak için yeterince beklemek için hiç rahatsız etmedim).

Görevleri atlamak artık çok hızlı (Ansible 2.0'da olduğundan çok daha hızlı), eğer bu işi paralel olarak nasıl yapacağımı anlayamazsam, geri dönüp anlamsız görevleri nasıl atlayacağımı anlayacağım ve başka başarısız olursa, kendi modülümü yazacağım. Ama öyle görünüyor ki Ansible'da tüm bunları daha hızlı yapabilmeliyim.


Paralel olarak çalıştırmak istediğim host_authorizationsşey bu, kullanıcı adları ve diğer verilerin bir listesidir.

  - name: Create/modify OS user accounts
    user: name={{ item.username }} group=sshusers shell=/bin/bash home="/home/selinux-modules/{{ item.username }}" state=present expires={{item.expiredate|default(omit)}}
    with_items: "{{ host_authorizations }}"
    tags: full_maintenance

Lütfen bir kod snippet'i sağlayın. Aksi takdirde yardım etmek zor.
030

@ 030 bir pasaj var, sanırım bağlam için biraz yardımcı oluyor. Gerçekten aynı ana bilgisayarda paralel (görevleri bir döngü içinde) çalıştırmak için bir yol varsa kavramsal olarak ilgileniyorum. Async ile bir ton bireysel şey yapabileceğimi biliyorum, ancak with_items ile o kadar da değil.
Peter Turner

Yani temel olarak 1000 kullanıcının oluşturulması gerekiyorsa, o zaman sadece bir kullanıcı oluşturmak kadar hızlı bitirilmelidir. İlginç, neden LDAP gibi bir şey kullanmıyorsunuz?
030

1
Cidden, bir acı yoluna doğru ilerliyorsunuz, kimsenin yerel hesap tabanı ile bir düzineden fazla hesabı ele aldığını düşünmüyorum, kullanıcı sayısı arttıkça herkesin merkezi bir muhasebe sistemine geçtiğini varsayıyorum, genellikle bazı ldap arka uçları (etkin dizin olabilir) ve sonra bu merkezi tabanın nitelikleri olarak zaman aşımı süresini ve ortak anahtarı ayarlayın, sonra ssh sunucusunun bu merkezi tabandan yetkili anahtarları almasını sağlamak için sss_ssh_authorizedkeys gibi şeyler kullanın.
Tensibai

2
Ben bu ansible ne olduğunu (toplu kullanıcı oluşturma / yönetim yapmaz ipucu) katılmıyorum. Hesapların büyük hacimlerde yerel hesap tabanlarında yönetilmemesi gerektiği noktasında duruyorum (aslında insan hesabı
olmamaları

Yanıtlar:


13

@WebKnja'nın belirttiği gibi, bu asyncmod ile mümkündür . Son zamanlarda kendim keşfettim ve ihtiyaçlarınıza bağlı olarak 3 farklı şekilde kullanabileceğinizi öğrendim.

  1. Çalıştırın ve sonuçları yoklayınpoll:5 , Bu her 5 saniyede bir sonuçları yok edecektir. Bu yöntemle biraz zaman kazanabilirsiniz.

    - name: My long runing task
      some_module_name:
        ip: "{{item.fabric}}"
        username: "{{user}}"
        password: "{{password}}"
        secret: "{{secret}}"
      loop: "{{zoning_list}}"
      register: _alias_vc_0
      async: 60
      poll: 5
    
  2. Ateşle ve unut poll: 0 , Ansible sadece bu görevleri vuruyor çünkü bu çok hızlı bir seçenektir. Aşağı tarafı, görevin sonucunun ne olduğunu bilmiyoruz yani changed: True/False. Tabii ki geribildirim hakkında umursanız bir dezavantaj;).

    name: My long runing task
    some_module_name:
      ip: "{{item.fabric}}"
      username: "{{user}}"
      password: "{{password}}"
      secret: "{{secret}}"
    loop: "{{zoning_list}}"
    register: _alias_vc_0
    async: 60
    poll: 0
    
  3. async_statusÇalıştırın ve unutun , görevin sözdizimi, ek görev gerektirecek olan örnek 2 ile aynıdır async_status. O (normal döngü veya daha hızlı daha sonra nispeten hızlı olduğundan, bu benim favorim execute and poll) ve irade ihtiyacı yeni başa rağmen geri bildirim yakalamaya yarayan registerşunlara ait async_task.

    retries: 20 - başarısız olmadan önce kaç deneme.

    delay: 2 - anketler arasında kaç saniye beklenir.

    - name: My long runing task
      some_module_name:
        ip: "{{item.fabric}}"
        username: "{{user}}"
        password: "{{password}}"
        secret: "{{secret}}"
      loop: "{{zoning_list}}"
      register: _alias_vc_0
      async: 60
      poll: 0
    
    
    - name: Wait for My long running task to finish
      async_status:
        id: "{{ item.ansible_job_id }}"
      register: _jobs_alias_vc_0
      retries: 20
      delay: 2
      until: _jobs_alias_vc_0.finished
      loop: "{{_alias_vc_0.results}}"
    

Dikkat kelimesi , göreve bağlı olarak asyncseçeneği kullanamayabilirsiniz . Aynı kaynak için birden fazla isteği işleyemeyen sistemle etkileşimde bulunduğum örnekler vardı. asyncAynı görevi birden çok ana bilgisayarda gerçekleştirmem gerekirse en iyi seçeneği buldum . Burası en çok "kurtarabildiğim" yerdi.

Soruda Ansible belgelerine bağlantı gönderdiğin için bunu yapmayacağım.


@ chicks poll, örnek 3'te değeri 0 olarak değiştirmek isteyebilirsiniz . Bu inanılmaz bir açıklama !! Thnx.
Debanjan Basu

@DebanjanBasu Herkes önerilen düzenlemeleri yapabilir. İnceleme kuyruklarında onaylayan biri olabilirim, ancak düzenlemenin kendisi için kredi almalısınız.
civcivler

Bir karakter düzenlemesine ne yazık ki izin verilmiyor! :(
Debanjan Basu

2
Seçenek 3 harika çalışıyor, teşekkürler! Yine de bir yorum: en azından Ansible 2.8'den itibaren async_statusgerekli jiddeğildir id.
EdwardTeach

4

Sorunuzu cevaplamak için: Hayır, şu an Ansible döngüleri paralel olarak çalıştıramaz.

Bunun newusersyerine, toplu kullanıcı oluşturma için yapılan kullanmak istiyorum . İçindeki tüm kullanıcılarla bir dosya oluşturun, dosyayı ana bilgisayara kopyalayın ve newusers /path/to/user/listbir commandgörevde çalıştırın .


3

Bunu kullanarak asyncmodu elde etmek mümkündür . Bunun nasıl yapılacağı ile ilgili bazı referansları aşağıda bulabilirsiniz.

refs:

---

- name: Run tasks in parallel
  hosts: localhost
  connection: local
  gather_facts: no
  tasks:
    - name: Pretend to create instances
      command: "sleep {{ item }}"  # Instead of calling a long running operation at a cloud provider, we just sleep.
      with_items:
        - 6
        - 8
        - 7
      register: _create_instances
      async: 600  # Maximum runtime in seconds. Adjust as needed.
      poll: 0  # Fire and continue (never poll)

    - name: Wait for creation to finish
      async_status:
        jid: "{{ item.ansible_job_id }}"
      register: _jobs
      until: _jobs.finished
      delay: 5  # Check every 5 seconds. Adjust as you like.
      retries: 10  # Retry up to 10 times. Adjust as needed.
      with_items: "{{ _create_instances.results }}"

Bu bağlantılar, gelmeye devam edecekleri takdirde soruya cevap verebilirken, gelecekteki okuyucular için cevabınızda hiçbir şey kalmamasına rağmen, lütfen bunun kendi sözcükleriniz / örnekleminizle sorunun çözülmesine nasıl yardımcı olacağını göstermeye çalışın ve bağlantıları yalnızca daha ayrıntılı bilgiler için bırakın.
Tensibai

Evet, A) test edip B.) ilgili kod buraya yerleştirilene kadar cevap olarak işaretleyemem. Ama yine de beni bu yöne yönlendirdiğiniz için teşekkür ederim.
Peter Turner

Üzgünüm, acele ettim :)
webKnjaZ
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.