---
id: config-salt
title: "Salt"
shortTitle: "Salt"
track: config
trackTitle: "Configuration Management"
order: 5
level: normal
status: published
estimatedMinutes: 25
prerequisites:
  - config-chef
next: cloud-providers
reviewedAgainst: 2026-10-12
sources:
  - title: "Salt states"
    url: https://docs.saltproject.io/en/latest/topics/tutorials/starting_states.html
  - title: "salt-call"
    url: https://docs.saltproject.io/en/latest/ref/cli/salt-call.html
---

# Salt

Salt có hai phần hay gặp: remote execution, gọi một hàm trên nhiều máy, và state, đưa máy về một mô tả trong file `.sls`. Bài này đọc state. Không dựng master.

## Để làm gì

Bạn đọc một state tạo file, và biết `salt-call --local` áp state trên chính máy đó khi không có master.

## Gồm những gì

- File `hello.sls`, id của state, function `file.managed`.
- Khác recipe Chef và manifest Puppet ở cú pháp YAML.
- `salt-call` chỉ khi binary đã có.

Đừng dựng Salt master, và đừng mở cổng cho minion trong bài này.

## Dùng khi nào

Một fleet còn minion Salt, runbook ghi `salt '*' state.apply`. Bạn cần đọc file SLS trước khi gõ lệnh đó. Máy mới thì Ansible, như các bài config phía trước.

Đừng `state.apply` không đối số trên production nếu bạn không nhớ highstate đang gồm những state nào. Nó áp cả top file.

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

Một file SLS là YAML. Khóa đầu là id, do bạn đặt. `file.managed` là function của module state `file`. `name` là path trên máy. `contents` là nội dung. Cùng id và cùng nội dung thì lần sau không đổi.

Highstate là tập state mà minion này được gán trong `top.sls`. `state.apply hello` chỉ áp một state. `state.apply` không đối số áp highstate.

Không có master thì `salt-call --local --file-root=. state.apply hello` đọc file trong thư mục hiện tại. Cần đã cài Salt. Bài không bắt cài.

## Lệnh và code mẫu

`hello.sls`:

```yaml
lab-note:
  file.managed:
    - name: /tmp/devops-lab-salt.txt
    - contents: |
        ok
```

Nếu `salt-call` có sẵn:

```bash
salt-call --local --file-root=. state.apply hello
```

Không có thì không cài.

## Thực hành

1. Chỉ id của state và path file.
2. Chạy `salt-call` chỉ khi lệnh đã tồn tại, và chỉ với file trong thư mục lab.
3. Không cài salt-master.

## Kết quả mong đợi

Id `lab-note`, path `/tmp/devops-lab-salt.txt`. Máy không có Salt thì bạn không tạo file.

## Checklist

- [ ] Áp đúng tên state, không áp highstate trên production khi chưa đọc `top.sls`.
- [ ] Không thêm Salt master nếu chưa có minion nào.
- [ ] File SLS nằm trong Git.

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

**YAML thụt đầu dòng bằng tab.** Salt không đọc được file. Dùng space.

**`salt '*' state.apply` từ master.** Dấu sao là mọi minion đang nối. Một file sai đụng cả fleet. Chỉ định minion hoặc một target đã thu hẹp.

## Nguồn

1. [Starting with states](https://docs.saltproject.io/en/latest/topics/tutorials/starting_states.html) — SLS và `file.managed`.
2. [salt-call](https://docs.saltproject.io/en/latest/ref/cli/salt-call.html) — chạy local, không qua master.

## Tiếp theo

[Cloud providers](../cloud/01-providers.md)
