Giới thiệu

Ansible Vault là một tính năng cho phép người dùng mã hóa các giá trị và cấu trúc dữ liệu trong các dự án Ansible. Điều này cung cấp khả năng bảo mật bất kỳ dữ liệu nhạy cảm nào cần thiết để chạy thành công các lần phát Ansible nhưng không được hiển thị công khai, như mật khẩu hoặc khóa riêng tư. Ansible tự động giải mã nội dung được mã hóa vault khi chạy khi khóa được cung cấp.

Trong hướng dẫn này, chúng tôi sẽ trình bày cách sử dụng Ansible Vault và khám phá một số thực tiễn được khuyến nghị để đơn giản hóa việc sử dụng nó. Chúng tôi sẽ sử dụng máy chủ Ubuntu 16.04 cho máy điều khiển Ansible. Không cần máy chủ từ xa.

Điều kiện tiên quyết

Để làm theo cùng, bạn sẽ cần một máy chủ Ubuntu 16.04 với một người dùng không phải root với sudo đặc quyền. Bạn có thể theo dõi Hướng dẫn cài đặt máy chủ ban đầu cho Ubuntu 16.04 để tạo người dùng có quyền thích hợp.

Trên máy chủ, bạn sẽ cần cài đặt và định cấu hình Ansible. Bạn có thể làm theo hướng dẫn của chúng tôi về cài đặt Ansible trên Ubuntu 16.04 để cài đặt các gói thích hợp.

Tiếp tục với hướng dẫn này khi máy chủ của bạn được cấu hình với các yêu cầu trên.

Ansible Vault là gì?

Vault là một cơ chế cho phép nội dung được mã hóa được tích hợp một cách minh bạch vào luồng công việc Ansible. Một tiện ích gọi là ansible-vault bảo mật dữ liệu bí mật bằng cách mã hóa nó trên đĩa. Để tích hợp những bí mật này với dữ liệu Ansible thông thường, cả hai ansibleansible-playbook các lệnh, để thực hiện các tác vụ quảng cáo và sách hướng dẫn có cấu trúc tương ứng, có hỗ trợ giải mã nội dung được mã hóa vault khi chạy.

Vault được triển khai với mức chi tiết cấp tệp, có nghĩa là các tệp hoàn toàn được mã hóa hoặc không được mã hóa. Nó sử dụng AES256 thuật toán để cung cấp mã hóa đối xứng được khóa cho mật khẩu do người dùng cung cấp. Điều này có nghĩa là cùng một mật khẩu được sử dụng để mã hóa và giải mã nội dung, đó là hữu ích từ một quan điểm khả năng sử dụng. Ansible có thể xác định và giải mã bất kỳ tập tin mã hóa vault mà nó tìm thấy trong khi thực hiện một playbook hoặc nhiệm vụ.

Tuy nhiên có những đề xuất để thay đổi điều này, tại thời điểm viết bài này, người dùng chỉ có thể chuyển một mật khẩu vào Ansible. Điều này có nghĩa là mỗi tệp được mã hóa có liên quan phải có mật khẩu.

Bây giờ bạn đã hiểu một chút về Vault là gì, chúng ta có thể bắt đầu thảo luận về các công cụ mà Ansible cung cấp và cách sử dụng Vault với luồng công việc hiện có.

Đặt Trình chỉnh sửa Vault Ansible

Trước khi sử dụng ansible-vault lệnh, bạn nên chỉ định trình soạn thảo văn bản ưa thích của mình. Một vài lệnh của Vault liên quan đến việc mở một trình soạn thảo để thao tác nội dung của một tệp được mã hóa. Ansible sẽ nhìn vào EDITOR biến môi trường để tìm trình soạn thảo ưa thích của bạn. Nếu điều này không được đặt, nó sẽ mặc định vi.

Nếu bạn không muốn chỉnh sửa vi trình chỉnh sửa, bạn nên đặt EDITOR biến trong môi trường của bạn.

