

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Contoh 5: Menggunakan Atribut
<a name="cookbooks-101-basics-attributes"></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.

Resep di bagian sebelumnya menggunakan nilai hard-code untuk segala sesuatu selain platform. Pendekatan ini bisa merepotkan jika, misalnya, Anda ingin menggunakan nilai yang sama di lebih dari satu resep. Anda dapat menentukan nilai secara terpisah dari resep dengan menyertakan file atribut di buku masak Anda.

File atribut adalah aplikasi Ruby yang memberikan nilai ke satu atau lebih atribut. Itu harus ada di `attributes` folder buku masak. Chef menggabungkan atribut ke dalam objek node dan resep apa pun dapat menggunakan nilai atribut dengan mereferensikan atribut. Topik ini menunjukkan cara memodifikasi resep dari [Iterasi](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-iteration) untuk menggunakan atribut. Inilah resep asli untuk referensi.

```
[ "/srv/www/config", "/srv/www/shared" ].each do |path|
  directory path do
    mode 0755
    owner 'root'
    group 'root'
    recursive true
    action :create
  end
end
```

Berikut ini mendefinisikan atribut untuk nama subdirektori, mode, pemilik, dan nilai grup.

```
default['createdir']['shared_dir'] = 'shared'
default['createdir']['config_dir'] = 'config'
default['createdir']['mode'] = 0755
default['createdir']['owner'] = 'root'
default['createdir']['group'] = 'root'
```

Perhatikan hal-hal berikut:
+ Setiap definisi dimulai dengan *tipe atribut*.

  Jika atribut didefinisikan lebih dari sekali — mungkin dalam file atribut yang berbeda — tipe atribut menentukan prioritas atribut, yang menentukan definisi mana yang dimasukkan ke dalam objek node. Untuk informasi selengkapnya, lihat [Atribut Prioritas](workingcookbook-attributes-precedence.md). Semua definisi dalam contoh ini memiliki tipe `default` atribut, yang merupakan tipe biasa untuk tujuan ini.
+ Atribut memiliki nama bersarang.

  Objek node pada dasarnya adalah tabel hash yang dapat bersarang secara sewenang-wenang, sehingga nama atribut dapat dan umumnya bersarang. File atribut ini mengikuti praktik standar menggunakan nama bersarang dengan nama buku masak,`createdir`, sebagai elemen pertama.

