Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Contoh 4: Menambahkan Kontrol Aliran
penting
AWS OpsWorks Stacks Layanan ini mencapai akhir masa pakai pada 26 Mei 2024 dan telah dinonaktifkan untuk pelanggan baru dan yang sudah ada. Kami sangat menyarankan pelanggan untuk memindahkan beban kerja mereka ke solusi lain sesegera mungkin. Jika Anda memiliki pertanyaan tentang migrasi, hubungi AWS Dukungan Tim di AWS re:Post
Beberapa resep hanyalah serangkaian sumber daya Chef. Dalam hal ini, ketika Anda menjalankan resep, itu hanya mengeksekusi masing-masing penyedia sumber daya secara berurutan. Namun, seringkali berguna untuk memiliki jalur eksekusi yang lebih canggih. Berikut ini adalah dua skenario umum:
-
Anda ingin resep untuk mengeksekusi sumber daya yang sama beberapa kali dengan pengaturan atribut yang berbeda.
-
Anda ingin menggunakan pengaturan atribut yang berbeda pada sistem operasi yang berbeda.
Anda dapat mengatasi skenario seperti ini dengan memasukkan struktur kontrol Ruby ke dalam resep. Bagian ini menunjukkan cara memodifikasi resep dari Contoh 3: Membuat Direktori untuk mengatasi kedua skenario.
Iterasi
Contoh 3: Membuat Direktorimenunjukkan cara menggunakan directory
sumber daya untuk membuat direktori atau rantai direktori. Namun, anggaplah Anda ingin membuat dua direktori terpisah, /srv/www/config
dan/srv/www/shared
. Anda dapat menerapkan sumber daya direktori terpisah untuk setiap direktori, tetapi pendekatan itu bisa menjadi rumit jika Anda ingin membuat sangat banyak direktori. Resep berikut menunjukkan cara yang lebih sederhana untuk menangani tugas.
[ "/srv/www/config", "/srv/www/shared" ].each do |path| directory path do mode 0755 owner 'root' group 'root' recursive true action :create end end
Alih-alih menggunakan sumber daya direktori terpisah untuk setiap subdirektori, resep menggunakan koleksi string yang berisi jalur subdirektori. each
Metode Ruby mengeksekusi sumber daya sekali untuk setiap elemen koleksi, dimulai dengan yang pertama. Nilai elemen diwakili dalam sumber daya oleh path
variabel, yang dalam hal ini mewakili jalur direktori. Anda dapat dengan mudah mengadaptasi contoh ini untuk membuat sejumlah subdirektori.
Untuk menjalankan resep
-
Tetap di
createdir
direktori; Anda akan menggunakan buku masak itu untuk beberapa contoh berikutnya. -
Jika Anda belum melakukannya, jalankan
kitchen destroy
sehingga Anda memulai dengan instance yang bersih. -
Ganti kode
default.rb
dengan contoh dan jalankankitchen converge
. -
Masuk ke instance; Anda akan melihat direktori yang baru dibuat di bawah
/srv
.
Anda dapat menggunakan tabel hash untuk menentukan dua nilai untuk setiap iterasi. Resep berikut menciptakan /srv/www/config
dan/srv/www/shared
, masing-masing dengan mode yang berbeda.
{ "/srv/www/config" => 0644, "/srv/www/shared" => 0755 }.each do |path, mode_value| directory path do mode mode_value owner 'root' group 'root' recursive true action :create end end
Untuk menjalankan resep
-
Jika Anda belum melakukannya, jalankan
kitchen destroy
sehingga Anda memulai dengan instance yang bersih. -
Ganti kode
default.rb
dengan contoh dan jalankankitchen converge
. -
Masuk ke instance; Anda akan melihat direktori yang baru dibuat di bawah
/srv
dengan mode yang ditentukan.
catatan
AWS OpsWorks Resep tumpukan biasanya menggunakan pendekatan ini untuk mengekstrak nilai dari konfigurasi tumpukan dan penerapan JSON —yang pada dasarnya adalah tabel hash besar—dan memasukkannya ke dalam sumber daya. Sebagai contoh, lihat Menyebarkan Resep.
Logika Bersyarat
Anda juga dapat menggunakan logika bersyarat Ruby untuk membuat beberapa cabang eksekusi. Resep berikut menggunakan if-elsif-else
logika untuk memperluas contoh sebelumnya sehingga menciptakan subdirektori bernama/srv/www/shared
, tetapi hanya pada sistem Debian dan Ubuntu. Untuk semua sistem lain, ia mencatat pesan kesalahan yang ditampilkan di output Test Kitchen.
if platform?("debian", "ubuntu") directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' recursive true action :create end else log "Unsupported system" end
Untuk menjalankan contoh resep
-
Jika instance Anda masih aktif, jalankan
kitchen destroy
untuk mematikannya. -
Ganti kode
default.rb
dengan kode contoh. -
Edit
.kitchen.yml
untuk menambahkan sistem CentOS 6.4 ke daftar platform.platforms
Bagian file sekarang akan terlihat seperti.... platforms: - name: ubuntu-12.04 - name: centos-6.4 ...
-
Jalankan
kitchen converge
, yang akan membuat instance dan menjalankan resep untuk setiap platform.kitchen.yml
secara berurutan.catatan
Jika Anda ingin menyatukan hanya satu contoh, tambahkan nama instance sebagai parameter. Misalnya, untuk menyatukan resep hanya pada platform Ubuntu, jalankan
kitchen converge default-ubuntu-1204
. Jika Anda lupa nama platform, jalankan sajakitchen list
.
Anda akan melihat pesan log Anda di bagian CentOS dari output Test Kitchen, yang akan terlihat seperti berikut:
... Converging 1 resources Recipe: createdir::default * log[Unsupported system] action write[2014-06-23T19:10:30+00:00] INFO: Processing log[Unsupported system] action write (createdir::default line 12) [2014-06-23T19:10:30+00:00] INFO: Unsupported system [2014-06-23T19:10:30+00:00] INFO: Chef Run complete in 0.004972162 seconds
Anda sekarang dapat masuk ke instance dan memverifikasi bahwa direktori telah atau tidak dibuat. Namun, Anda tidak bisa lari begitu saja kitchen login
sekarang. Anda harus menentukan instance mana dengan menambahkan nama platform, misalnya,kitchen
login default-ubuntu-1204
.
catatan
Jika perintah Test Kitchen mengambil nama instance, Anda tidak perlu mengetikkan nama lengkapnya. Test Kitchen memperlakukan nama instance sebagai ekspresi reguler Ruby, jadi Anda hanya perlu karakter yang cukup untuk memberikan kecocokan yang unik. Misalnya, Anda dapat menyatukan hanya instance Ubuntu dengan menjalankan kitchen
converge ub
atau masuk ke instance CentOS dengan menjalankan. kitchen
login 64
Pertanyaan yang mungkin Anda miliki pada titik ini adalah bagaimana resep mengetahui platform mana yang sedang berjalan. Chef menjalankan alat yang disebut Ohaiplatform?
Metode Chef membandingkan sistem dalam tanda kurung dengan nilai platform Ohai, dan mengembalikan nilai true jika salah satunya cocok.
Anda dapat mereferensikan nilai atribut node langsung dalam kode Anda dengan menggunakannode['
. Nilai platform, misalnya, diwakili olehattribute_name
']node['platform']
. Anda dapat, misalnya, telah menulis contoh sebelumnya sebagai berikut.
if node[:platform] == 'debian' or node[:platform] == 'ubuntu' directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' recursive true action :create end else log "Unsupported system" end
Alasan umum untuk memasukkan logika bersyarat dalam resep adalah untuk mengakomodasi fakta bahwa keluarga Linux yang berbeda terkadang menggunakan nama yang berbeda untuk paket, direktori, dan sebagainya. Misalnya, nama paket Apache ada httpd
di sistem CentOS apache2
dan pada sistem Ubuntu.
Jika Anda hanya membutuhkan string yang berbeda untuk sistem yang berbeda, value_for_platform
if-elsif-else
. Resep berikut membuat /srv/www/shared
direktori pada sistem CentOS, /srv/www/data
direktori pada sistem Ubuntu, dan yang /srv/www/config
lainnya.
data_dir = value_for_platform( "centos" => { "default" => "/srv/www/shared" }, "ubuntu" => { "default" => "/srv/www/data" }, "default" => "/srv/www/config" ) directory data_dir do mode 0755 owner 'root' group 'root' recursive true action :create end
value_for_platform
menetapkan jalur yang sesuai ke data_dir
dan directory
sumber daya menggunakan nilai itu untuk membuat direktori.
Untuk menjalankan contoh resep
-
Jika instance Anda masih aktif, jalankan
kitchen destroy
untuk mematikannya. -
Ganti kode
default.rb
dengan kode contoh. -
Jalankan
kitchen converge
dan kemudian masuk ke setiap instance untuk memverifikasi bahwa direktori yang sesuai ada.