Wayang: Menjalankan perintah shell ketika file (atau paket) diperbarui

8

Saya ingin menjalankan mysql_tzinfo_to_sqlsetiap kali paket tzinfo (di Ubuntu Server) berubah. Saya pikir Wayang dapat mengatasi hal ini.

Saya pikir salah satu Wayang akan bereaksi terhadap perubahan dalam versi paket, atau jika tidak, maka perubahan cap waktu dari file yang terkandung dalam paket.

Satu-satunya cara saya bisa melihat untuk melakukan ini adalah memiliki sumber daya tanpa tindakan langsung, dan memiliki eksekutif tergantung padanya.

Pertanyaan yang saya miliki adalah:

  1. Apakah mungkin untuk mendefinisikan file yang hanya digunakan untuk Memberitahu sumber daya lain (seperti exec )?
  2. Apakah mungkin untuk menentukan sumber daya paket sehingga sumber daya lain (seperti exec ) diaktifkan ketika paket berubah atau diperbarui?
  3. Apakah mungkin untuk mendefinisikan sumber daya exec yang menjalankan baris perintah shell (dengan pipa dan pengalihan misalnya) daripada perintah dari sistem file?

Jika disatukan, rasanya luar biasa.

FOLLOWUP : Jawaban yang fantastis! Demi kelengkapan (dan untuk catatan), saya harus mencatat hal berikut:

  1. Perintah shell lengkap yang menarik adalah mysql_tzinfo_to_sql | mysql -u root -p password (memuat tzinfo ke dalam database MySQL untuk penggunaan MySQL).
  2. Pengauditan /etc/tzinfoakan sia-sia karena ini hanyalah konfigurasi zona waktu lokal; tujuannya adalah untuk melihat perubahan dalam data tzinfo itu sendiri (dengan demikian mengawasi /usr/share/zoneinfo).
  3. Demikian juga, isinya akan menjadi hal yang salah untuk ditonton - karena mereka kemungkinan tidak akan berubah; yang terbaik adalah menonton mtime atau semua karena filetimes harus berubah setelah setiap pembaruan tzinfo.

Juga, James Turnbull menulis semua tentang audit ketika diperkenalkan. The Metaparameter Referensi berisi deskripsi singkat dari cara kerja auditparameter.

Mei
sumber
Apakah salah satu jawaban benar-benar menyelesaikan masalah? Jika demikian, dapatkah Anda menerima yang mana yang paling baik menyelesaikannya? Saya juga tertarik dengan masalah ini, dan itu akan menjadi petunjuk yang berguna untuk ditindaklanjuti.
Tom Anderson
Saya tidak pernah mendapatkan ini berfungsi sepenuhnya - saya menyerah dan hanya melakukan ini dari waktu ke waktu (atau selama instalasi) dengan tangan.
Mei

Jawaban:

7

Gunakan atribut audit untuk melacak konten file atau nomor versi paket dan memicu perubahan dengan berlangganan sumber daya paket. Beberapa masalah dengan ini, ini tidak bekerja dengan --noop karena file state.yaml akan memperbarui file md5 checksum / versi paket dalam mode --noop. Saya tidak yakin apakah ini bug yang tertunda karena saya tidak dapat melacaknya saat ini.

file { '/etc/tzinfo':
  audit => content,
}

exec { '/usr/bin/mysql_tzinfo_to_sql':
  subscribe => File['/etc/tzinfo'],
}

Metode yang lebih andal hanyalah menggandakan file di tempat lain dan menggunakannya untuk memicu pembaruan (lokasi tidak penting, kami hanya melacak tzinfo asli sebagai sumber).

file { '/etc/puppet/stage/tzinfo':
  source => '/etc/tzinfo',
}

exec { '/usr/bin/mysql_tzinfo_to_sql':
  subscribe => File['/etc/tzinfo'],
}

Metode kedua tentu saja tidak bekerja dengan paket, tetapi Anda akan menghindari masalah --noop dan state.yaml.

Mengenai pertanyaan ketiga, ya, Anda bisa menggunakan pipa dan arahan ulang (gunakan judul dan letakkan perintah di atribut perintah):