Chú thích: Nếu bạn thấy mình trong một vi phiên vô tình, bạn có thể thoát bằng cách nhấn Esc khóa, nhập :q!, và sau đó nhấn Đi vào. Nếu bạn không quen thuộc với vi trình chỉnh sửa, bất kỳ thay đổi nào bạn thực hiện có thể sẽ không chủ ý, vì vậy lệnh này sẽ thoát mà không lưu.

Để thiết lập trình soạn thảo cho một lệnh riêng lẻ, hãy thêm lệnh trước vào với phép gán biến môi trường, như sau:

EDITOR=nano ansible-vault . . .

Để thực hiện điều này, hãy mở ~/.bashrc tập tin:

nano ~/.bashrc

Chỉ định trình chỉnh sửa ưa thích của bạn bằng cách thêm EDITOR gán vào cuối tập tin:

~/.bashrc

export EDITOR=nano

Lưu và đóng tệp khi bạn hoàn tất.

Nguồn lại tệp để đọc thay đổi trong phiên hiện tại:

. ~/.bashrc

Hiển thị EDITOR biến để kiểm tra xem cài đặt của bạn đã được áp dụng chưa:

echo $EDITOR

Output
nano

Bây giờ bạn đã thiết lập trình soạn thảo ưa thích của mình, chúng tôi có thể thảo luận về các hoạt động có sẵn với ansible-vault chỉ huy.

Làm thế nào để quản lý tập tin nhạy cảm với ansible-vault

Các ansible-vault lệnh là giao diện chính để quản lý nội dung được mã hóa trong Ansible. Lệnh này được sử dụng để mã hóa các tệp ban đầu và sau đó được sử dụng để xem, chỉnh sửa hoặc giải mã dữ liệu.

Tạo tệp được mã hóa mới

Để tạo tệp mới được mã hóa bằng Vault, hãy sử dụng ansible-vault create chỉ huy. Chuyển tên của tệp bạn muốn tạo. Ví dụ, để tạo một tệp YAML được mã hóa có tên vault.yml để lưu trữ các biến nhạy cảm, bạn có thể nhập:

ansible-vault create vault.yml

Bạn sẽ được nhắc nhập và xác nhận mật khẩu:

OutputNew Vault password: 
Confirm New Vault password:

Khi bạn đã xác nhận mật khẩu của mình, Ansible sẽ ngay lập tức mở cửa sổ chỉnh sửa nơi bạn có thể nhập nội dung mong muốn của mình.

Để kiểm tra chức năng mã hóa, hãy nhập một số văn bản thử nghiệm:

vault.yml

Secret information

Ansible sẽ mã hóa nội dung khi bạn đóng tệp. Nếu bạn kiểm tra tệp, thay vì nhìn thấy các từ bạn đã nhập, bạn sẽ thấy một khối được mã hóa:

cat vault.yml

Output$ANSIBLE_VAULT;1.1;AES256
65316332393532313030636134643235316439336133363531303838376235376635373430336333
3963353630373161356638376361646338353763363434360a363138376163666265336433633664
30336233323664306434626363643731626536643833336638356661396364313666366231616261
3764656365313263620a383666383233626665376364323062393462373266663066366536306163
31643731343666353761633563633634326139396230313734333034653238303166

Chúng ta có thể thấy một số thông tin tiêu đề mà Ansible sử dụng để biết cách xử lý tệp, theo sau là nội dung được mã hóa, hiển thị dưới dạng số.

Mã hóa các tệp hiện có

Nếu bạn đã có tệp mà bạn muốn mã hóa bằng Vault, hãy sử dụng ansible-vault encrypt thay vào đó.

Để thử nghiệm, chúng tôi có thể tạo một tệp mẫu bằng cách nhập:

echo 'unencrypted stuff' > encrypt_me.txt

Bây giờ, bạn có thể mã hóa tệp hiện có bằng cách nhập:

ansible-vault encrypt encrypt_me.txt

Một lần nữa, bạn sẽ được nhắc cung cấp và xác nhận mật khẩu. Sau đó, một thông báo sẽ xác nhận mã hóa:

OutputNew Vault password: 
Confirm New Vault password:
Encryption successful

