{"id":34959,"date":"2024-09-06T14:06:45","date_gmt":"2024-09-06T07:06:45","guid":{"rendered":"http:\/\/jupitek.maudemo.vip\/index.php\/2024\/09\/06\/use-cloud-init-to-run-commands-and-bash-scripts-on-first-boot\/"},"modified":"2024-09-06T14:06:45","modified_gmt":"2024-09-06T07:06:45","slug":"use-cloud-init-to-run-commands-and-bash-scripts-on-first-boot","status":"publish","type":"post","link":"https:\/\/jupitek.maudemo.vip\/index.php\/2024\/09\/06\/use-cloud-init-to-run-commands-and-bash-scripts-on-first-boot\/","title":{"rendered":"S\u1eed d\u1ee5ng Cloud-Init \u0111\u1ec3 ch\u1ea1y l\u1ec7nh v\u00e0 Bash Scripts khi kh\u1edfi \u0111\u1ed9ng l\u1ea7n \u0111\u1ea7u"},"content":{"rendered":"<p><a href=\"https:\/\/cloudinit.readthedocs.io\/en\/latest\/index.html\" target=\"_blank\" rel=\"noreferrer noopener\">Cloud-init<\/a>&nbsp;l\u00e0 m\u1ed9t c\u00f4ng c\u1ee5 \u0111a n\u1ec1n t\u1ea3ng, ti\u00eau chu\u1ea9n c\u00f4ng nghi\u1ec7p t\u1ef1 \u0111\u1ed9ng h\u00f3a qu\u00e1 tr\u00ecnh kh\u1edfi t\u1ea1o m\u00e1y ch\u1ee7 m\u1edbi. Cloud-init t\u1eadn d\u1ee5ng si\u00eau d\u1eef li\u1ec7u t\u1eeb n\u1ec1n t\u1ea3ng \u0111\u00e1m m\u00e2y c\u1ee7a b\u1ea1n \u0111\u1ec3 x\u1eed l\u00fd vi\u1ec7c tri\u1ec3n khai trong khi l\u1ea5y d\u1eef li\u1ec7u ng\u01b0\u1eddi d\u00f9ng t\u00f9y ch\u1ec9nh \u0111\u1ec3 l\u1eadp tr\u00ecnh thi\u1ebft l\u1eadp m\u00e1y ch\u1ee7 theo nhu c\u1ea7u c\u1ee7a b\u1ea1n.<\/p>\n<p><a href=\"https:\/\/www.linode.com\/docs\/products\/compute\/compute-instances\/guides\/metadata\/\">D\u1ecbch v\u1ee5 Metadata<\/a>&nbsp;c\u1ee7a Akamai&nbsp;cho ph\u00e9p b\u1ea1n tri\u1ec3n khai Compute Instances b\u1eb1ng cloud-init. \u00c1p d\u1ee5ng t\u1eadp l\u1ec7nh cloud-config, b\u1ea1n c\u00f3 th\u1ec3 x\u00e1c \u0111\u1ecbnh m\u1ecdi th\u1ee9 t\u1eeb b\u1ea3o m\u1eadt v\u00e0 thi\u1ebft l\u1eadp ng\u01b0\u1eddi d\u00f9ng \u0111\u1ebfn c\u00e0i \u0111\u1eb7t ph\u1ea7n m\u1ec1m v\u00e0 th\u1ef1c thi t\u1eadp l\u1ec7nh shell.<\/p>\n<p>H\u01b0\u1edbng d\u1eabn n\u00e0y tr\u00ecnh b\u00e0y c\u00e1ch s\u1eed d\u1ee5ng cloud-init \u0111\u1ec3 ch\u1ea1y l\u1ec7nh shell nh\u01b0 m\u1ed9t ph\u1ea7n c\u1ee7a qu\u00e1 tr\u00ecnh tri\u1ec3n khai m\u00e1y ch\u1ee7. Cho d\u00f9 b\u1ea1n c\u1ea7n th\u1ef1c thi m\u1ed9t c\u00e2u l\u1ec7nh shell \u0111\u01a1n l\u1ebb hay m\u1ed9t t\u1eadp l\u1ec7nh Bash \u0111\u1ea7y \u0111\u1ee7, cloud-init c\u00f3 th\u1ec3 t\u1ef1 \u0111\u1ed9ng ch\u1ea1y c\u00e1c l\u1ec7nh c\u1ea7n thi\u1ebft khi kh\u1edfi \u0111\u1ed9ng h\u1ec7 th\u1ed1ng l\u1ea7n \u0111\u1ea7u ti\u00ean.<\/p>\n<p>Tr\u01b0\u1edbc khi b\u1eaft \u0111\u1ea7u, h\u00e3y xem h\u01b0\u1edbng d\u1eabn c\u1ee7a ch\u00fang t\u00f4i v\u1ec1 c\u00e1ch&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/guides\/configure-and-secure-servers-with-cloud-init\/\">s\u1eed d\u1ee5ng Cloud-Init \u0111\u1ec3 t\u1ef1 \u0111\u1ed9ng c\u1ea5u h\u00ecnh v\u00e0 b\u1ea3o m\u1eadt m\u00e1y ch\u1ee7 c\u1ee7a b\u1ea1n<\/a>&nbsp;. \u1ede \u0111\u00f3, b\u1ea1n c\u00f3 th\u1ec3 xem c\u00e1ch t\u1ea1o t\u1ec7p cloud-config, t\u1ec7p m\u00e0 b\u1ea1n c\u1ea7n l\u00e0m theo c\u00f9ng v\u1edbi h\u01b0\u1edbng d\u1eabn n\u00e0y. Khi b\u1ea1n \u0111\u00e3 s\u1eb5n s\u00e0ng tri\u1ec3n khai cloud-config, h\u01b0\u1edbng d\u1eabn \u0111\u01b0\u1ee3c li\u00ean k\u1ebft \u1edf tr\u00ean s\u1ebd cho bi\u1ebft c\u00e1ch th\u1ef1c hi\u1ec7n.<\/p>\n<h2 id=\"run-commands-with-runcmd-directive\">Ch\u1ea1y l\u1ec7nh v\u1edbi&nbsp;<code>runcmd<\/code>ch\u1ec9 th\u1ecb<a href=\"https:\/\/www.linode.com\/docs\/guides\/run-shell-commands-with-cloud-init\/#run-commands-with-runcmd-directive\"><\/a><\/h2>\n<p>T\u00f9y ch\u1ecdn n\u00e0y&nbsp;<code>runcmd<\/code>l\u00e0 c\u00e1ch ch\u00ednh \u0111\u1ec3 th\u1ef1c thi l\u1ec7nh shell trong cloud-config. T\u00f9y ch\u1ecdn n\u00e0y l\u1ea5y danh s\u00e1ch c\u00e1c l\u1ec7nh, sau \u0111\u00f3 cloud-init ch\u1ea1y tu\u1ea7n t\u1ef1 trong qu\u00e1 tr\u00ecnh kh\u1edfi t\u1ea1o.<\/p>\n<p>M\u1ed7i l\u1ec7nh \u0111\u01b0\u1ee3c \u0111\u01b0a ra&nbsp;<code>runcmd<\/code>c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c nh\u1eadp d\u01b0\u1edbi d\u1ea1ng danh s\u00e1ch ho\u1eb7c chu\u1ed7i. Chu\u1ed7i tr\u1ef1c ti\u1ebfp \u0111\u01b0a ra l\u1ec7nh, gi\u1ed1ng nh\u01b0 b\u1ea1n nh\u1eadp l\u1ec7nh v\u00e0o shell. D\u01b0\u1edbi d\u1ea1ng danh s\u00e1ch, m\u1ee5c \u0111\u1ea7u ti\u00ean l\u00e0 l\u1ec7nh v\u00e0 m\u1ed7i m\u1ee5c ti\u1ebfp theo l\u00e0 t\u00f9y ch\u1ecdn cho l\u1ec7nh, theo th\u1ee9 t\u1ef1. Th\u1ef1c hi\u1ec7n theo c\u00f9ng c\u00e1ch ti\u1ebfp c\u1eadn nh\u01b0&nbsp;<a href=\"https:\/\/linux.die.net\/man\/3\/execve\" target=\"_blank\" rel=\"noreferrer noopener\">execve(3)<\/a>&nbsp;.<\/p>\n<p>\u0110\u1ec3 ch\u1ee9ng minh, v\u00ed d\u1ee5 b\u00ean d\u01b0\u1edbi cung c\u1ea5p m\u1ed9t&nbsp;<code>runcmd<\/code>l\u1ec7nh s\u1eed d\u1ee5ng c\u1ea3 hai c\u00e1ch ti\u1ebfp c\u1eadn. M\u1ed7i l\u1ec7nh ch\u1ea1y m\u1ed9t ho\u1ea1t \u0111\u1ed9ng t\u01b0\u01a1ng t\u1ef1, th\u00eam m\u1ed9t d\u00f2ng v\u00e0o&nbsp;<code>\/run\/test.txt<\/code>.<\/p>\n<pre class=\"wp-block-code\"><code>runcmd:\n  - echo 'First command executed successfully!' &gt;&gt; \/run\/testing.txt\n  - &#91; sh, -c, \"echo 'Second command executed successfully!' &gt;&gt; \/run\/testing.txt\" ]<\/code><\/pre>\n<p class=\"has-background\" style=\"background-color:#74f78c33\">Ghi ch\u00fa: Cloud-init khuy\u00ean b\u1ea1n kh\u00f4ng n\u00ean ghi t\u1ec7p v\u00e0o th\u01b0&nbsp;<code>\/tmp\/<\/code>m\u1ee5c trong cloud-config v\u00ec th\u01b0 m\u1ee5c \u0111\u00f3 d\u1ec5 b\u1ecb x\u00f3a trong qu\u00e1 tr\u00ecnh kh\u1edfi \u0111\u1ed9ng. Thay v\u00e0o \u0111\u00f3, cloud-init khuy\u00ean b\u1ea1n n\u00ean s\u1eed d\u1ee5ng th\u01b0&nbsp;<code>\/run\/<\/code>m\u1ee5c cho c\u00e1c t\u1ec7p t\u1ea1m th\u1eddi, nh\u01b0 trong v\u00ed d\u1ee5 tr\u00ean v\u00e0 c\u00e1c v\u00ed d\u1ee5 sau.<\/p>\n<h2 id=\"run-commands-with-bootcmd-directive\">Ch\u1ea1y l\u1ec7nh v\u1edbi&nbsp;<code>bootcmd<\/code>ch\u1ec9 th\u1ecb<a href=\"https:\/\/www.linode.com\/docs\/guides\/run-shell-commands-with-cloud-init\/#run-commands-with-bootcmd-directive\"><\/a><\/h2>\n<p>Cloud-init c\u00f3 m\u1ed9t t\u00f9y ch\u1ecdn kh\u00e1c \u0111\u1ec3 ch\u1ea1y l\u1ec7nh,&nbsp;<code>bootcmd<\/code>. Trong t\u1ec7p cloud-config,&nbsp;<code>bootcmd<\/code>\u0111\u01b0\u1ee3c thi\u1ebft l\u1eadp gi\u1ed1ng nh\u01b0&nbsp;<code>runcmd<\/code>, l\u1ea5y danh s\u00e1ch c\u00e1c l\u1ec7nh (c\u00f3 th\u1ec3 l\u00e0 chu\u1ed7i ho\u1eb7c danh s\u00e1ch).<\/p>\n<p>Tuy nhi\u00ean, c\u00f3 hai t\u00ednh n\u0103ng ch\u00ednh ph\u00e2n bi\u1ec7t&nbsp;<code>bootcmd<\/code>. \u0110\u1ea7u ti\u00ean, c\u00e1c l\u1ec7nh \u0111\u01b0\u1ee3c \u0111\u01b0a ra trong&nbsp;<code>bootcmd<\/code>\u0111\u01b0\u1ee3c th\u1ef1c thi s\u1edbm trong qu\u00e1 tr\u00ecnh kh\u1edfi \u0111\u1ed9ng. C\u00e1c l\u1ec7nh n\u00e0y ch\u1ea1y trong s\u1ed1 c\u00e1c t\u00e1c v\u1ee5 \u0111\u1ea7u ti\u00ean c\u1ee7a h\u1ec7 th\u1ed1ng khi kh\u1edfi \u0111\u1ed9ng. Th\u1ee9 hai, ch\u00fang ch\u1ea1y trong m\u1ed7i l\u1ea7n kh\u1edfi \u0111\u1ed9ng h\u1ec7 th\u1ed1ng. Trong khi&nbsp;<code>runcmd<\/code>c\u00e1c l\u1ec7nh ch\u1ec9 ch\u1ea1y m\u1ed9t l\u1ea7n, trong qu\u00e1 tr\u00ecnh kh\u1edfi t\u1ea1o,&nbsp;<code>bootcmd<\/code>c\u00e1c l\u1ec7nh tr\u1edf th\u00e0nh m\u1ed9t ph\u1ea7n c\u1ee7a qu\u00e1 tr\u00ecnh kh\u1edfi \u0111\u1ed9ng h\u1ec7 th\u1ed1ng c\u1ee7a b\u1ea1n, l\u1eb7p l\u1ea1i v\u1edbi m\u1ed7i l\u1ea7n kh\u1edfi \u0111\u1ed9ng.<\/p>\n<p>\u0110\u1ec3 s\u1eed d\u1ee5ng&nbsp;<code>bootcmd<\/code>, thi\u1ebft l\u1eadp trong cloud-config ch\u1ec9 kh\u00e1c \u1edf&nbsp;<code>runcmd<\/code>t\u00ean t\u00f9y ch\u1ecdn. H\u00e3y xem v\u00ed d\u1ee5 n\u00e0y:<\/p>\n<pre class=\"wp-block-code\"><code>bootcmd:\n  - echo 'Boot command executed successfully!'<\/code><\/pre>\n<p>N\u1ebfu b\u1ea1n c\u1ea7n ch\u1ea1y l\u1ec7nh s\u1edbm trong qu\u00e1 tr\u00ecnh kh\u1edfi \u0111\u1ed9ng nh\u01b0ng kh\u00f4ng mu\u1ed1n l\u1ec7nh ch\u1ea1y v\u1edbi m\u1ed7i l\u1ea7n kh\u1edfi \u0111\u1ed9ng, b\u1ea1n v\u1eabn c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng&nbsp;<code>bootcmd<\/code>. \u0110\u1ec3 th\u1ef1c hi\u1ec7n, h\u00e3y ch\u1ea1y l\u1ec7nh b\u1eb1ng&nbsp;<code>cloud-init-per<\/code>ti\u1ec7n \u00edch cloud-init, cho ph\u00e9p b\u1ea1n ch\u1ec9 \u0111\u1ecbnh t\u1ea7n su\u1ea5t th\u1ef1c thi.<\/p>\n<p>Trong v\u00ed d\u1ee5 ti\u1ebfp theo n\u00e0y, m\u1ed9t&nbsp;<code>echo<\/code>l\u1ec7nh \u0111\u01b0\u1ee3c ch\u1ea1y gi\u1ed1ng nh\u01b0 tr\u00ean, nh\u01b0ng&nbsp;<code>cloud-init-per<\/code>ch\u1ec9 \u0111\u1ecbnh r\u1eb1ng l\u1ec7nh ch\u1ec9 \u0111\u01b0\u1ee3c ch\u1ea1y trong qu\u00e1 tr\u00ecnh kh\u1edfi t\u1ea1o phi\u00ean b\u1ea3n (&nbsp;<code>instance<\/code>). Tham&nbsp;<code>exampleinstanceecho<\/code>s\u1ed1 \u0111\u1eb7t t\u00ean cho l\u1ec7nh v\u00e0 l\u1ec7nh th\u1ef1c t\u1ebf theo sau \u0111\u00f3.<\/p>\n<pre class=\"wp-block-code\"><code>bootcmd:\n  - &#91; cloud-init-per, instance, example-instance-echo, echo, \"Instance initialization command executed successfully!\" ]<\/code><\/pre>\n<h2 id=\"run-a-bash-script\">Ch\u1ea1y m\u1ed9t t\u1eadp l\u1ec7nh Bash<a href=\"https:\/\/www.linode.com\/docs\/guides\/run-shell-commands-with-cloud-init\/#run-a-bash-script\"><\/a><\/h2>\n<p>Kh\u00f4ng ch\u1ec9 l\u00e0 l\u1ec7nh, cloud-init&nbsp;<code>runcmd<\/code>c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 th\u1ef1c thi c\u00e1c t\u1eadp l\u1ec7nh shell. \u0110\u1ec3 l\u00e0m nh\u01b0 v\u1eady, b\u1ea1n c\u1ea7n ph\u1ea3i chuy\u1ec3n t\u1eadp l\u1ec7nh \u0111\u1ebfn m\u00e1y ch\u1ee7 m\u1edbi v\u00e0 s\u1eed d\u1ee5ng l\u1ec7nh shell (th\u00f4ng qua&nbsp;<code>runcmd<\/code>) \u0111\u1ec3 th\u1ef1c thi t\u1eadp l\u1ec7nh.<\/p>\n<p>N\u1ebfu t\u1eadp l\u1ec7nh c\u1ee7a b\u1ea1n \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef v\u00e0 c\u00f3 th\u1ec3 truy c\u1eadp t\u1eeb xa, gi\u1ea3i ph\u00e1p \u0111\u01a1n gi\u1ea3n nh\u1ea5t l\u00e0 s\u1eed d\u1ee5ng&nbsp;<code>wget<\/code>l\u1ec7nh \u0111\u1ec3 t\u1ea3i xu\u1ed1ng. T\u1eeb \u0111\u00f3, b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng&nbsp;<code>runcmd<\/code>l\u1ec7nh \u0111\u1ec3 th\u1ef1c thi t\u1eadp l\u1ec7nh.&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/products\/storage\/object-storage\/get-started\/\">L\u01b0u tr\u1eef \u0111\u1ed1i t\u01b0\u1ee3ng<\/a>&nbsp;c\u00f3 th\u1ec3 cung c\u1ea5p m\u1ed9t c\u00e1ch hi\u1ec7u qu\u1ea3 \u0111\u1ec3 l\u01b0u tr\u1eef c\u00e1c t\u1ec7p t\u1eadp l\u1ec7nh.<\/p>\n<p>Tuy nhi\u00ean, h\u1ea7u h\u1ebft c\u00e1c tr\u01b0\u1eddng h\u1ee3p s\u1eed d\u1ee5ng \u0111\u1ec1u \u01b0u ti\u00ean th\u00eam t\u1eadp l\u1ec7nh shell tr\u1ef1c ti\u1ebfp nh\u01b0 m\u1ed9t ph\u1ea7n c\u1ee7a qu\u00e1 tr\u00ecnh kh\u1edfi t\u1ea1o cloud-init, m\u00e0 kh\u00f4ng l\u01b0u tr\u1eef t\u1ec7p t\u1eadp l\u1ec7nh \u1edf n\u01a1i kh\u00e1c. Trong nh\u1eefng tr\u01b0\u1eddng h\u1ee3p nh\u01b0 v\u1eady, b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng&nbsp;<code>write_files<\/code>t\u00f9y ch\u1ecdn c\u1ee7a cloud-init \u0111\u1ec3 t\u1ea1o t\u1ec7p t\u1eadp l\u1ec7nh khi kh\u1edfi t\u1ea1o. \u0110\u1ec3 t\u00ecm hi\u1ec3u th\u00eam v\u1ec1 c\u00e1ch ghi t\u1ec7p b\u1eb1ng cloud-init, h\u00e3y \u0111\u1ecdc h\u01b0\u1edbng d\u1eabn c\u1ee7a ch\u00fang t\u00f4i v\u1ec1 c\u00e1ch S\u1eed&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/guides\/write-files-with-cloud-init\/\">d\u1ee5ng Cloud-Init \u0111\u1ec3 Ghi v\u00e0o T\u1ec7p<\/a>&nbsp;. H\u01b0\u1edbng d\u1eabn bao g\u1ed3m c\u00e1c gi\u1ea3i th\u00edch v\u1ec1 t\u1ea5t c\u1ea3&nbsp;<code>write_files<\/code>c\u00e1c t\u00f9y ch\u1ecdn \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng t\u1ea1i \u0111\u00e2y.<\/p>\n<p>V\u00ed d\u1ee5 sau \u0111\u00e2y minh h\u1ecda c\u00e1ch&nbsp;<code>write_files<\/code>v\u00e0&nbsp;<code>runcmd<\/code>c\u00f3 th\u1ec3 ho\u1ea1t \u0111\u1ed9ng c\u00f9ng nhau trong cloud-config c\u1ee7a b\u1ea1n \u0111\u1ec3 t\u1ea1o v\u00e0 th\u1ef1c thi m\u1ed9t t\u1eadp l\u1ec7nh shell.&nbsp;<code>write_files<\/code>t\u1ea1o m\u1ed9t t\u1ec7p t\u1eadp l\u1ec7nh \u0111\u01a1n gi\u1ea3n t\u1ea1i&nbsp;<code>\/run\/scripts\/test-script.sh<\/code>v\u00e0 c\u1ea5p cho t\u1eadp l\u1ec7nh c\u00e1c quy\u1ec1n th\u1ef1c thi. T\u1eadp l\u1ec7nh&nbsp;<code>content<\/code>ch\u1ea1y v\u1edbi Bash v\u00e0 th\u00eam m\u1ed9t d\u00f2ng v\u00e0o t\u1ec7p&nbsp;<code>\/run\/testing.txt<\/code>.&nbsp;<code>runcmd<\/code>th\u1ef1c thi&nbsp;<code>test-script.sh<\/code>t\u1ec7p d\u01b0\u1edbi d\u1ea1ng l\u1ec7nh. V\u00ed d\u1ee5 n\u00e0y s\u1eed d\u1ee5ng&nbsp;<code>sh<\/code>l\u1ec7nh \u0111\u1ec3 ch\u1ea1y t\u1eadp l\u1ec7nh shell:<\/p>\n<pre class=\"wp-block-code\"><code>write_files:\n  - path: \/run\/scripts\/test-script.sh\n    content: |\n      #!\/bin\/bash\n\n      echo 'Script executed successfully!' &gt;&gt; \/run\/testing.txt      \n    permissions: '0755'\n\nruncmd:\n  - &#91; sh, \"\/run\/scripts\/test-script.sh\" ]<\/code><\/pre>\n<h2 id=\"verify-that-commands-or-script-has-run\">X\u00e1c minh r\u1eb1ng Commands ho\u1eb7c Script \u0111\u00e3 ch\u1ea1y<a href=\"https:\/\/www.linode.com\/docs\/guides\/run-shell-commands-with-cloud-init\/#verify-that-commands-or-script-has-run\"><\/a><\/h2>\n<p>Sau khi phi\u00ean b\u1ea3n c\u1ee7a b\u1ea1n \u0111\u01b0\u1ee3c tri\u1ec3n khai b\u1eb1ng cloud-init, h\u00e3y x\u00e1c minh vi\u1ec7c th\u1ef1c thi th\u00e0nh c\u00f4ng c\u00e1c l\u1ec7nh. C\u00e1ch b\u1ea1n th\u1ef1c hi\u1ec7n s\u1ebd kh\u00e1c nhau t\u00f9y thu\u1ed9c v\u00e0o b\u1ea3n ch\u1ea5t c\u1ee7a c\u00e1c l\u1ec7nh. Tuy nhi\u00ean, v\u00ec nhi\u1ec1u l\u1ec7nh t\u1ea1o ra \u0111\u1ea7u ra shell theo m\u1eb7c \u0111\u1ecbnh, c\u00e1ch nh\u1ea5t qu\u00e1n nh\u1ea5t l\u00e0 ki\u1ec3m tra \u0111\u1ea7u ra trong t\u1ec7p nh\u1eadt k\u00fd cloud-init, n\u1eb1m t\u1ea1i&nbsp;<code>\/var\/log\/cloud-init-output.log<\/code>.<\/p>\n<p>V\u00ed d\u1ee5,&nbsp;<code>bootcmd<\/code>c\u00e1c l\u1ec7nh v\u00ed d\u1ee5 \u1edf tr\u00ean s\u1eed d\u1ee5ng&nbsp;<code>echo<\/code>\u0111\u1ec3 xu\u1ea5t ra thi\u1ebft b\u1ecb \u0111\u1ea7u cu\u1ed1i. Do \u0111\u00f3, b\u1ea1n c\u00f3 th\u1ec3 x\u00e1c minh c\u00e1c l\u1ec7nh \u0111\u00f3 b\u1eb1ng c\u00e1ch t\u00ecm ki\u1ebfm nh\u1eadt k\u00fd cloud-init \u0111\u1ec3 bi\u1ebft \u0111\u1ea7u ra. V\u00ed d\u1ee5 \u0111\u01a1n gi\u1ea3n h\u00f3a vi\u1ec7c t\u00ecm ki\u1ebfm b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng&nbsp;<code>grep<\/code>\u0111\u1ec3 l\u1ecdc nh\u1eadt k\u00fd xu\u1ed1ng c\u00e1c d\u00f2ng ch\u1ee9a v\u0103n b\u1ea3n \u0111\u1ea7u ra \u0111\u00e3 bi\u1ebft t\u1eeb c\u00e1c l\u1ec7nh.<\/p>\n<pre class=\"wp-block-code\"><code>sudo cat \/var\/log\/cloud-init-output.log | grep 'executed successfully!'<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>Boot command executed successfully!\nInstance initialization command executed successfully!<\/code><\/pre>\n<p>Nhi\u1ec1u c\u00f4ng c\u1ee5 d\u00f2ng l\u1ec7nh xu\u1ea5t th\u00f4ng tin ra thi\u1ebft b\u1ecb \u0111\u1ea7u cu\u1ed1i v\u00e0 \u0111i\u1ec1u n\u00e0y gi\u00fap ch\u00fang d\u1ec5 d\u00e0ng x\u00e1c minh b\u1eb1ng nh\u1eadt k\u00fd cloud-init. Tuy nhi\u00ean, m\u1ed9t s\u1ed1 l\u1ec7nh xu\u1ea5t ra t\u1ec7p nh\u1eadt k\u00fd ri\u00eang c\u1ee7a ch\u00fang. N\u1ebfu kh\u00f4ng, b\u1ea1n lu\u00f4n c\u00f3 th\u1ec3 ghi l\u1ea1i c\u00e1c h\u00e0nh \u0111\u1ed9ng b\u1eb1ng&nbsp;<code>echo<\/code>l\u1ec7nh c\u00f9ng v\u1edbi l\u1ec7nh ch\u00ednh c\u1ee7a m\u00ecnh. V\u00ed d\u1ee5, c\u00e1c l\u1ec7nh kh\u00e1c \u1edf tr\u00ean ch\u1ea1y v\u1edbi&nbsp;<code>runcmd<\/code>v\u0103n b\u1ea3n \u0111\u1ea7u ra v\u00e0o&nbsp;<code>\/run\/testing.txt<\/code>t\u1ec7p.<\/p>\n<p>Tr\u01b0\u1eddng h\u1ee3p n\u00e0y c\u00f3 th\u1ec3 x\u1ea3y ra v\u1edbi c\u00e1c l\u1ec7nh kh\u00e1c m\u00e0 b\u1ea1n ch\u1ea1y t\u1eeb cloud-init. L\u1ec7nh b\u1ea1n \u0111ang s\u1eed d\u1ee5ng c\u00f3 th\u1ec3 t\u1ef1 \u0111\u1ed9ng t\u1ea1o nh\u1eadt k\u00fd ho\u1eb7c b\u1ea1n c\u00f3 th\u1ec3 ch\u1ecdn k\u1ebft h\u1ee3p nh\u1eadt k\u00fd th\u1ee7 c\u00f4ng, gi\u1ed1ng nh\u01b0 v\u1edbi c\u00e1c l\u1ec7nh v\u00ed d\u1ee5. Trong c\u1ea3 hai tr\u01b0\u1eddng h\u1ee3p, vi\u1ec7c xem l\u1ea1i n\u1ed9i dung c\u1ee7a t\u1ec7p nh\u1eadt k\u00fd th\u00edch h\u1ee3p c\u00f3 th\u1ec3 x\u00e1c nh\u1eadn vi\u1ec7c th\u1ef1c hi\u1ec7n th\u00e0nh c\u00f4ng c\u00e1c l\u1ec7nh c\u1ee7a cloud-init:<\/p>\n<pre class=\"wp-block-code\"><code>sudo cat \/run\/testing.txt<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>First command executed successfully!\nSecond command executed successfully!\nScript executed successfully!<\/code><\/pre>\n<h2 id=\"more-information\">Th\u00f4ng tin th\u00eam<\/h2>\n<p>B\u1ea1n c\u00f3 th\u1ec3 mu\u1ed1n tham kh\u1ea3o c\u00e1c ngu\u1ed3n sau \u0111\u1ec3 bi\u1ebft th\u00eam th\u00f4ng tin v\u1ec1 ch\u1ee7 \u0111\u1ec1 n\u00e0y. M\u1eb7c d\u00f9 ch\u00fang t\u00f4i cung c\u1ea5p v\u1edbi hy v\u1ecdng r\u1eb1ng ch\u00fang s\u1ebd h\u1eefu \u00edch, nh\u01b0ng xin l\u01b0u \u00fd r\u1eb1ng ch\u00fang t\u00f4i kh\u00f4ng th\u1ec3 \u0111\u1ea3m b\u1ea3o t\u00ednh ch\u00ednh x\u00e1c ho\u1eb7c t\u00ednh k\u1ecbp th\u1eddi c\u1ee7a c\u00e1c t\u00e0i li\u1ec7u \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef b\u00ean ngo\u00e0i.<\/p>\n<ul>\n<li><a href=\"https:\/\/cloudinit.readthedocs.io\/en\/latest\/reference\/examples.html#run-commands-on-first-boot\" target=\"_blank\" rel=\"noreferrer noopener\">T\u00e0i li\u1ec7u Cloud-init &#8211; V\u00ed d\u1ee5: Ch\u1ea1y l\u1ec7nh khi kh\u1edfi \u0111\u1ed9ng l\u1ea7n \u0111\u1ea7u<\/a><\/li>\n<\/ul>\n<p>Ngu\u1ed3n: https:\/\/www.linode.com\/docs\/guides\/run-shell-commands-with-cloud-init\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cloud-init&nbsp;l\u00e0 m\u1ed9t c\u00f4ng c\u1ee5 \u0111a n\u1ec1n t\u1ea3ng, ti\u00eau chu\u1ea9n c\u00f4ng nghi\u1ec7p t\u1ef1 \u0111\u1ed9ng h\u00f3a qu\u00e1 tr\u00ecnh kh\u1edfi t\u1ea1o m\u00e1y ch\u1ee7 m\u1edbi. Cloud-init t\u1eadn d\u1ee5ng si\u00eau d\u1eef li\u1ec7u t\u1eeb n\u1ec1n t\u1ea3ng \u0111\u00e1m m\u00e2y c\u1ee7a b\u1ea1n \u0111\u1ec3 x\u1eed l\u00fd vi\u1ec7c tri\u1ec3n khai trong khi l\u1ea5y d\u1eef li\u1ec7u ng\u01b0\u1eddi d\u00f9ng t\u00f9y ch\u1ec9nh \u0111\u1ec3 l\u1eadp tr\u00ecnh thi\u1ebft l\u1eadp m\u00e1y<\/p>\n","protected":false},"author":1,"featured_media":35980,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[132],"tags":[],"class_list":["post-34959","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cloud-init"],"_links":{"self":[{"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/posts\/34959","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/comments?post=34959"}],"version-history":[{"count":0,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/posts\/34959\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/media\/35980"}],"wp:attachment":[{"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/media?parent=34959"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/categories?post=34959"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/tags?post=34959"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}