Ansible: Bagaimana menjalankan satu Host Tugas oleh Host?

15

Pada level permainan, kami harus serial: 1mengizinkan kami menjalankan seluruh permainan satu host pada satu waktu. Tetapi saya belum menemukan cara sederhana untuk melakukan ini pada satu tugas. Ini sangat relevan, jika tugas tersebut tidak melakukan penguncian yang tepat (untuk alasan apa pun).

Satu jawaban yang jelas adalah menempatkan tugas dalam permainannya sendiri. Tapi itu tidak membantu dengan peran. (Harus serial: 1bermain menggunakan peran itu tidak terlalu intuitif.)

Elrond
sumber

Jawaban:

11

Jika Anda tidak ingin adanya paralelisme dalam melakukan langkah-langkah di buku pedoman Anda, setel tingkat garpu menjadi 1:

ansible-playbook --forks=1 ...

Anda juga dapat meletakkan ini di file cfg Anda yang sudah ada:

[defaults]
forks=1

tetapi jika Anda menginginkannya secara individual, gunakan opsi baris perintah di atas.

EDIT:

serial: 1melakukan sesuatu yang sama sekali berbeda: itu seperti menjalankan playbook untuk setiap host secara bergantian, menunggu penyelesaian playbook lengkap sebelum pindah ke host berikutnya. forks=1berarti menjalankan tugas pertama dalam permainan pada satu host sebelum menjalankan tugas yang sama pada host berikutnya, sehingga tugas pertama akan dijalankan untuk setiap host sebelum tugas berikutnya disentuh.

Jadi, Anda forks=1hanya ingin sekali bermain; sayangnya itu saat ini tidak memungkinkan.

Wurtel
sumber
2
Saya tidak ingin mengatur ini di seluruh buku pedoman. Itu banyak non-granular. serial: 1ayo kita atur setidaknya pada permainan. Tapi saya hanya ingin mengaturnya di subtitle dari sebuah drama (apa nama yang benar itu. Saya pikir, itu adalah "tugas", tetapi komentar di atas tampaknya tidak setuju).
Elrond
3
serial: 1melakukan sesuatu yang sama sekali berbeda: itu seperti menjalankan playbook untuk setiap host secara bergantian, menunggu penyelesaian playbook lengkap sebelum pindah ke host berikutnya. forks=1berarti menjalankan tugas pertama dalam permainan pada satu host sebelum menjalankan tugas yang sama pada host berikutnya, sehingga tugas pertama akan dijalankan untuk setiap host sebelum tugas berikutnya disentuh. Jadi, Anda forks=1hanya ingin sekali bermain; sayangnya itu saat ini tidak memungkinkan.
Wurtel
Poin bagus! Maukah Anda menambahkan itu ke jawabannya?
Elrond
2

Ada solusi untuk masalah ini - seseorang dapat meneruskan daftar host (atau grup) ke with_items, dan kemudian digunakan delegate_todengan daftar ini. Tugas ini akan dijalankan oleh tuan rumah oleh tuan rumah.

Sebagai contoh:

- name: start and enable rabbitmq (run task host by host)
  service:
    name: "rabbitmq-server"
    state: "started"
    enabled: true
  delegate_to: "{{ item }}"
  with_items: "{{ groups['rabbitmq-cluster'] }}"
  run_once: true
Tomasz Klosinski
sumber
Bagi mereka yang bertanya-tanya mengapa run_once: trueada di sana, cobalah mengeluarkannya. Anda tidak akan menyukai apa yang terjadi. (begitu banyak berjalan berulang-ulang
aaaahhhh
1

Jika Anda menjalankannya pada satu mesin, maka masalah kunci eksklusif muncul untuk lebih dari satu host. Jadi, Anda harus mengeksekusi satu per satu untuk semua host. Untuk ini, Anda harus --forks=1menyetel saat memanggil perintah playbook yang dimungkinkan. Contoh: di ansible-playbook webserver.yml --forks=1mana webserver.yml memiliki app01 dan app02 di dalam Anda[webserver]

Rohan Seth
sumber
0

Pikirkan apa yang Anda inginkan

run_once: true

pengguna19151
sumber
4
nggak: "run_once: true" artinya menjalankan tugas untuk satu host di daftar host. Saya ingin menjalankannya untuk setiap host dalam daftar, tetapi satu demi satu.
Elrond
0

Untuk perintah yang dapat dijalankan secara lokal, gunakan satu loop untuk beralih ke semua host dalam permainan. Ini HANYA berfungsi jika perintah dapat dijalankan secara lokal. Anda juga bisa menjalankan perintah dengan ssh di dalamnya ke mesin jarak jauh satu per satu dengan cara ini, jika kunci sudah diatur, tetapi menjadi sulit ketika berbicara tentang eskalasi.

MISALNYA:

- name: Init New Appliances - Remove the known hosts entry for the server in case it has changed
  run_once: yes
  connection: local
  become: no
  command: "ssh-keygen -R {{ item }}"
  with_items:
  - "{{ inventory_hostname }}"
Michele
sumber
1
Anda harus memberikan daftar host bukan hanya pada host yang bernama inventory_hostname, jika tidak, loop tidak masuk akal.
Konstantin Suvorov