Alasan untuk menggunakan createdir sebagai elemen pertama atribut adalah bahwa ketika Anda menjalankan Chef, Chef menggabungkan atribut dari setiap buku masak ke dalam objek node. Dengan OpsWorks Stacks, objek node menyertakan sejumlah besar atribut dari [buku masak bawaan](https://github.com/aws/opsworks-cookbooks) selain atribut apa pun yang Anda tentukan. Menyertakan nama buku masak dalam nama atribut mengurangi risiko tabrakan nama dengan atribut dari buku masak lain, terutama jika atribut Anda memiliki nama seperti atau. `port` `user` Jangan beri nama atribut seperti [`[:apache2][:user]`](attributes-recipes-apache.md#attributes-recipes-apache-user), misalnya, kecuali jika Anda ingin mengganti nilai atribut itu. Untuk informasi selengkapnya, lihat [Menggunakan Atribut Buku Masak Kustom](workingcookbook-cookbook-attributes.md).

Contoh berikut menunjukkan resep asli menggunakan atribut bukan nilai hard-code.

```
[ "/srv/www/#{node['createdir']['shared_dir']}", "/srv/www/#{node['createdir']['config_dir']}" ].each do |path|
  directory path do
    mode node['createdir']['mode']
    owner node['createdir']['owner']
    group node['createdir']['group']
    recursive true
    action :create
  end
end
```

**catatan**  
Jika Anda ingin memasukkan nilai atribut ke dalam string, bungkus dengan`#{}`. Pada contoh sebelumnya, `#{node['createdir']['shared_dir']}` tambahkan “shared” ke “/srv/www/”.

**Untuk menjalankan resep**

1. Jalankan `kitchen destroy` untuk memulai dengan instance bersih.

1. Ganti kode `recipes/default.rb` dengan contoh resep sebelumnya.

1. Buat subdirektori `createdir` bernama `attributes` dan tambahkan file bernama `default.rb` yang berisi definisi atribut.

1. Edit `.kitchen.yml` untuk menghapus CentOS dari daftar platform.

1. Jalankan `kitchen converge` dan kemudian masuk ke instance dan verifikasi itu `/srv/www/shared` dan `/srv/www/config` ada di sana.

**catatan**  
Dengan OpsWorks Stacks, mendefinisikan nilai sebagai atribut memberikan manfaat tambahan; Anda dapat menggunakan [JSON khusus](workingstacks-json.md) untuk mengganti nilai tersebut berdasarkan per-stack atau bahkan per-deployment. Ini dapat berguna untuk berbagai tujuan, termasuk yang berikut:  
Anda dapat menyesuaikan perilaku resep Anda, seperti pengaturan konfigurasi atau nama pengguna, tanpa harus mengubah buku masak.  
Anda dapat, misalnya, menggunakan buku masak yang sama untuk tumpukan yang berbeda dan menggunakan JSON khusus untuk menentukan pengaturan konfigurasi kunci untuk tumpukan tertentu. Ini menghemat waktu dan upaya yang diperlukan untuk memodifikasi buku masak atau menggunakan buku masak yang berbeda untuk setiap tumpukan.
Anda tidak perlu memasukkan informasi yang berpotensi sensitif seperti kata sandi basis data di repositori buku masak Anda.  
Sebagai gantinya, Anda dapat menggunakan atribut untuk menentukan nilai default dan kemudian menggunakan JSON khusus untuk mengganti nilai itu dengan yang asli.
Untuk informasi selengkapnya tentang cara menggunakan JSON kustom untuk mengganti atribut, lihat. [Mengesampingkan Atribut](workingcookbook-attributes.md)

File atribut dinamai `default.rb` karena merupakan aplikasi Ruby, jika agak sederhana. Itu berarti Anda dapat, misalnya, menggunakan logika bersyarat untuk menentukan nilai atribut berdasarkan sistem operasi. Di[Logika Bersyarat](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-conditional), Anda menentukan nama subdirektori yang berbeda untuk keluarga Linux yang berbeda dalam resep. Dengan file atribut, Anda dapat menempatkan logika kondisional dalam file atribut.

File atribut berikut menggunakan `value_for_platform` untuk menentukan nilai `['shared_dir']` atribut yang berbeda, tergantung pada sistem operasi. Untuk kondisi lain, Anda dapat menggunakan `if-elsif-else` logika Ruby atau `case` pernyataan.

```
data_dir = value_for_platform(
  "centos" => { "default" => "shared" },
  "ubuntu" => { "default" => "data" },
  "default" => "user_data"
)
default['createdir']['shared_dir'] = data_dir
default['createdir']['config_dir'] = "config"
default['createdir']['mode'] = 0755
default['createdir']['owner'] = 'root'
default['createdir']['group'] = 'root'
```

**Untuk menjalankan resep**

1. Jalankan `kitchen destroy` untuk memulai dengan contoh baru.

1. Ganti kode `attributes/default.rb` dengan contoh sebelumnya.

1. Edit `.kitchen.yml` untuk menambahkan platform CentOS ke bagian platform, seperti yang dijelaskan dalam. [Logika Bersyarat](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-conditional)

1. Jalankan`kitchen converge`, lalu masuk ke instance untuk memverifikasi bahwa direktori ada di sana.

Setelah selesai, jalankan `kitchen destroy` untuk menghentikan instance. Contoh selanjutnya menggunakan buku masak baru.