Thay vì mở cửa sổ chỉnh sửa, ansible-vault sẽ mã hóa nội dung của tệp và ghi nó trở lại đĩa, thay thế phiên bản không được mã hóa.

Nếu chúng ta kiểm tra tệp, chúng ta sẽ thấy một mẫu mã hóa tương tự:

cat encrypt_me.txt

Output$ANSIBLE_VAULT;1.1;AES256
66633936653834616130346436353865303665396430383430353366616263323161393639393136
3737316539353434666438373035653132383434303338640a396635313062386464306132313834
34313336313338623537333332356231386438666565616537616538653465333431306638643961
3636663633363562320a613661313966376361396336383864656632376134353039663662666437
39393639343966363565636161316339643033393132626639303332373339376664

Như bạn có thể thấy, Ansible mã hóa nội dung hiện có theo cách tương tự như nó mã hóa các tệp mới.

Xem tệp được mã hóa

Đôi khi, bạn có thể cần phải tham khảo nội dung của tệp được mã hóa vault mà không cần chỉnh sửa hoặc ghi nó vào hệ thống tệp không được mã hóa. Các ansible-vault view lệnh cho các nội dung của một tập tin tiêu chuẩn ra ngoài. Theo mặc định, điều này có nghĩa là nội dung được hiển thị trong terminal.

Vượt qua tệp được mã hóa vault vào lệnh:

ansible-vault view vault.yml

Bạn sẽ được yêu cầu nhập mật khẩu của tệp. Sau khi nhập thành công, nội dung sẽ được hiển thị:

OutputVault password:
Secret information

Như bạn thấy, lời nhắc mật khẩu được trộn vào đầu ra của nội dung tập tin. Lưu ý điều này khi sử dụng ansible-vault view trong các quy trình tự động.

Chỉnh sửa các tệp được mã hóa

Khi bạn cần chỉnh sửa tệp được mã hóa, hãy sử dụng ansible-vault edit chỉ huy:

ansible-vault edit vault.yml

Bạn sẽ được nhắc nhập mật khẩu của tệp. Sau khi nhập nó, Ansible sẽ mở tập tin một cửa sổ chỉnh sửa, nơi bạn có thể thực hiện bất kỳ thay đổi cần thiết nào.

Sau khi lưu, nội dung mới sẽ được mã hóa bằng cách sử dụng mật khẩu mã hóa của tệp một lần nữa và được ghi vào đĩa.

Giải mã các tệp được mã hóa theo cách thủ công

Để giải mã tệp được mã hóa vault, hãy sử dụng ansible-vault decrypt chỉ huy.

Chú thích: Do khả năng tăng đột ngột của dữ liệu nhạy cảm vào kho dự án của bạn, ansible-vault decrypt lệnh chỉ được đề xuất khi bạn muốn xóa mã hóa khỏi tệp vĩnh viễn. Nếu bạn cần xem hoặc chỉnh sửa tệp được mã hóa vault, tốt hơn nên sử dụng ansible-vault view hoặc là ansible-vault edit lệnh, tương ứng.

Chuyển tên của tệp được mã hóa:

ansible-vault decrypt vault.yml

Bạn sẽ được nhắc nhập mật khẩu mã hóa cho tệp. Khi bạn nhập đúng mật khẩu, tệp sẽ được giải mã:

OutputVault password:
Decryption successful

Nếu bạn xem lại tệp, thay vì mã hóa vault, bạn sẽ thấy nội dung thực của tệp:

cat vault.yml

OutputSecret information

Tệp của bạn hiện chưa được mã hóa trên đĩa. Đảm bảo xóa mọi thông tin nhạy cảm hoặc mã hóa lại tệp khi bạn hoàn tất.

Thay đổi mật khẩu của các tập tin được mã hóa

Nếu bạn cần thay đổi mật khẩu của một tệp được mã hóa, hãy sử dụng ansible-vault rekey chỉ huy:

ansible-vault rekey encrypt_me.txt

Khi bạn nhập lệnh, trước tiên bạn sẽ được nhắc với mật khẩu hiện tại của tệp:

OutputVault password:

Sau khi nhập, bạn sẽ được yêu cầu chọn và xác nhận mật khẩu mới:

OutputVault password:
New Vault password:
Confirm New Vault password:

Khi bạn đã xác nhận thành công mật khẩu mới, bạn sẽ nhận được thông báo cho biết thành công của quá trình mã hóa lại:

OutputRekey successful

Bây giờ, bạn có thể truy cập tệp bằng mật khẩu mới. Mật khẩu cũ sẽ không hoạt động nữa.

Chạy Ansible với các tệp được mã hóa Vault

Sau khi bạn đã mã hóa thông tin nhạy cảm của mình với Vault, bạn có thể bắt đầu sử dụng các tệp với công cụ thông thường của Ansible. Các ansibleansible-playbook các lệnh đều biết cách giải mã các tệp được bảo vệ bằng vault cho đúng mật khẩu. Có một vài cách khác nhau để cung cấp mật khẩu cho các lệnh này tùy thuộc vào nhu cầu của bạn.

Để làm theo, bạn sẽ cần một tệp được mã hóa vault. Bạn có thể tạo một bằng cách nhập:

ansible-vault create secret_key

Chọn và xác nhận mật khẩu. Điền vào bất kỳ nội dung giả nào bạn muốn:

secret_key

confidential data

Lưu và đóng tập tin.

Chúng tôi cũng có thể tạo tạm thời hosts tệp dưới dạng khoảng không quảng cáo:

nano hosts

Chúng ta sẽ chỉ thêm localhost Ansible vào nó. Để chuẩn bị cho một bước sau, chúng tôi sẽ đặt nó vào [database] nhóm:

hosts

[database]
localhost ansible_connection=local

Lưu và đóng tệp khi bạn hoàn tất.

Tiếp theo, tạo một ansible.cfg tệp trong thư mục hiện tại nếu một thư mục chưa tồn tại:

nano ansible.cfg

Bây giờ, chỉ cần thêm một [defaults] phần và điểm Ansible cho hàng tồn kho chúng tôi vừa tạo:

ansible.cfg

[defaults]
inventory = ./hosts

Khi bạn đã sẵn sàng, hãy tiếp tục.

Sử dụng một dấu nhắc tương tác

Cách đơn giản nhất để giải mã nội dung trong thời gian chạy là yêu cầu Ansible nhắc bạn về thông tin xác thực phù hợp. Bạn có thể làm điều này bằng cách thêm --ask-vault-pass cho bất kỳ ansible hoặc là ansible-playbook chỉ huy. Ansible sẽ nhắc bạn cho một mật khẩu mà nó sẽ sử dụng để cố gắng giải mã bất kỳ nội dung được bảo vệ bởi vault mà nó tìm thấy.

Ví dụ: nếu chúng tôi cần sao chép nội dung của tệp được mã hóa vault vào máy chủ lưu trữ, chúng tôi có thể làm như vậy với copy module và --ask-vault-pass cờ. Nếu tệp thực sự chứa dữ liệu nhạy cảm, bạn rất có thể muốn khóa quyền truy cập trên máy chủ từ xa với quyền hạn và quyền sở hữu.

Chú thích: Chúng tôi đang sử dụng localhost làm máy chủ đích trong ví dụ này để giảm thiểu số lượng máy chủ được yêu cầu, nhưng kết quả sẽ giống như khi máy chủ thực sự ở xa:

ansible --ask-vault-pass -bK -m copy -a 'src=secret_key dest=/tmp/secret_key mode=0600 owner=root group=root' localhost

Nhiệm vụ của chúng tôi quy định rằng quyền sở hữu của tệp phải được thay đổi thành root, vì vậy đặc quyền quản trị là bắt buộc. Các -bK cờ báo cho Ansible nhắc nhở sudo mật khẩu cho máy chủ mục tiêu, vì vậy bạn sẽ được yêu cầu sudo mật khẩu. Sau đó, bạn sẽ được yêu cầu nhập mật khẩu Vault:

OutputSUDO password:
Vault password:

