---
id: config-puppet
title: "Puppet"
shortTitle: "Puppet"
track: config
trackTitle: "Configuration Management"
order: 3
level: important
status: published
estimatedMinutes: 30
prerequisites:
  - config-playbook
next: config-chef
reviewedAgainst: 2026-10-12
sources:
  - title: "Puppet overview"
    url: https://www.puppet.com/docs/puppet/latest/puppet_overview.html
  - title: "Resources"
    url: https://www.puppet.com/docs/puppet/latest/lang_resources.html
---

# Puppet

Puppet mô tả trạng thái mong muốn của máy. Agent lấy catalog rồi đưa máy về trạng thái đó. Ansible trong hai bài trước đẩy từ máy bạn. Puppet kéo từ agent. Bài này để đọc một resource `file`, không dựng Puppet server.

## Để làm gì

Bạn đọc một đoạn manifest, nói được resource nào sẽ có trên đĩa, và không áp manifest lên máy đang dùng.

## Gồm những gì

- Manifest, resource, catalog.
- Agent và server: ai nối tới ai.
- Khác Ansible: kéo theo lịch, không phải một lần `ansible-playbook` từ laptop.

Đừng cài `puppetserver`, và đừng ký certificate trong bài này.

## Dùng khi nào

Một máy còn agent Puppet, hoặc repo có thư mục `manifests`. Sửa file trên máy đó bằng tay thì lần agent chạy sẽ đè lại nếu resource Puppet quản lý file đó.

Hệ mới của lộ trình này dùng Ansible khi cần cấu hình máy, và image bất biến khi có thể. Đừng thêm Puppet server cho một file `hello.txt`.

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

Manifest là mã Puppet. Một resource có type, title, và attribute. `ensure => file` nghĩa là file phải tồn tại. `content` là nội dung. Agent so sánh máy với catalog. Khác thì sửa. Giống thì để yên. Cùng tính idempotent với Ansible, nhưng agent kéo catalog về máy, không phải laptop đẩy lên.

Catalog là bản đã biên cho một node. Server biên, agent áp. Agent không chạy được nếu certificate chưa được server ký. Đừng xóa thư mục SSL của agent trên production để “làm lại cho sạch” nếu bạn chưa có cửa khác vào máy.

`puppet apply site.pp` áp một file local, không cần server. Hợp lab. Vẫn cần Puppet trên máy. Bài này không bắt cài.

## Lệnh và code mẫu

`site.pp`:

```puppet
file { '/tmp/devops-lab-puppet.txt':
  ensure  => file,
  content => "ok\n",
}
```

Nếu máy lab đã có `puppet`:

```bash
puppet apply --noop site.pp
```

`--noop` in việc sẽ làm, không ghi. Không có binary thì dừng ở đọc file.

## Thực hành

1. Chỉ path và nội dung resource.
2. Chạy `--noop` chỉ khi `puppet` đã có sẵn.
3. Không cài puppetserver.

## Kết quả mong đợi

File sẽ là `/tmp/devops-lab-puppet.txt` với nội dung `ok` và dấu xuống dòng. Noop không tạo file.

## Checklist

- [ ] Không sửa tay file mà Puppet đang quản lý.
- [ ] Thử `--noop` trước `puppet apply` không có cờ đó.
- [ ] Không dựng thêm Puppet server nếu Ansible hoặc image đã đủ.

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

**Sửa `/etc/ssh/sshd_config` trên server trong khi manifest cũng quản lý file đó.** Vài phút sau agent ghi đè, mất bản sửa. Sửa manifest, rồi để agent áp.

**`ensure => absent` trên một file nhầm.** Agent xóa file. Đọc title của resource trước khi apply không noop.

## Nguồn

1. [Puppet overview](https://www.puppet.com/docs/puppet/latest/puppet_overview.html) — agent, server, catalog.
2. [Resources](https://www.puppet.com/docs/puppet/latest/lang_resources.html) — type, title, attribute.

## Tiếp theo

[Chef](./04-chef.md)
