Cloud-init là một công cụ tiêu chuẩn công nghiệp tự động khởi tạo máy chủ và có hỗ trợ phân phối chéo, đa nền tảng. Trong khi nền tảng đám mây cung cấp cloud-init siêu dữ liệu để triển khai máy chủ, dữ liệu người dùng tùy chỉnh cho phép bạn lập trình hầu hết mọi khía cạnh của quá trình khởi tạo máy chủ.

Dịch vụ Metadata của Akamai cho phép bạn tận dụng cloud-init để triển khai Compute Instances. Sử dụng tập lệnh cloud-config, bạn có thể xác định mọi thứ bạn cần, từ bảo mật và thiết lập người dùng đến cài đặt phần mềm và thực thi tập lệnh shell.

Trong hướng dẫn này, hãy tìm hiểu cách sử dụng tập lệnh cloud-config để ghi tệp vào máy chủ của bạn trong quá trình khởi tạo. Tự động hóa quá trình tạo và chỉnh sửa tệp để cấu hình phần mềm và hệ thống của bạn chính xác như bạn cần ngay từ đầu.

Trước khi bắt đầu, hãy xem lại hướng dẫn của chúng tôi về cách sử dụng Cloud-Init để tự động cấu hình và bảo mật máy chủ của bạn . Ở đó, bạn có thể xem cách tạo tệp cloud-config, tệp mà bạn cần làm theo cùng với hướng dẫn này. Khi bạn đã sẵn sàng triển khai cloud-config, hướng dẫn được liên kết ở trên sẽ nêu chi tiết cách thực hiện.

Ghi vào một tập tin

Cloud-init bao gồm một mô-đun để ghi tệp, sử dụng write_filestùy chọn trong tập lệnh cloud-config của bạn. Mô-đun này cung cấp thiết lập đơn giản nhất khi bạn muốn tạo tệp mới hoặc ghi đè tệp hiện có trong quá trình khởi tạo.

Theo mặc định, write_filestùy chọn này sẽ lấy một đường dẫn tệp, tạo tệp mới hoặc ghi đè tệp hiện có tại đích đã cho. Cloud-init cũng tạo bất kỳ thư mục cha nào chưa tồn tại.

Sau đây là ví dụ tạo tệp HTML:

write_files:
  - path: /var/www/html/example.com/index.html
    content: |
      <html>
      <body>
        <h1>Hello, World!</h1>
        <p>Welcome to the example web page!</p>
      </body>
      </html>      
    owner: 'root:root'
    permissions: '0644'

Ví dụ này định nghĩa một tập hợp các nội dung tệp cũng như các chi tiết như quyền sở hữu và quyền. Sau đây là phân tích sâu hơn về những gì write_filescấu hình ví dụ này thực hiện:

  • pathtrỏ đến vị trí cho tệp đã tạo. Bất kỳ tệp nào hiện có tại vị trí đó đều được ghi đè và các thư mục cha được tạo khi cần thiết. Đây là tùy chọn bắt buộc duy nhất cho write_files.
  • contentđịnh nghĩa nội dung cho tệp. Đây có thể là một dòng hoặc như trên, bạn có thể sử dụng định dạng YAML phù hợp cho nội dung tệp nhiều dòng. Việc bỏ contenttùy chọn này sẽ tạo ra một tệp trống.
  • ownertùy chọn cho phép bạn xác định người dùng và/hoặc nhóm để chỉ định quyền sở hữu tệp. Mặc định là root:root. Để chỉ định người dùng và/hoặc nhóm được tạo trong tập lệnh cloud-config, bạn nên sử dụng tùy defer: truechọn, như được mô tả thêm bên dưới, để đảm bảo người dùng/nhóm được tạo trước tệp.
  • permissionstùy chọn chỉ định quyền của tệp. Sử dụng định dạng 0###where ###là ký hiệu bát phân như được sử dụng với chmod. Bạn có thể tìm hiểu thêm về quyền và ký hiệu bát phân trong hướng dẫn của chúng tôi về cách Sửa đổi Quyền của Tệp bằng chmod .Tại đây, permissionscấp cho người dùng chủ sở hữu quyền đọc-ghi ( 6--), quyền đọc cho nhóm người dùng ( -4-) và quyền đọc cho tất cả người dùng khác ( --4).

Một defertùy chọn bổ sung có thể hữu ích khi bạn muốn trì hoãn việc tạo tệp cho đến giai đoạn cuối cùng của quá trình khởi tạo cloud-init. Theo cách đó, bạn có thể đảm bảo rằng tệp chỉ được tạo sau khi tất cả người dùng đã tạo và cài đặt phần mềm.

Đây là một ví dụ khác cho thấy tính năng đó tắt bằng cách tạo cấu hình Apache Web Server . Sử dụng defertùy chọn này đảm bảo rằng Apache được cài đặt và người dùng Apache (thường là www-datatrên Debian và Ubuntu) được tạo trước tệp.