Khi mật khẩu được cung cấp, Ansible sẽ cố thực hiện tác vụ, sử dụng mật khẩu Vault cho bất kỳ tệp được mã hóa nào mà nó tìm thấy. Hãy nhớ rằng tất cả các tệp được tham chiếu trong quá trình thực thi phải sử dụng cùng một mật khẩu:

Outputlocalhost | SUCCESS => {
    "changed": true, 
    "checksum": "7a2eb5528c44877da9b0250710cba321bc6dac2d", 
    "dest": "/tmp/secret_key", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "270ac7da333dd1db7d5f7d8307bd6b41", 
    "mode": "0600", 
    "owner": "root", 
    "size": 18, 
    "src": "/home/sammy/.ansible/tmp/ansible-tmp-1480978964.81-196645606972905/source", 
    "state": "file", 
    "uid": 0
}

Nhắc mật khẩu là an toàn, nhưng có thể tẻ nhạt, đặc biệt là khi chạy lặp lại, và cũng cản trở tự động hóa. Rất may, có một số lựa chọn thay thế cho những tình huống này.

Sử dụng Ansible Vault với một tập tin mật khẩu

Nếu bạn không muốn nhập mật khẩu Vault mỗi khi bạn thực hiện tác vụ, bạn có thể thêm mật khẩu Vault của mình vào một tệp và tham chiếu tệp trong khi thực thi.

Ví dụ: bạn có thể đặt mật khẩu của mình trong một .vault_pass tập tin như thế này:

echo 'my_vault_password' > .vault_pass

Nếu bạn đang sử dụng điều khiển phiên bản, hãy đảm bảo thêm tệp mật khẩu vào tệp bỏ qua của phần mềm kiểm soát phiên bản của bạn để tránh vô tình cam kết:

echo '.vault_pass' >> .gitignore

Bây giờ, bạn có thể tham khảo tệp thay thế. Các --vault-password-file cờ có sẵn trên dòng lệnh. Chúng ta có thể hoàn thành nhiệm vụ tương tự từ phần cuối cùng bằng cách gõ:

ansible --vault-password-file=.vault_pass -bK -m copy -a 'src=secret_key dest=/tmp/secret_key mode=0600 owner=root group=root' localhost

Bạn sẽ không được nhắc nhập mật khẩu Vault lần này.

Tự động đọc tệp mật khẩu

Để tránh phải cung cấp cờ, bạn có thể đặt ANSIBLE_VAULT_PASSWORD_FILE biến môi trường với đường dẫn đến tệp mật khẩu:

export ANSIBLE_VAULT_PASSWORD_FILE=./.vault_pass

Bây giờ bạn có thể thực thi lệnh mà không cần --vault-password-file gắn cờ cho phiên hiện tại:

ansible -bK -m copy -a 'src=secret_key dest=/tmp/secret_key mode=0600 owner=root group=root' localhost

Để làm cho Ansible biết được vị trí tệp mật khẩu trong các phiên, bạn có thể chỉnh sửa ansible.cfg tập tin.

Mở địa phương ansible.cfg tệp chúng tôi đã tạo trước đó:

nano ansible.cfg

bên trong [defaults] , đặt vault_password_file cài đặt. Trỏ tới vị trí của tệp mật khẩu của bạn. Đây có thể là đường dẫn tương đối hoặc tuyệt đối, tùy thuộc vào đường dẫn nào hữu ích nhất cho bạn:

ansible.cfg

[defaults]
. . .
vault_password_file = ./.vault_pass

Bây giờ, khi bạn chạy các lệnh yêu cầu giải mã, bạn sẽ không còn được nhắc nhập mật khẩu vault nữa. Như một phần thưởng, ansible-vault sẽ không chỉ sử dụng mật khẩu trong tệp để giải mã bất kỳ tệp nào, nhưng nó sẽ áp dụng mật khẩu khi tạo tệp mới ansible-vault createansible-vault encrypt.

Đọc mật khẩu từ biến môi trường

