

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
<a name="cookbooks-101-basics-ruby"></a>

**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](https://repost.aws/) atau melalui [AWS Dukungan](https://aws.amazon.com/support) Premium.

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](cookbooks-101-basics-directories.md) untuk mengatasi kedua skenario.

**Topics**
+ [Iterasi](#cookbooks-101-basics-ruby-iteration)
+ [Logika Bersyarat](#cookbooks-101-basics-ruby-conditional)

## Iterasi
<a name="cookbooks-101-basics-ruby-iteration"></a>

[Contoh 3: Membuat Direktori](cookbooks-101-basics-directories.md)menunjukkan 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**

1. Tetap di `createdir` direktori; Anda akan menggunakan buku masak itu untuk beberapa contoh berikutnya. 

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

1. Ganti kode `default.rb` dengan contoh dan jalankan`kitchen converge`.

1. 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**

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

1. Ganti kode `default.rb` dengan contoh dan jalankan`kitchen converge`.

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

**catatan**  
OpsWorks Resep tumpukan biasanya menggunakan pendekatan ini untuk mengekstrak nilai dari [konfigurasi tumpukan dan penerapan JSON](workingcookbook-json.md) —yang pada dasarnya adalah tabel hash besar—dan memasukkannya ke dalam sumber daya. Sebagai contoh, lihat [Menyebarkan Resep](create-custom-deploy.md).

## Logika Bersyarat
<a name="cookbooks-101-basics-ruby-conditional"></a>

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.

1. Ganti kode `default.rb` dengan kode contoh.

1. 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
   ...
   ```

1. 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 saja`kitchen 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](https://docs.chef.io/ohai.html) 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 menggunakan`node['attribute_name']`. Nilai platform, misalnya, diwakili oleh`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, [http://docs.chef.io/dsl_recipe.html#value-for-platform](http://docs.chef.io/dsl_recipe.html#value-for-platform)metode Chef adalah solusi yang lebih sederhana daripada`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**

1. Jika instance Anda masih aktif, jalankan `kitchen destroy` untuk mematikannya.

1. Ganti kode `default.rb` dengan kode contoh.

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