Contoh 4: Menambahkan Kontrol Aliran - AWS OpsWorks

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 Stackstidak lagi menerima pelanggan baru. Pelanggan yang sudah ada akan dapat menggunakan OpsWorks konsol, API, CLI, dan CloudFormation sumber daya seperti biasa hingga 26 Mei 2024, di mana mereka akan dihentikan. Untuk mempersiapkan transisi ini, kami sarankan Anda mentransisikan tumpukan Anda AWS Systems Manager sesegera mungkin. Lihat informasi yang lebih lengkap di AWS OpsWorks StacksFAQ Akhir Kehidupan dan Migrasi AWS OpsWorks Stacks aplikasi Anda ke Manajer AWS Systems Manager Aplikasi.

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. eachMetode 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 resepnya
  1. Tetap di createdir direktori; Anda akan menggunakan buku masak itu untuk beberapa contoh berikutnya.

  2. Jika Anda belum melakukannya, jalankan kitchen destroy sehingga Anda memulai dengan instance yang bersih.

  3. Ganti kode default.rb dengan contoh dan jalankankitchen converge.

  4. 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 resepnya
  1. Jika Anda belum melakukannya, jalankan kitchen destroy sehingga Anda memulai dengan instance yang bersih.

  2. Ganti kode default.rb dengan contoh dan jalankankitchen converge.

  3. Masuk ke instance; Anda akan melihat direktori yang baru dibuat di bawah /srv dengan mode yang ditentukan.

catatan

AWS OpsWorksResep 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. Lihat contohnya di 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
  1. Jika instance Anda masih aktif, jalankan kitchen destroy untuk mematikannya.

  2. Ganti kode default.rb dengan kode contoh.

  3. Edit .kitchen.yml untuk menambahkan sistem CentOS 6.4 ke daftar platform. platformsBagian file sekarang akan terlihat seperti.

    ... platforms: - name: ubuntu-12.04 - name: centos-6.4 ...
  4. Jalankankitchen 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, jalankankitchen 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 Ohai untuk setiap proses yang mengumpulkan data sistem, termasuk platform, dan mewakilinya sebagai satu set atribut dalam struktur yang disebut objek node. platform?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['attribute_name']. Nilai platform, misalnya, diwakili olehnode['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_platformmetode Chef adalah solusi yang lebih sederhana daripadaif-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_platformmenetapkan jalur yang sesuai ke data_dir dan directory sumber daya menggunakan nilai itu untuk membuat direktori.

Untuk menjalankan contoh resep
  1. Jika instance Anda masih aktif, jalankan kitchen destroy untuk mematikannya.

  2. Ganti kode default.rb dengan kode contoh.

  3. Jalankan kitchen converge dan kemudian masuk ke setiap instance untuk memverifikasi bahwa direktori yang sesuai ada.