Bạn có thể lo lắng về việc vô tình commit tập tin mật khẩu của bạn vào kho lưu trữ của bạn. Thật không may, trong khi Ansible có một biến môi trường để trỏ đến vị trí của một tập tin mật khẩu, nó không không phải có một thiết lập mật khẩu.

Tuy nhiên, nếu tệp mật khẩu của bạn có thể thực thi được, Ansible sẽ chạy nó dưới dạng tập lệnh và sử dụng kết quả đầu ra làm mật khẩu. Trong một Vấn đề GitHub, Brian Schwind gợi ý rằng đoạn mã sau có thể được sử dụng để lấy mật khẩu từ một biến môi trường.

Mở ra .vault_pass trong trình chỉnh sửa của bạn:

nano .vault_pass

Thay thế nội dung bằng tập lệnh sau:

.vault_pass

#!/usr/bin/env python

import os
print os.environ['VAULT_PASSWORD']

Làm cho tệp có thể thực thi được bằng cách nhập:

chmod +x .vault_pass

Sau đó, bạn có thể đặt và xuất VAULT_PASSWORD biến môi trường, sẽ có sẵn cho phiên hiện tại của bạn:

export VAULT_PASSWORD=my_vault_password

Bạn sẽ phải thực hiện việc này vào đầu mỗi phiên Ansible, điều này nghe có vẻ bất tiện. Tuy nhiên, điều này có hiệu quả bảo vệ chống lại vô tình cam kết mật khẩu mã hóa Vault của bạn, có thể có những hạn chế nghiêm trọng.

Sử dụng Biến được mã hóa Vault với Biến thông thường

Trong khi Ansible Vault có thể được sử dụng với các tệp tùy ý, nó thường được sử dụng để bảo vệ các biến nhạy cảm. Chúng tôi sẽ làm việc thông qua một ví dụ để cho bạn thấy làm thế nào để chuyển đổi một tập tin biến thường xuyên vào một cấu hình cân bằng an ninh và khả năng sử dụng.

Thiết lập ví dụ

Giả vờ rằng bạn đang cấu hình máy chủ cơ sở dữ liệu. Khi bạn tạo hosts trước đó, bạn đã đặt localhost mục nhập trong một nhóm được gọi là database để chuẩn bị cho bước này.

Cơ sở dữ liệu thường yêu cầu một hỗn hợp của các biến nhạy cảm và không nhạy cảm. Đây có thể được chỉ định trong một group_vars thư mục trong một tệp được đặt tên theo nhóm:

mkdir -p group_vars

nano group_vars/database

Bên trong group_vars/database tệp, thiết lập một số biến. Một số biến, như số cổng MySQL, không bí mật và có thể được chia sẻ tự do. Các biến khác, như mật khẩu cơ sở dữ liệu, sẽ được bảo mật:

group_vars/database

---
# nonsensitive data
mysql_port: 3306
mysql_host: 10.0.0.3
mysql_user: fred

# sensitive data
mysql_password: supersecretpassword

Chúng tôi có thể kiểm tra tất cả các biến có sẵn cho máy chủ của chúng tôi với Ansible's debug module và hostvars biến:

ansible -m debug -a 'var=hostvars[inventory_hostname]' database

Outputlocalhost | SUCCESS => {
    "hostvars[inventory_hostname]": {
        "ansible_check_mode": false, 
        "ansible_version": {
            "full": "2.2.0.0", 
            "major": 2, 
            "minor": 2, 
            "revision": 0, 
            "string": "2.2.0.0"
        }, 
        "group_names": [
            "database"
        ], 
        "groups": {
            "all": [
                "localhost"
            ], 
            "database": [
                "localhost"
            ], 
            "ungrouped": []
        }, 
        "inventory_dir": "/home/sammy", 
        "inventory_file": "hosts", 
        "inventory_hostname": "localhost", 
        "inventory_hostname_short": "localhost", 
        "mysql_host": "10.0.0.3",
        "mysql_password": "supersecretpassword",
        "mysql_port": 3306,
        "mysql_user": "fred",
        "omit": "__omit_place_holder__1c934a5a224ca1d235ff05eb9bda22044a6fb400", 
        "playbook_dir": "."
    }
}