exec { 
  '/bin/echo foo | grep foo > /tmp/foo':
}
Nan Liu
sumber
Ini adalah jawaban yang fantastis - walaupun saya tidak tertarik menonton zona waktu saat ini, tetapi dalam perubahan data zona waktu di / usr / share / tzinfo. Menggunakan 'audit => semua' terhadap / usr / share / tzinfo sudah cukup, bukan?
Mei
Jika Anda mencoba untuk melakukan recurse pada direktori, itu tidak berfungsi karena audit hanya bekerja pada path yang ditentukan dan itu tidak recurse. audit => semua berarti mengaudit semua atribut, bukan semua file. Saya akan menggunakan metode kedua dengan recurse jika Anda memilih metode ini.
Nan Liu
Poin bagus - meskipun saya tidak bermaksud untuk kambuh. Direktori / usr / share / tzinfo harus memiliki waktu yang berubah setiap kali paket tzdata diperbarui - setidaknya, itulah yang saya pikirkan.
Mei
Saya membutuhkan sesuatu yang serupa dan mencoba metode pertama - audit pada file. Dalam kasus saya, file tersebut adalah hash commit dari checkout git dari Exec sebelumnya. Metode ini berfungsi, kecuali bahwa perubahan ke file hanya mendapat perhatian pada boneka yang dijalankan setelah orang yang mengubah file.
Thomas Vander Stichele
5

Ya, Anda harus dapat melakukan ini.

* contoh kode teoritis

package{'tzinfo':
  audit  => all,
  notify => Exec['mysql_tzinfo_to_sql'],
}

exec{'mysql_tzinfo_to_sql':
  refreshonly  => true,
  command      => "bash -c '/usr/local/bin/mysql_tzinfo_to_sql >> /var/log/stuff.log'",
}
  1. Ya, melalui notifikasi meta-parameter. Namun saya tidak 100% positif bahwa fitur audit baru di boneka 2.6 akan memicu pemberitahuan jika versi paket berubah di luar kendali boneka.

  2. Ya, dengan refreshonly => true

  3. Ya, lihat contoh saya. Wayang menjalankan perintah exec di luar shell interaktif untuk kesederhanaan dan keamanan. Anda dapat meminta bash penggunaan boneka dalam mode subkulit dengan tombol -c, tetapi perhatikan kutipannya.

robbyt
sumber
1
menyegarkan adalah penting di sini, saya pikir. Perintah bash sepertinya tidak sesuai: jika perintah itu bekerja, maka perintah shell normal juga akan berfungsi, bukan? Bagaimanapun, itu terdengar seperti itu.
Mei
Apakah itu yang perlu Anda gunakan bash -cuntuk melakukan pengalihan?
Tom Anderson
ya, bash -cdiperlukan untuk pengalihan shell dalam contoh ini. Wayang tidak menggunakan shell interaktif untuk exec.
robbyt
2

Saya yakin saya bisa membuatnya bekerja. inilah bagian yang relevan dari manifes wayang saya:

file { '/usr/share/zoneinfo':
  audit => mtime,
  recurse => true,
  notify => Exec['mysql_tzinfo']
}

exec { 'mysql_tzinfo':
  refreshonly => true,
  command => 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql',
}

setelah up pertama, exec mysql_tzinfo dilewati. diuji dengan touch'ing / usr / share / zoneinfo / Etc / UTC, yang mendorong mysql_tzinfo exec untuk dijalankan pada berikutnya.

Daniel Vena
sumber
2

Pertanyaan ini sudah lama, tetapi saya berkeliaran mencari sesuatu yang lain, dan ingin menambahkan jawaban alternatif untuk dipertimbangkan.

Itu tidak menggunakan boneka: Karena kami ingin memicu pada pemasangan / pembaruan RPM mengapa tidak menggunakan pemicu RPM? Ini memanfaatkan sistem yang sangat digunakan untuk melakukan instalasi, memperluasnya dengan benar dengan cara yang dirancang.

Membangun pemicu RPM sangat sederhana, dan meskipun tidak menyenangkan untuk dipelajari, setelah yang pertama dilakukan dapat diulangi untuk aplikasi dan kondisi lainnya dengan sangat mudah - dengan demikian, biaya tidak nol tetapi manfaatnya cepat dan jauh lebih besar daripada yang biaya.

Sementara kami berada di sini untuk Wayang, dan masalahnya dapat dipecahkan dengan wayang, saya khawatir itu meningkatkan bagian lemah dari alat untuk merespons kondisi yang jauh lebih mudah untuk memicu dengan alat yang sudah ada di host dan alat di mana sebagian besar admin di kotak harus mencelupkan jari kaki mereka. Maaf menyarankan solusi di luar garis, tetapi jika Anda berkeliaran di pesan ini di masa depan seperti yang saya lakukan, dan pemicu RPM adalah pilihan untuk Anda, harap pertimbangkan itu.

pengguna2066657
sumber