Cloud-init là một công cụ đa nền tảng, tiêu chuẩn công nghiệp tự động hóa quá trình khởi tạo máy chủ mới. Cloud-init tận dụng siêu dữ liệu từ nền tảng đám mây của bạn để xử lý việc triển khai trong khi lấy dữ liệu người dùng tùy chỉnh để lập trình thiết lập máy chủ theo nhu cầu của bạn.

Dịch vụ Metadata của Akamai cho phép bạn triển khai Compute Instances bằng cloud-init. Áp dụng tập lệnh cloud-config, bạn có thể xác định mọi thứ 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.

Hướng dẫn này trình bày cách sử dụng cloud-init để chạy lệnh shell như một phần của quá trình triển khai máy chủ. Cho dù bạn cần thực thi một câu lệnh shell đơn lẻ hay một tập lệnh Bash đầy đủ, cloud-init có thể tự động chạy các lệnh cần thiết khi khởi động hệ thống lần đầu tiên.

Trước khi bắt đầu, hãy xem 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ẽ cho biết cách thực hiện.

Chạy lệnh với runcmdchỉ thị

Tùy chọn này runcmdlà cách chính để thực thi lệnh shell trong cloud-config. Tùy chọn này lấy danh sách các lệnh, sau đó cloud-init chạy tuần tự trong quá trình khởi tạo.

Mỗi lệnh được đưa ra runcmdcó thể được nhập dưới dạng danh sách hoặc chuỗi. Chuỗi trực tiếp đưa ra lệnh, giống như bạn nhập lệnh vào shell. Dưới dạng danh sách, mục đầu tiên là lệnh và mỗi mục tiếp theo là tùy chọn cho lệnh, theo thứ tự. Thực hiện theo cùng cách tiếp cận như execve(3) .

Để chứng minh, ví dụ bên dưới cung cấp một runcmdlệnh sử dụng cả hai cách tiếp cận. Mỗi lệnh chạy một hoạt động tương tự, thêm một dòng vào /run/test.txt.

runcmd:
  - echo 'First command executed successfully!' >> /run/testing.txt
  - [ sh, -c, "echo 'Second command executed successfully!' >> /run/testing.txt" ]

Ghi chú: Cloud-init khuyên bạn không nên ghi tệp vào thư /tmp/mục trong cloud-config vì thư mục đó dễ bị xóa trong quá trình khởi động. Thay vào đó, cloud-init khuyên bạn nên sử dụng thư /run/mục cho các tệp tạm thời, như trong ví dụ trên và các ví dụ sau.

Chạy lệnh với bootcmdchỉ thị

Cloud-init có một tùy chọn khác để chạy lệnh, bootcmd. Trong tệp cloud-config, bootcmdđược thiết lập giống như runcmd, lấy danh sách các lệnh (có thể là chuỗi hoặc danh sách).

Tuy nhiên, có hai tính năng chính phân biệt bootcmd. Đầu tiên, các lệnh được đưa ra trong bootcmdđược thực thi sớm trong quá trình khởi động. Các lệnh này chạy trong số các tác vụ đầu tiên của hệ thống khi khởi động. Thứ hai, chúng chạy trong mỗi lần khởi động hệ thống. Trong khi runcmdcác lệnh chỉ chạy một lần, trong quá trình khởi tạo, bootcmdcác lệnh trở thành một phần của quá trình khởi động hệ thống của bạn, lặp lại với mỗi lần khởi động.

Để sử dụng bootcmd, thiết lập trong cloud-config chỉ khác ở runcmdtên tùy chọn. Hãy xem ví dụ này:

bootcmd:
  - echo 'Boot command executed successfully!'

Nếu bạn cần chạy lệnh sớm trong quá trình khởi động nhưng không muốn lệnh chạy với mỗi lần khởi động, bạn vẫn có thể sử dụng bootcmd. Để thực hiện, hãy chạy lệnh bằng cloud-init-pertiện ích cloud-init, cho phép bạn chỉ định tần suất thực thi.

Trong ví dụ tiếp theo này, một echolệnh được chạy giống như trên, nhưng cloud-init-perchỉ định rằng lệnh chỉ được chạy trong quá trình khởi tạo phiên bản ( instance). Tham exampleinstanceechosố đặt tên cho lệnh và lệnh thực tế theo sau đó.

bootcmd:
  - [ cloud-init-per, instance, example-instance-echo, echo, "Instance initialization command executed successfully!" ]

Chạy một tập lệnh Bash