Đầu ra xác nhận rằng tất cả các biến chúng ta thiết lập được áp dụng cho máy chủ. Tuy nhiên, chúng tôi group_vars/database tập tin hiện đang nắm giữ tất cả các biến của chúng tôi. Điều này có nghĩa là chúng ta có thể để nó không được mã hóa, đó là một mối quan tâm về bảo mật vì biến mật khẩu cơ sở dữ liệu hoặc chúng tôi mã hóa tất cả các biến, tạo ra các vấn đề về khả năng sử dụng và cộng tác.

Di chuyển các Biến Nhạy cảm vào Ansible Vault

Để giải quyết vấn đề này, chúng ta cần phân biệt giữa các biến nhạy cảm và không nhạy cảm. Chúng ta sẽ có thể mã hóa các giá trị bí mật và đồng thời dễ dàng chia sẻ các biến không nhạy cảm của chúng ta. Để làm như vậy, chúng tôi sẽ chia các biến của chúng tôi giữa hai tệp.

Có thể sử dụng biến danh mục thay cho biến Ansible tập tin để áp dụng các biến từ nhiều tệp. Chúng ta có thể tái cấu trúc để tận dụng khả năng đó. Trước tiên, đổi tên tệp hiện có từ database đến vars. Đây sẽ là tệp biến không được mã hóa của chúng tôi:

mv group_vars/database group_vars/vars

Tiếp theo, tạo một thư mục có cùng tên với tệp biến cũ. Di chuyển vars tập tin bên trong:

mkdir group_vars/database

mv group_vars/vars group_vars/database/

Bây giờ chúng ta có một thư mục biến cho database nhóm thay vì một tệp duy nhất và chúng tôi có một tệp biến không được mã hóa. Vì chúng tôi sẽ mã hóa các biến nhạy cảm của mình, chúng tôi sẽ xóa chúng khỏi tệp không được mã hóa của chúng tôi. Chỉnh sửa group_vars/database/vars tệp để xóa dữ liệu bí mật:

nano group_vars/database/vars

Trong trường hợp này, chúng tôi muốn xóa mysql_password biến. Bây giờ, tệp sẽ trông giống như sau:

group_vars/database/vars

---
# nonsensitive data
mysql_port: 3306
mysql_host: 10.0.0.3
mysql_user: fred

Tiếp theo, tạo một tệp được mã hóa vault trong thư mục sẽ nằm bên cạnh mã không được mã hóa vars tập tin:

ansible-vault create group_vars/database/vault

Trong tệp này, xác định các biến nhạy cảm được sử dụng trong vars tập tin. Sử dụng cùng tên biến, nhưng thêm vào chuỗi vault_ để chỉ ra rằng các biến này được định nghĩa trong tệp được bảo vệ bởi vault:

group_vars/database/vault

---
vault_mysql_password: supersecretpassword

Lưu và đóng tệp khi bạn hoàn tất.

Cấu trúc thư mục kết quả trông như sau:

.
├── . . .
├── group_vars/
│   └── database/
│       ├── vars
│       └── vault
└── . . .

Tại thời điểm này, các biến là riêng biệt và chỉ có các dữ liệu bí mật được mã hóa. Điều này là an toàn, nhưng việc triển khai của chúng tôi đã ảnh hưởng đến khả năng sử dụng của chúng tôi. Mặc dù mục tiêu của chúng tôi là bảo vệ nhạy cảm giá trị, chúng tôi cũng vô tình giảm khả năng hiển thị vào các tên biến thực tế. Không rõ các biến nào được gán mà không tham chiếu nhiều hơn một tệp và trong khi bạn có thể muốn hạn chế quyền truy cập vào dữ liệu bí mật khi cộng tác, bạn vẫn có thể muốn chia sẻ các tên biến.

Để giải quyết vấn đề này, dự án Ansible thường đề xuất một cách tiếp cận hơi khác.

Tham chiếu Biến Vault từ Biến chưa được mã hóa

