---
id: programming-ruby
title: "Ruby cho script vận hành"
shortTitle: "Ruby"
track: programming
trackTitle: "Programming cho DevOps"
order: 4
level: normal
status: published
estimatedMinutes: 25
prerequisites:
  - programming-go
next: git-fundamentals
reviewedAgainst: 2026-10-12
sources:
  - title: "Ruby documentation"
    url: https://www.ruby-lang.org/en/documentation/
  - title: "Ruby man page"
    url: https://docs.ruby-lang.org/en/master/man/ruby.1.html
---

# Ruby cho script vận hành

Lộ trình này không lấy Ruby làm ngôn ngữ chính. Mục tiêu của bài là giúp bạn đọc được script và cookbook Chef khi phải đụng vào hệ thống cũ.

## Để làm gì

Sau bài này, bạn chạy được một file `.rb`, đọc được exit code, và nhận ra chỗ nào script đang gọi shell. Chừng đó đủ để sửa một dòng trong script cũ, chứ chưa đủ để viết app mới.

## Gồm những gì

- `ruby -v`, shebang, `ruby script.rb`.
- `ARGV`, exit code khác 0.
- Ruby khác Python và Go ở chỗ nào, đủ để bạn chọn tool cho đúng.

Bài này không nói về Rails, gem server, hay cách dùng Ruby Version Manager đầy đủ.

## Dùng khi nào

Bạn sẽ gặp Ruby khi repo cũ có sẵn script Ruby, hoặc khi đọc cookbook Chef viết bằng Ruby DSL. Script mới của team vẫn nên viết bằng Python, Node.js hoặc Go, vì ba bài trước đã đủ cho JSON, CLI và binary một file.

Đừng thêm Ruby vào image chỉ vì một đoạn năm dòng. Viết lại đoạn đó bằng Python nhanh hơn nhiều so với kéo thêm một runtime.

## Kiến thức cốt lõi

`ruby file.rb` chạy file. `ruby -c file.rb` chỉ kiểm tra cú pháp chứ không chạy. Shebang `#!/usr/bin/env ruby` giúp kernel tìm `ruby` trên `PATH`.

`ARGV` là mảng argument sau tên file. `exit 1` kết thúc với mã lỗi. `system("ls")` gọi shell và trả `true`/`false`, không ném exception khi lệnh fail. `$?` sau đó là process status. Muốn dừng khi lệnh con fail thì kiểm tra giá trị trả về, đừng giả định `system` tự thoát.

Block `{ |x| ... }` và `do ... end` là cách Ruby viết vòng lặp. Bạn chỉ cần đọc hiểu, chưa cần tự viết.

## Lệnh và code mẫu

```ruby
#!/usr/bin/env ruby
# check.rb
name = ARGV[0]
if name.nil? || name.empty?
  warn "thieu ten"
  exit 1
end
puts "ok #{name}"
```

```bash
ruby -c check.rb
ruby check.rb
echo "exit=$?"
ruby check.rb api
```

## Thực hành

1. Lưu `check.rb` trong `~/devops-lab/ruby`.
2. Chạy không argument, rồi chạy với `api`.
3. Thêm `system("false")` vào cuối file, chạy lại, xem script có in `ok` không và `$?` là gì.

Lab này không cần `gem install`, cũng không cần Rails.

## Kết quả mong đợi

`ruby -c` in `Syntax OK`. Thiếu argument thì exit khác 0. Có argument thì in `ok api` và exit 0.

## Checklist

- [ ] Chạy `ruby -c` trước khi chạy script lạ.
- [ ] Kiểm tra exit code, không chỉ nhìn dòng `puts`.
- [ ] Giữ script mới ngoài Ruby nếu repo chưa có runtime này.

## Lỗi thường gặp

**Cài gem toàn cục trên server.** Gem đó không nằm trong image, nên máy dựng sau sẽ không có. Script vận hành nhỏ thường không cần gem. Nếu thật sự cần thư viện, hãy khai báo trong `Gemfile` và để pipeline cài, giống cách Node dùng `package.json`.

**`system` trả false mà script vẫn exit 0.** `system` không tự dừng script khi lệnh fail. Viết `exit 1 unless system("cmd")`, hoặc dùng `Open3` nếu cần lấy stdout và stderr riêng.

## Nguồn

1. [Ruby documentation](https://www.ruby-lang.org/en/documentation/) — trang docs của ngôn ngữ.
2. [ruby(1)](https://docs.ruby-lang.org/en/master/man/ruby.1.html) — `-c`, `-e`, và cách truyền argument.

## Tiếp theo

[Git cơ bản: commit và history](../git/01-fundamentals.md)