write_files:
  - path: /etc/apache2/sites-available/example.com.conf
    content: |
      <VirtualHost *:80>
          ServerAdmin webmaster@example.com
          ServerName example.com
          ServerAlias www.example.com
          DocumentRoot /var/www/example.com/html/
          ErrorLog /var/www/example.com/logs/error.log
          CustomLog /var/www/example.com/logs/access.log combined
      </VirtualHost>      
    owner: 'www-data:www-data'
    permissions: '0640'
    defer: true

Việc bỏ qua defer: truetùy chọn trên sẽ dẫn đến lỗi vì www-datangười dùng chưa tồn tại tại thời điểm cloud-init cố gắng tạo tệp.

Sửa đổi một tập tin

Khi bạn cần sửa đổi một tệp, cloud-init có một số cách để sử dụng:

  • Tùy chọn này write_filescó thể thực hiện các sửa đổi tệp cơ bản bằng append: truetùy chọn của nó. Ví dụ, ví dụ bên dưới sửa đổi cấu hình dịch vụ SSH bằng cách thêm PermitRootLogin noquy tắc:
write_files:
  - path: /etc/ssh/sshd_config
    content: PermitRootLogin no
    append: true
  • Nếu không, write_fileschỉ có thể cung cấp các sửa đổi bằng cách tạo lại các tệp. Trong trường hợp đó, bạn sẽ cần sao chép toàn bộ cấu hình với các sửa đổi mong muốn vào tập lệnh cloud-config của mình.
  • Giải pháp dễ tiếp cận và dễ bảo trì hơn là sử dụng runcmdtùy chọn của cloud-init để chạy sedlệnh trên máy chủ. sedcung cấp khả năng chỉnh sửa văn bản thông qua lệnh shell và runcmdcho phép bạn chạy lệnh shell từ tập lệnh cloud-init. Tìm hiểu thêm về cách sử dụng runcmdtrong hướng dẫn của chúng tôi Sử dụng Cloud-Init để chạy lệnh và tập lệnh Bash khi khởi động lần đầu và tìm hiểu thêm sedtrong hướng dẫn của chúng tôi Thao tác văn bản từ dòng lệnh bằng sed .Tùy chọn này runcmdlấy danh sách các lệnh shell. Trong ví dụ sau, hai lệnh shell chạy để thay đổi cấu hình dịch vụ SSH, tương tự như ví dụ trên. Tuy nhiên, sedcho phép bạn thay thế các thiết lập hiện có, thay vì chỉ thêm một thiết lập mới.
runcmd:
  - sed -i -e 's/PermitRootLogin\s*yes/PermitRootLogin no/g' /etc/ssh/sshd_config
  - sed -i -e 's/#*\s*PermitRootLogin/PermitRootLogin/g' /etc/ssh/sshd_config
  • Mỗi lệnh trong runcmddanh sách trên thực hiện chỉnh sửa tệp /etc/ssh/sshd_config. Cùng nhau, hai lệnh này chuyển đổi hiệu quả PermitRootLoginsang novà đảm bảo rằng cài đặt không được chú thích. sedLệnh đầu tiên thay thế PermitRootLogin[any number of spaces]yesbằng PermitRootLogin no, trong khi lệnh thứ hai xóa dấu chú thích ( #) khỏi đầu bất kỳ lần xuất hiện nào của PermitRootLogin.

Xác minh nội dung tập tin

Khi phiên bản của bạn đã hoạt động, hãy sử dụng catlệnh để xác minh rằng các tệp được ghi như mong đợi. Sử dụng catvị trí của tệp, bạn sẽ thấy nội dung của tệp như được chỉ định trong cloud-config.

cat /var/www/html/example.com/index.html
<html>
<body>
  <h1>Hello, World!</h1>
  <p>Welcome to the example web page!</p>
</body>
</html>

Bạn có thể làm tương tự đối với các sửa đổi tệp. Tuy nhiên, bạn có thể thực hiện kiểm tra đó hiệu quả hơn bằng cách giới hạn đầu ra thành các thuật ngữ khớp. Ở đây, nội sshd_configdung được lọc chỉ thành các dòng mà cloud-init đã thực hiện thay đổi (những dòng có chứa PermitRootLogin).

cat /etc/ssh/sshd_config | grep PermitRootLogin
PermitRootLogin no

Để xác minh quyền của tệp, hãy sử dụng statlệnh. Trong trường hợp example.com.conftệp ở trên, hãy tìm tệp do người sở hữu www-datavà quyền 0640sở hữu.

sudo stat /etc/apache2/sites-available/example.com.conf
  File: /etc/apache2/sites-available/example.com.conf
  Size: 284       	Blocks: 8          IO Block: 4096   regular file
Device: 800h/2048d	Inode: 261541      Links: 1
Access: (0640/-rw-r-----)  Uid: (   33/www-data)   Gid: (   33/www-data)
...

Thông tin thêm

Bạn có thể muốn tham khảo các nguồn sau để biết thêm thông tin về chủ đề này. Mặc dù chúng tôi cung cấp với hy vọng rằng chúng sẽ hữu ích, nhưng xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc tính kịp thời của các tài liệu được lưu trữ bên ngoài.

Nguồn: https://www.linode.com/docs/guides/write-files-with-cloud-init/