Khi chúng tôi chuyển dữ liệu nhạy cảm của mình sang tệp được bảo vệ bởi vault, chúng tôi đã đặt trước tên biến với vault_ (mysql_password đã trở thành vault_mysql_password). Chúng ta có thể thêm tên biến ban đầu (mysql_password) quay lại tệp chưa được mã hóa. Thay vì đặt chúng thành trực tiếp các giá trị nhạy cảm, chúng ta có thể sử dụng các câu lệnh tạo khuôn mẫu Jinja2 để tham chiếu các tên biến được mã hóa từ bên trong tệp biến không được mã hóa của chúng ta. Bằng cách này, bạn có thể xem tất cả các biến được xác định bằng cách tham chiếu một tệp duy nhất, nhưng các giá trị bí mật sẽ vẫn còn trong tệp được mã hóa.

Để minh họa, hãy mở lại các tệp biến không được mã hóa:

nano group_vars/database/vars

Thêm mysql_password biến một lần nữa. Lần này, sử dụng Jinja2 templating để tham khảo biến được định nghĩa trong tệp được bảo vệ bởi vault:

group_vars/database/vars

---
# nonsensitive data
mysql_port: 3306
mysql_host: 10.0.0.3
mysql_user: fred

# sensitive data
mysql_password: "{{ vault_mysql_password }}"

Các mysql_password biến sẽ được đặt thành giá trị của vault_mysql_password biến, được định nghĩa trong tệp vault.

Với phương pháp này, bạn có thể hiểu tất cả các biến sẽ được áp dụng cho các máy chủ trong database nhóm bằng cách xem group_vars/database/vars tập tin. Các phần nhạy cảm sẽ bị che khuất bởi khuôn mẫu Jinja2. Các group_vars/database/vault chỉ cần mở khi các giá trị cần được xem hoặc thay đổi.

Bạn có thể kiểm tra để đảm bảo rằng tất cả mysql_* các biến vẫn được áp dụng chính xác bằng cách sử dụng cùng một phương thức như lần trước.

Chú thích: Nếu mật khẩu Vault của bạn không được tự động áp dụng với tệp mật khẩu, hãy thêm --ask-vault-pass gắn cờ vào lệnh bên dưới.

ansible -m debug -a 'var=hostvars[inventory_hostname]' database

Outputlocalhost | SUCCESS => {
    "hostvars[inventory_hostname]": {
        "ansible_check_mode": false, 
        "ansible_version": {
            "full": "2.2.0.0", 
            "major": 2, 
            "minor": 2, 
            "revision": 0, 
            "string": "2.2.0.0"
        }, 
        "group_names": [
            "database"
        ], 
        "groups": {
            "all": [
                "localhost"
            ], 
            "database": [
                "localhost"
            ], 
            "ungrouped": []
        }, 
        "inventory_dir": "/home/sammy/vault", 
        "inventory_file": "./hosts", 
        "inventory_hostname": "localhost", 
        "inventory_hostname_short": "localhost", 
        "mysql_host": "10.0.0.3",
        "mysql_password": "supersecretpassword",
        "mysql_port": 3306,
        "mysql_user": "fred",
        "omit": "__omit_place_holder__6dd15dda7eddafe98b6226226c7298934f666fc8", 
        "playbook_dir": ".", 
        "vault_mysql_password": "supersecretpassword"
    }
}

Cả hai vault_mysql_passwordmysql_password có thể truy cập. Sao chép này là vô hại và sẽ không ảnh hưởng đến việc bạn sử dụng hệ thống này.

Phần kết luận

Các dự án của bạn nên có tất cả thông tin cần thiết để cài đặt và cấu hình thành công các hệ thống phức tạp. Tuy nhiên, một số dữ liệu cấu hình theo định nghĩa nhạy cảm và không được hiển thị công khai. Trong hướng dẫn này, chúng tôi đã trình bày cách Ansible Vault có thể mã hóa thông tin bí mật để bạn có thể giữ tất cả dữ liệu cấu hình của mình ở một nơi mà không ảnh hưởng đến bảo mật.