Không chỉ là lệnh, cloud-init runcmdcó thể được sử dụng để thực thi các tập lệnh shell. Để làm như vậy, bạn cần phải chuyển tập lệnh đến máy chủ mới và sử dụng lệnh shell (thông qua runcmd) để thực thi tập lệnh.

Nếu tập lệnh của bạn được lưu trữ và có thể truy cập từ xa, giải pháp đơn giản nhất là sử dụng wgetlệnh để tải xuống. Từ đó, bạn có thể sử dụng runcmdlệnh để thực thi tập lệnh. Lưu trữ đối tượng có thể cung cấp một cách hiệu quả để lưu trữ các tệp tập lệnh.

Tuy nhiên, hầu hết các trường hợp sử dụng đều ưu tiên thêm tập lệnh shell trực tiếp như một phần của quá trình khởi tạo cloud-init, mà không lưu trữ tệp tập lệnh ở nơi khác. Trong những trường hợp như vậy, bạn có thể sử dụng write_filestùy chọn của cloud-init để tạo tệp tập lệnh khi khởi tạo. Để tìm hiểu thêm về cách ghi tệp bằng cloud-init, hãy đọc hướng dẫn của chúng tôi về cách Sử dụng Cloud-Init để Ghi vào Tệp . Hướng dẫn bao gồm các giải thích về tất cả write_filescác tùy chọn được sử dụng tại đây.

Ví dụ sau đây minh họa cách write_filesvà runcmdcó thể hoạt động cùng nhau trong cloud-config của bạn để tạo và thực thi một tập lệnh shell. write_filestạo một tệp tập lệnh đơn giản tại /run/scripts/test-script.shvà cấp cho tập lệnh các quyền thực thi. Tập lệnh contentchạy với Bash và thêm một dòng vào tệp /run/testing.txtruncmdthực thi test-script.shtệp dưới dạng lệnh. Ví dụ này sử dụng shlệnh để chạy tập lệnh shell:

write_files:
  - path: /run/scripts/test-script.sh
    content: |
      #!/bin/bash

      echo 'Script executed successfully!' >> /run/testing.txt      
    permissions: '0755'

runcmd:
  - [ sh, "/run/scripts/test-script.sh" ]

Xác minh rằng Commands hoặc Script đã chạy

Sau khi phiên bản của bạn được triển khai bằng cloud-init, hãy xác minh việc thực thi thành công các lệnh. Cách bạn thực hiện sẽ khác nhau tùy thuộc vào bản chất của các lệnh. Tuy nhiên, vì nhiều lệnh tạo ra đầu ra shell theo mặc định, cách nhất quán nhất là kiểm tra đầu ra trong tệp nhật ký cloud-init, nằm tại /var/log/cloud-init-output.log.

Ví dụ, bootcmdcác lệnh ví dụ ở trên sử dụng echođể xuất ra thiết bị đầu cuối. Do đó, bạn có thể xác minh các lệnh đó bằng cách tìm kiếm nhật ký cloud-init để biết đầu ra. Ví dụ đơn giản hóa việc tìm kiếm bằng cách sử dụng grepđể lọc nhật ký xuống các dòng chứa văn bản đầu ra đã biết từ các lệnh.

sudo cat /var/log/cloud-init-output.log | grep 'executed successfully!'
Boot command executed successfully!
Instance initialization command executed successfully!

Nhiều công cụ dòng lệnh xuất thông tin ra thiết bị đầu cuối và điều này giúp chúng dễ dàng xác minh bằng nhật ký cloud-init. Tuy nhiên, một số lệnh xuất ra tệp nhật ký riêng của chúng. Nếu không, bạn luôn có thể ghi lại các hành động bằng echolệnh cùng với lệnh chính của mình. Ví dụ, các lệnh khác ở trên chạy với runcmdvăn bản đầu ra vào /run/testing.txttệp.

Trường hợp này có thể xảy ra với các lệnh khác mà bạn chạy từ cloud-init. Lệnh bạn đang sử dụng có thể tự động tạo nhật ký hoặc bạn có thể chọn kết hợp nhật ký thủ công, giống như với các lệnh ví dụ. Trong cả hai trường hợp, việc xem lại nội dung của tệp nhật ký thích hợp có thể xác nhận việc thực hiện thành công các lệnh của cloud-init:

sudo cat /run/testing.txt
First command executed successfully!
Second command executed successfully!
Script executed successfully!

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/run-shell-commands-with-cloud-init/