{"id":34963,"date":"2024-09-10T14:37:17","date_gmt":"2024-09-10T07:37:17","guid":{"rendered":"http:\/\/jupitek.maudemo.vip\/index.php\/2024\/09\/10\/using-the-linode-packer-builder-to-create-custom-images\/"},"modified":"2024-09-10T14:37:17","modified_gmt":"2024-09-10T07:37:17","slug":"using-the-linode-packer-builder-to-create-custom-images","status":"publish","type":"post","link":"https:\/\/jupitek.maudemo.vip\/index.php\/2024\/09\/10\/using-the-linode-packer-builder-to-create-custom-images\/","title":{"rendered":"S\u1eed d\u1ee5ng Linode Packer Builder \u0111\u1ec3 t\u1ea1o Custom Images"},"content":{"rendered":"<h2 id=\"introduction-to-packer\">Gi\u1edbi thi\u1ec7u v\u1ec1 Packer<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#introduction-to-packer\"><\/a><\/h2>\n<p><a href=\"https:\/\/www.packer.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Packer<\/a>&nbsp;l\u00e0 m\u1ed9t c\u00f4ng c\u1ee5 m\u00e3 ngu\u1ed3n m\u1edf do HashiCorp duy tr\u00ec, \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea1o h\u00ecnh \u1ea3nh m\u00e1y. H\u00ecnh \u1ea3nh m\u00e1y cung c\u1ea5p h\u1ec7 \u0111i\u1ec1u h\u00e0nh, \u1ee9ng d\u1ee5ng, c\u1ea5u h\u00ecnh \u1ee9ng d\u1ee5ng v\u00e0 t\u1ec7p d\u1eef li\u1ec7u m\u00e0 phi\u00ean b\u1ea3n m\u00e1y \u1ea3o s\u1ebd ch\u1ea1y sau khi \u0111\u01b0\u1ee3c tri\u1ec3n khai. Packer c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng k\u1ebft h\u1ee3p v\u1edbi c\u00e1c c\u00f4ng c\u1ee5 qu\u1ea3n l\u00fd c\u1ea5u h\u00ecnh ph\u1ed5 bi\u1ebfn nh\u01b0 Chef, Puppet ho\u1eb7c Ansible \u0111\u1ec3 c\u00e0i \u0111\u1eb7t ph\u1ea7n m\u1ec1m v\u00e0o Linode c\u1ee7a b\u1ea1n v\u00e0 \u0111\u01b0a c\u00e1c c\u1ea5u h\u00ecnh \u0111\u00f3 v\u00e0o h\u00ecnh \u1ea3nh c\u1ee7a b\u1ea1n.<\/p>\n<p><em>M\u1eabu<\/em>&nbsp;Packer&nbsp;l\u01b0u tr\u1eef c\u00e1c tham s\u1ed1 c\u1ea5u h\u00ecnh \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 x\u00e2y d\u1ef1ng h\u00ecnh \u1ea3nh. \u0110i\u1ec1u n\u00e0y chu\u1ea9n h\u00f3a quy tr\u00ecnh x\u00e2y d\u1ef1ng h\u00ecnh \u1ea3nh v\u00e0 \u0111\u1ea3m b\u1ea3o r\u1eb1ng m\u1ecdi ng\u01b0\u1eddi s\u1eed d\u1ee5ng t\u1ec7p m\u1eabu \u0111\u00f3 s\u1ebd lu\u00f4n t\u1ea1o ra m\u1ed9t h\u00ecnh \u1ea3nh gi\u1ed1ng h\u1ec7t nhau. V\u00ed d\u1ee5, \u0111i\u1ec1u n\u00e0y c\u00f3 th\u1ec3 gi\u00fap nh\u00f3m c\u1ee7a b\u1ea1n duy tr\u00ec c\u01a1&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/guides\/what-is-immutable-infrastructure\/\">s\u1edf h\u1ea1 t\u1ea7ng kh\u00f4ng thay \u0111\u1ed5i trong \u0111\u01b0\u1eddng \u1ed1ng&nbsp;<\/a><a href=\"https:\/\/www.linode.com\/docs\/guides\/introduction-ci-cd\/#what-is-continuous-delivery\">ph\u00e2n ph\u1ed1i li\u00ean t\u1ee5c<\/a>&nbsp;c\u1ee7a b\u1ea1n&nbsp;.<\/p>\n<h2 id=\"the-linode-packer-builder\">Tr\u00ecnh x\u00e2y d\u1ef1ng Linode Packer<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#the-linode-packer-builder\"><\/a><\/h2>\n<p>Trong h\u1ec7 sinh th\u00e1i c\u1ee7a Packer,&nbsp;<a href=\"https:\/\/www.packer.io\/docs\/builders\" target=\"_blank\" rel=\"noreferrer noopener\">c\u00e1c nh\u00e0 x\u00e2y d\u1ef1ng<\/a>&nbsp;c\u00f3 tr\u00e1ch nhi\u1ec7m x\u00e2y d\u1ef1ng m\u1ed9t h\u1ec7 th\u1ed1ng v\u00e0 t\u1ea1o ra h\u00ecnh \u1ea3nh t\u1eeb h\u1ec7 th\u1ed1ng \u0111\u00f3. Packer c\u00f3 nhi\u1ec1u lo\u1ea1i nh\u00e0 x\u00e2y d\u1ef1ng kh\u00e1c nhau, m\u1ed7i lo\u1ea1i \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea1o h\u00ecnh \u1ea3nh cho m\u1ed9t n\u1ec1n t\u1ea3ng c\u1ee5 th\u1ec3.<\/p>\n<p>Tr\u00ecnh&nbsp;<a href=\"https:\/\/developer.hashicorp.com\/packer\/integrations\/linode\/linode\" target=\"_blank\" rel=\"noreferrer noopener\">x\u00e2y d\u1ef1ng Linode<\/a>&nbsp;t\u00edch h\u1ee3p Packer v\u1edbi n\u1ec1n t\u1ea3ng Linode. \u0110i\u1ec1u n\u00e0y cho ph\u00e9p Packer tri\u1ec3n khai Linode t\u1ea1m th\u1eddi tr\u00ean t\u00e0i kho\u1ea3n c\u1ee7a b\u1ea1n (s\u1eed d\u1ee5ng m\u00e3 th\u00f4ng b\u00e1o APIv4), c\u1ea5u h\u00ecnh h\u1ec7 th\u1ed1ng tr\u00ean Linode theo c\u00e1c tham s\u1ed1 trong t\u1ec7p m\u1eabu \u0111\u01b0\u1ee3c cung c\u1ea5p, sau \u0111\u00f3 t\u1ea1o h\u00ecnh \u1ea3nh d\u1ef1a tr\u00ean Linode \u0111\u00f3. V\u1ec1 c\u01a1 b\u1ea3n, \u0111\u00e2y l\u00e0 c\u00e1ch thu\u1eadn ti\u1ec7n \u0111\u1ec3 t\u1ef1 \u0111\u1ed9ng t\u1ea1o&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/products\/tools\/images\/\">Linode Images<\/a>&nbsp;tr\u00ean t\u00e0i kho\u1ea3n c\u1ee7a b\u1ea1n, c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 tri\u1ec3n khai nhanh ch\u00f3ng c\u00e1c Linode m\u1edbi.<\/p>\n<h2 id=\"before-you-begin\">Tr\u01b0\u1edbc khi b\u1ea1n b\u1eaft \u0111\u1ea7u<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#before-you-begin\"><\/a><\/h2>\n<p>H\u01b0\u1edbng d\u1eabn n\u00e0y s\u1ebd h\u01b0\u1edbng d\u1eabn b\u1ea1n quy tr\u00ecnh c\u00e0i \u0111\u1eb7t Packer, t\u1ea1o t\u1ec7p m\u1eabu, x\u00e2y d\u1ef1ng h\u00ecnh \u1ea3nh v\u00e0 sau \u0111\u00f3 tri\u1ec3n khai h\u00ecnh \u1ea3nh \u0111\u00f3 l\u00ean Linode m\u1edbi. \u0110i xa h\u01a1n, h\u01b0\u1edbng d\u1eabn n\u00e0y c\u0169ng s\u1ebd \u0111\u1ec1 c\u1eadp \u0111\u1ebfn c\u00e1ch s\u1eed d\u1ee5ng c\u00f4ng c\u1ee5 Ansible v\u1edbi Packer. Tr\u01b0\u1edbc khi b\u1eaft \u0111\u1ea7u, h\u00e3y xem l\u1ea1i nh\u1eefng \u0111i\u1ec1u sau:<\/p>\n<ol>\n<li>\u0110\u1ea3m b\u1ea3o b\u1ea1n c\u00f3 quy\u1ec1n truy c\u1eadp v\u00e0o&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/CURL\" target=\"_blank\" rel=\"noreferrer noopener\">cURL<\/a>&nbsp;tr\u00ean m\u00e1y t\u00ednh c\u1ee7a m\u00ecnh.<\/li>\n<li>T\u1ea1o m\u00e3 th\u00f4ng b\u00e1o truy c\u1eadp Linode API v4 c\u00f3 quy\u1ec1n \u0111\u1ecdc\/ghi cho c\u1ea3&nbsp;<em>Linode<\/em>&nbsp;v\u00e0&nbsp;<em>Images<\/em>&nbsp;. B\u1ea1n c\u00f3 th\u1ec3 l\u00e0m theo ph\u1ea7n&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/products\/tools\/api\/get-started\/#get-an-access-token\">Nh\u1eadn m\u00e3 th\u00f4ng b\u00e1o truy c\u1eadp<\/a>&nbsp;c\u1ee7a h\u01b0\u1edbng d\u1eabn&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/products\/tools\/api\/get-started\/\">B\u1eaft \u0111\u1ea7u v\u1edbi Linode API<\/a>&nbsp;n\u1ebfu b\u1ea1n ch\u01b0a c\u00f3.<\/li>\n<li><em>T\u00f9y ch\u1ecdn:<\/em>&nbsp;\u0110\u1eb7t m\u1ed9t bi\u1ebfn \u0111\u01b0\u1ee3c \u0111\u1eb7t t\u00ean&nbsp;<code>TOKEN<\/code>trong m\u00f4i tr\u01b0\u1eddng shell c\u1ee7a b\u1ea1n b\u1eb1ng c\u00e1ch ch\u1ea1y l\u1ec7nh sau. Thay th\u1ebf&nbsp;<em>x<\/em>&nbsp;b\u1eb1ng m\u00e3 th\u00f4ng b\u00e1o API c\u1ee7a ri\u00eang b\u1ea1n.<\/li>\n<\/ol>\n<pre class=\"wp-block-code\"><code>export TOKEN=x<\/code><\/pre>\n<p class=\"has-background\" style=\"background-color:#74f78c33\">Ghi ch\u00fa: M\u1ed9t s\u1ed1 l\u1ec7nh v\u00ed d\u1ee5 \u0111\u01b0\u1ee3c cung c\u1ea5p trong h\u01b0\u1edbng d\u1eabn n\u00e0y s\u1ebd s\u1eed d\u1ee5ng bi\u1ebfn n\u00e0y. N\u1ebfu b\u1ea1n kh\u00f4ng \u0111\u1eb7t bi\u1ebfn n\u00e0y, b\u1ea1n s\u1ebd c\u1ea7n ph\u1ea3i s\u1eeda \u0111\u1ed5i c\u00e1c l\u1ec7nh n\u00e0y b\u1eb1ng c\u00e1ch thay th\u1ebf&nbsp;<code>$TOKEN<\/code>b\u1eb1ng m\u00e3 th\u00f4ng b\u00e1o API c\u1ee7a b\u1ea1n.<\/p>\n<h2 id=\"installing-packer\">C\u00e0i \u0111\u1eb7t Packer<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#installing-packer\"><\/a><\/h2>\n<p>C\u00e1c h\u01b0\u1edbng d\u1eabn sau \u0111\u00e2y s\u1ebd c\u00e0i \u0111\u1eb7t phi\u00ean b\u1ea3n Packer m\u1edbi nh\u1ea5t tr\u00ean Mac, Ubuntu ho\u1eb7c CentOS. \u0110\u1ec3 bi\u1ebft th\u00eam c\u00e1c ph\u01b0\u01a1ng ph\u00e1p c\u00e0i \u0111\u1eb7t, bao g\u1ed3m c\u00e0i \u0111\u1eb7t tr\u00ean c\u00e1c h\u1ec7 \u0111i\u1ec1u h\u00e0nh kh\u00e1c ho\u1eb7c bi\u00ean d\u1ecbch t\u1eeb ngu\u1ed3n, h\u00e3y xem&nbsp;<a href=\"https:\/\/www.packer.io\/intro\/getting-started\/install.html\" target=\"_blank\" rel=\"noreferrer noopener\">t\u00e0i li\u1ec7u ch\u00ednh th\u1ee9c c\u1ee7a Packer<\/a>&nbsp;v\u00e0 trang web&nbsp;<a href=\"https:\/\/www.packer.io\/downloads\" target=\"_blank\" rel=\"noreferrer noopener\">T\u1ea3i xu\u1ed1ng Packer<\/a>&nbsp;.<\/p>\n<h3 id=\"mac\">M\u00e1y Mac<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#mac\"><\/a><\/h3>\n<p>\u0110\u1ec3 c\u00e0i \u0111\u1eb7t Packer tr\u00ean Mac,&nbsp;<a href=\"https:\/\/brew.sh\/\" target=\"_blank\" rel=\"noreferrer noopener\">Homebrew<\/a>&nbsp;s\u1ebd \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng. Ch\u1ea1y c\u00e1c l\u1ec7nh sau tr\u00ean terminal c\u1ee7a b\u1ea1n:<\/p>\n<pre class=\"wp-block-code\"><code>brew tap hashicorp\/tap\nbrew install hashicorp\/tap\/packer\n<\/code><\/pre>\n<h3 id=\"ubuntu\">Ubuntu<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#ubuntu\"><\/a><\/h3>\n<pre class=\"wp-block-code\"><code>curl -fsSL https:\/\/apt.releases.hashicorp.com\/gpg | sudo apt-key add -\nsudo apt-add-repository \"deb &#91;arch=amd64] https:\/\/apt.releases.hashicorp.com $(lsb_release -cs) main\"\nsudo apt-get update &amp;&amp; sudo apt-get install packer\n<\/code><\/pre>\n<h3 id=\"centosrhel\">CentOS\/RHEL<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#centosrhel\"><\/a><\/h3>\n<pre class=\"wp-block-code\"><code>sudo yum install -y yum-utils\nsudo yum-config-manager --add-repo https:\/\/rpm.releases.hashicorp.com\/RHEL\/hashicorp.repo\nsudo yum -y install packer\n<\/code><\/pre>\n<h3 id=\"verifying-the-installation\">X\u00e1c minh c\u00e0i \u0111\u1eb7t<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#verifying-the-installation\"><\/a><\/h3>\n<p>X\u00e1c minh Packer \u0111\u00e3 \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t th\u00e0nh c\u00f4ng b\u1eb1ng c\u00e1ch ch\u1ea1y l\u1ec7nh&nbsp;<code>packer --version<\/code>. L\u1ec7nh n\u00e0y s\u1ebd xu\u1ea5t ra s\u1ed1 phi\u00ean b\u1ea3n cho l\u1ea7n c\u00e0i \u0111\u1eb7t Packer n\u00e0y. \u0110\u1ec3 tham kh\u1ea3o, h\u01b0\u1edbng d\u1eabn n\u00e0y \u0111\u00e3 \u0111\u01b0\u1ee3c th\u1eed nghi\u1ec7m l\u1ea7n cu\u1ed1i b\u1eb1ng phi\u00ean b\u1ea3n 1.7.2.<\/p>\n<h2 id=\"constructing-a-template-for-packer\">X\u00e2y d\u1ef1ng m\u1ed9t m\u1eabu cho Packer<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#constructing-a-template-for-packer\"><\/a><\/h2>\n<p>B\u00e2y gi\u1edd Packer \u0111\u00e3 \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t, b\u1ea1n c\u00f3 th\u1ec3 t\u1ea1o m\u1ed9t&nbsp;<a href=\"https:\/\/www.packer.io\/docs\/templates\" target=\"_blank\" rel=\"noreferrer noopener\">m\u1eabu<\/a>&nbsp;Packer . M\u1eabu l\u00e0 m\u1ed9t t\u1ec7p ch\u1ee9a c\u00e1c c\u1ea5u h\u00ecnh c\u1ea7n thi\u1ebft \u0111\u1ec3 x\u00e2y d\u1ef1ng m\u1ed9t h\u00ecnh \u1ea3nh m\u00e1y. M\u1eabu c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c \u0111\u1ecbnh d\u1ea1ng theo&nbsp;<a href=\"https:\/\/www.packer.io\/docs\/templates\/legacy_json_templates\" target=\"_blank\" rel=\"noreferrer noopener\">JSON<\/a>&nbsp;ho\u1eb7c&nbsp;<a href=\"https:\/\/www.packer.io\/docs\/templates\/hcl_templates\" target=\"_blank\" rel=\"noreferrer noopener\">HCL2<\/a>&nbsp;(Ng\u00f4n ng\u1eef c\u1ea5u h\u00ecnh Hashicorp). K\u1ec3 t\u1eeb Packer v1.7.0, \u0111\u1ecbnh d\u1ea1ng m\u1eabu HCL2 \u0111\u01b0\u1ee3c \u01b0u ti\u00ean v\u00e0 do \u0111\u00f3 s\u1ebd \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng trong c\u00e1c v\u00ed d\u1ee5 trong h\u01b0\u1edbng d\u1eabn n\u00e0y.<\/p>\n<p class=\"has-background\" style=\"background-color:#74f78c33\">Ghi ch\u00fa: C\u00e1c b\u01b0\u1edbc trong ph\u1ea7n n\u00e0y s\u1ebd ph\u00e1t sinh chi ph\u00ed li\u00ean quan \u0111\u1ebfn vi\u1ec7c tri\u1ec3n khai&nbsp;<a href=\"https:\/\/www.linode.com\/pricing\" target=\"_blank\" rel=\"noreferrer noopener\">Linode 1GB<\/a>&nbsp;(Nanode). Linode s\u1ebd ch\u1ec9 \u0111\u01b0\u1ee3c tri\u1ec3n khai trong kho\u1ea3ng th\u1eddi gian c\u1ea7n thi\u1ebft \u0111\u1ec3 t\u1ea1o v\u00e0 ch\u1ee5p nhanh h\u00ecnh \u1ea3nh c\u1ee7a b\u1ea1n v\u00e0 sau \u0111\u00f3 s\u1ebd b\u1ecb x\u00f3a. Xem h\u01b0\u1edbng d\u1eabn&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/products\/platform\/billing\/\">Thanh to\u00e1n v\u00e0 L\u1eadp h\u00f3a \u0111\u01a1n<\/a>&nbsp;c\u1ee7a ch\u00fang t\u00f4i \u0111\u1ec3 bi\u1ebft chi ti\u1ebft v\u1ec1 c\u00e1ch th\u1ee9c ho\u1ea1t \u0111\u1ed9ng c\u1ee7a t\u00ednh n\u0103ng l\u1eadp h\u00f3a \u0111\u01a1n theo gi\u1edd.<\/p>\n<h3 id=\"creating-the-template-file\">T\u1ea1o t\u1ec7p m\u1eabu<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#creating-the-template-file\"><\/a><\/h3>\n<p>T\u1ea1o m\u1ed9t t\u1ec7p c\u00f3 t\u00ean&nbsp;<code>example.pkr.hcl<\/code>. T\u1ec7p c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef \u1edf b\u1ea5t k\u1ef3 \u0111\u00e2u, m\u1eb7c d\u00f9 b\u1ea1n c\u00f3 th\u1ec3 mu\u1ed1n t\u1ea1o m\u1ed9t th\u01b0 m\u1ee5c c\u00f3 t\u00ean&nbsp;<code>packer<\/code>trong th\u01b0 m\u1ee5c g\u1ed1c c\u1ee7a m\u00ecnh, n\u01a1i b\u1ea1n c\u00f3 th\u1ec3 l\u01b0u tr\u1eef t\u1ea5t c\u1ea3 c\u00e1c t\u1ec7p m\u1eabu c\u1ee7a m\u00ecnh. Ch\u1ec9nh s\u1eeda t\u1ec7p n\u00e0y v\u00e0 nh\u1eadp ho\u1eb7c d\u00e1n n\u1ed9i dung sau:<\/p>\n<pre class=\"wp-block-code\"><code>variable \"linode_api_token\" {\n  type    = string\n  default = \"\"\n}\n\nsource \"linode\" \"example\" {\n  image             = \"linode\/debian10\"\n  image_description = \"This image was created using Packer.\"\n  image_label       = \"packer-debian-10\"\n  instance_label    = \"temp-packer-debian-10\"\n  instance_type     = \"g6-nanode-1\"\n  linode_token      = \"${var.linode_api_token}\"\n  region            = \"us-east\"\n  ssh_username      = \"root\"\n}\n\nbuild {\n  sources = &#91;\"source.linode.example\"]\n}<\/code><\/pre>\n<h3 id=\"understanding-template-blocks\">Hi\u1ec3u v\u1ec1 kh\u1ed1i m\u1eabu<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#understanding-template-blocks\"><\/a><\/h3>\n<p>T\u1ec7p m\u1eabu \u0111\u1ecbnh d\u1ea1ng HCL2 th\u01b0\u1eddng ch\u1ee9a m\u1ed9t s\u1ed1&nbsp;<a href=\"https:\/\/www.packer.io\/docs\/templates\/hcl_templates\/blocks\" target=\"_blank\" rel=\"noreferrer noopener\">kh\u1ed1i<\/a>&nbsp;. M\u1ed9t kh\u1ed1i c\u00f3 th\u1ec3 \u0111\u1ecbnh ngh\u0129a m\u1ed9t bi\u1ebfn, ch\u1ec9 \u0111\u1ecbnh c\u00e1c tham s\u1ed1 ch\u00ednh x\u00e1c cho plugin x\u00e2y d\u1ef1ng ho\u1eb7c ph\u00e1c th\u1ea3o nh\u1eefng g\u00ec s\u1ebd x\u1ea3y ra khi m\u1eabu \u0111\u01b0\u1ee3c x\u00e2y d\u1ef1ng. Sau \u0111\u00e2y l\u00e0 m\u1ed9t s\u1ed1 kh\u1ed1i s\u1ebd \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng trong h\u1ea7u h\u1ebft c\u00e1c m\u1eabu:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#variable-block\">Kh\u1ed1i bi\u1ebfn \u0111\u1ed5i<\/a><\/li>\n<li><a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#source-block-the-linode-builder\">Kh\u1ed1i Ngu\u1ed3n<\/a><\/li>\n<li><a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#build-block\">Kh\u1ed1i x\u00e2y d\u1ef1ng<\/a><\/li>\n<\/ul>\n<h3 id=\"variable-block\">Kh\u1ed1i bi\u1ebfn \u0111\u1ed5i<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#variable-block\"><\/a><\/h3>\n<p>M\u1ed9t&nbsp;<code>variable<\/code>kh\u1ed1i ch\u1ee9a m\u1ed9t bi\u1ebfn do ng\u01b0\u1eddi d\u00f9ng \u0111\u1ecbnh ngh\u0129a c\u00f9ng v\u1edbi b\u1ea5t k\u1ef3 tham s\u1ed1 ho\u1eb7c gi\u00e1 tr\u1ecb b\u1ed5 sung n\u00e0o. C\u00f3 th\u1ec3 c\u00f3 nhi\u1ec1u kh\u1ed1i bi\u1ebfn trong m\u1ed9t m\u1eabu \u0111\u1ec3 \u0111\u1ecbnh ngh\u0129a nhi\u1ec1u bi\u1ebfn. Gi\u00e1 tr\u1ecb c\u1ee7a m\u1ed9t bi\u1ebfn c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u1edf n\u01a1i kh\u00e1c trong m\u1eabu th\u00f4ng qua c\u00fa ph\u00e1p&nbsp;<code>${var.variable_name}<\/code>, trong \u0111\u00f3&nbsp;<em>t\u00ean_bi\u1ebfn<\/em>&nbsp;l\u00e0 t\u00ean \u0111\u01b0\u1ee3c \u0111\u1eb7t cho bi\u1ebfn.<\/p>\n<p>V\u00ed d\u1ee5 n\u00e0y ch\u1ec9 ch\u1ee9a m\u1ed9t bi\u1ebfn:&nbsp;<code>linode_api_token<\/code>. Gi\u00e1 tr\u1ecb c\u1ee7a bi\u1ebfn n\u00e0y \u0111\u01b0\u1ee3c c\u1ed1 \u00fd \u0111\u1ec3 tr\u1ed1ng (&nbsp;<code>default = \"\"<\/code>). Thay v\u00ec \u0111\u1eb7t bi\u1ebfn trong m\u1eabu, n\u00f3 s\u1ebd \u0111\u01b0\u1ee3c \u0111\u1eb7t th\u00f4ng qua d\u00f2ng l\u1ec7nh khi ch\u1ea1y l\u1ec7nh&nbsp;<code>packer build<\/code>:&nbsp;<code>packer build -var linode_api_token=x example.pkr.hcl<\/code>, trong \u0111\u00f3&nbsp;<em>x<\/em>&nbsp;l\u00e0 m\u00e3 th\u00f4ng b\u00e1o API c\u1ee7a b\u1ea1n.<\/p>\n<p>T\u00ecm hi\u1ec3u th\u00eam v\u1ec1 c\u00e1c bi\u1ebfn m\u1eabu Packer tr\u00ean trang&nbsp;<a href=\"https:\/\/www.packer.io\/docs\/templates\/hcl_templates\/variables\" target=\"_blank\" rel=\"noreferrer noopener\">Bi\u1ebfn<\/a>&nbsp;c\u1ee7a t\u00e0i li\u1ec7u Packer.<\/p>\n<h3 id=\"source-block-the-linode-builder\">Kh\u1ed1i ngu\u1ed3n (Tr\u00ecnh x\u00e2y d\u1ef1ng Linode)<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#source-block-the-linode-builder\"><\/a><\/h3>\n<p>M\u1ed9t&nbsp;<code>source<\/code>kh\u1ed1i x\u00e1c \u0111\u1ecbnh c\u00e1c tham s\u1ed1 cho m\u1ed9t plugin x\u00e2y d\u1ef1ng. C\u00e1c ngu\u1ed3n n\u00e0y sau \u0111\u00f3 c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng trong&nbsp;<code>build<\/code>kh\u1ed1i. Nhi\u1ec1u ngu\u1ed3n c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c x\u00e1c \u0111\u1ecbnh trong m\u1ed9t m\u1eabu, cho ph\u00e9p b\u1ea1n c\u00f3 kh\u1ea3 n\u0103ng t\u1ea1o nhi\u1ec1u h\u00ecnh \u1ea3nh cho nhi\u1ec1u n\u1ec1n t\u1ea3ng. Danh s\u00e1ch \u0111\u1ea7y \u0111\u1ee7 c\u00e1c tr\u00ecnh x\u00e2y d\u1ef1ng c\u00f3 s\u1eb5n c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c t\u00ecm th\u1ea5y tr\u00ean trang&nbsp;<a href=\"https:\/\/www.packer.io\/docs\/builders\" target=\"_blank\" rel=\"noreferrer noopener\">Tr\u00ecnh x\u00e2y d\u1ef1ng<\/a>&nbsp;c\u1ee7a t\u00e0i li\u1ec7u Packer.<\/p>\n<p>D\u00f2ng b\u1eaft \u0111\u1ea7u c\u1ee7a m\u1ed7i&nbsp;<code>source<\/code>kh\u1ed1i s\u1ebd ch\u1ee9a plugin x\u00e2y d\u1ef1ng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng c\u0169ng nh\u01b0 t\u00ean \u0111\u01b0\u1ee3c \u0111\u1eb7t cho ngu\u1ed3n c\u1ee5 th\u1ec3 n\u00e0y trong m\u1eabu. V\u00ed d\u1ee5, d\u00f2ng b\u1eaft \u0111\u1ea7u cho ngu\u1ed3n trong v\u00ed d\u1ee5 n\u00e0y (&nbsp;<code>source \"linode\" \"example\" {<\/code>) ch\u1ec9 \u0111\u1ecbnh r\u1eb1ng tr\u00ecnh x\u00e2y d\u1ef1ng Linode s\u1ebd \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng v\u00e0 ngu\u1ed3n n\u00e0y s\u1ebd \u0111\u01b0\u1ee3c \u0111\u1eb7t t\u00ean l\u00e0 &#8220;example&#8221;.<\/p>\n<h4 id=\"parameters-for-the-linode-builder\">C\u00e1c tham s\u1ed1 cho Linode Builder<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#parameters-for-the-linode-builder\"><\/a><\/h4>\n<p>V\u00ed d\u1ee5 n\u00e0y s\u1eed d\u1ee5ng tr\u00ecnh x\u00e2y d\u1ef1ng Linode Packer l\u00e0m ngu\u1ed3n. M\u1ed7i tham s\u1ed1 trong&nbsp;<code>source<\/code>kh\u1ed1i \u0111\u01b0\u1ee3c n\u00eau tr\u00ean trang&nbsp;<a href=\"https:\/\/developer.hashicorp.com\/packer\/integrations\/linode\/linode\" target=\"_blank\" rel=\"noreferrer noopener\">Linode Builder<\/a>&nbsp;trong t\u00e0i li\u1ec7u c\u1ee7a Packer.<\/p>\n<p><code>image<\/code>: ID c\u1ee7a h\u00ecnh \u1ea3nh \u201cstarter\u201d \u0111\u1ec3 s\u1eed d\u1ee5ng. \u0110\u00e2y c\u00f3 th\u1ec3 l\u00e0 m\u1ed9t trong nh\u1eefng h\u00ecnh \u1ea3nh Linode ch\u00ednh th\u1ee9c ho\u1eb7c b\u1ea5t k\u1ef3 h\u00ecnh \u1ea3nh t\u00f9y ch\u1ec9nh ri\u00eang t\u01b0 n\u00e0o tr\u00ean t\u00e0i kho\u1ea3n c\u1ee7a b\u1ea1n. Trong v\u00ed d\u1ee5 n\u00e0y, ch\u00fang t\u00f4i s\u1ebd s\u1eed d\u1ee5ng&nbsp;<code>linode\/debian10<\/code>\u0111\u1ec3 ch\u1ec9 \u0111\u1ecbnh h\u00ecnh \u1ea3nh Linode Debian 10 ch\u00ednh th\u1ee9c. B\u1ea1n c\u00f3 th\u1ec3 xem t\u1ea5t c\u1ea3 c\u00e1c h\u00ecnh \u1ea3nh c\u00f3 s\u1eb5n cho m\u00ecnh b\u1eb1ng c\u00e1ch ch\u1ea1y l\u1ec7nh curl sau:<\/p>\n<pre class=\"wp-block-code\"><code>curl -H \"Authorization: Bearer $TOKEN\" https:\/\/api.linode.com\/v4\/images\n<\/code><\/pre>\n<p><code>image_label<\/code>(t\u00f9y ch\u1ecdn): Nh\u00e3n cho h\u00ecnh \u1ea3nh t\u00f9y ch\u1ec9nh m\u1edbi m\u00e0 m\u1eabu n\u00e0y s\u1ebd t\u1ea1o ra.<\/p>\n<p><code>image_description<\/code>(t\u00f9y ch\u1ecdn): M\u00f4 t\u1ea3 ng\u1eafn g\u1ecdn cho h\u00ecnh \u1ea3nh t\u00f9y ch\u1ec9nh m\u1edbi.<\/p>\n<p><code>instance_label<\/code>(t\u00f9y ch\u1ecdn): Nh\u00e3n cho Linode t\u1ea1m th\u1eddi m\u00e0 Packer s\u1ebd tri\u1ec3n khai \u0111\u1ec3 t\u1ea1o h\u00ecnh \u1ea3nh m\u1edbi.<\/p>\n<p><code>instance_type<\/code>ID c\u1ee7a lo\u1ea1i phi\u00ean b\u1ea3n cho Linode t\u1ea1m th\u1eddi n\u00e0y. M\u1eabu n\u00e0y ch\u1ec9 \u0111\u1ecbnh&nbsp;<code>g6-nanode-1<\/code>, l\u00e0 ID cho Linode 1GB (Nanode). Trong h\u1ea7u h\u1ebft c\u00e1c tr\u01b0\u1eddng h\u1ee3p, Nanode s\u1ebd ho\u1ea1t \u0111\u1ed9ng t\u1ed1t \u0111\u1ec3 t\u1ea1o h\u00ecnh \u1ea3nh v\u00ec n\u00f3 \u0111i k\u00e8m v\u1edbi 25GB dung l\u01b0\u1ee3ng \u0111\u0129a. B\u1ea1n c\u00f3 th\u1ec3 xem t\u1ea5t c\u1ea3 c\u00e1c lo\u1ea1i Linode b\u1eb1ng c\u00e1ch ch\u1ea1y l\u1ec7nh curl sau:<\/p>\n<pre class=\"wp-block-code\"><code>curl https:\/\/api.linode.com\/v4\/linode\/types\n<\/code><\/pre>\n<p><code>linode_token<\/code>: M\u00e3 th\u00f4ng b\u00e1o truy c\u1eadp c\u00e1 nh\u00e2n API Linode \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 cung c\u1ea5p cho Packer quy\u1ec1n truy c\u1eadp v\u00e0o t\u00e0i kho\u1ea3n c\u1ee7a b\u1ea1n. M\u00e3 n\u00e0y \u0111\u01b0\u1ee3c \u0111\u1eb7t&nbsp;<code>${var.linode_api_token}<\/code>trong m\u1eabu v\u00ec ch\u00fang ta s\u1ebd s\u1eed d\u1ee5ng bi\u1ebfn d\u00f2ng l\u1ec7nh \u0111\u1ec3 cung c\u1ea5p m\u00e3 th\u00f4ng b\u00e1o n\u00e0y thay v\u00ec l\u01b0u tr\u1ef1c ti\u1ebfp trong m\u1eabu.<\/p>\n<p><code>region<\/code>: ID c\u1ee7a trung t\u00e2m d\u1eef li\u1ec7u. Trong m\u1eabu n\u00e0y, ID c\u1ee7a trung t\u00e2m d\u1eef li\u1ec7u Newark \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng:&nbsp;<code>us-east<\/code>. B\u1ea1n c\u00f3 th\u1ec3 xem t\u1ea5t c\u1ea3 c\u00e1c v\u00f9ng b\u1eb1ng c\u00e1ch ch\u1ea1y l\u1ec7nh curl sau:<\/p>\n<pre class=\"wp-block-code\"><code>curl https:\/\/api.linode.com\/v4\/regions\n<\/code><\/pre>\n<h3 id=\"build-block\">Kh\u1ed1i x\u00e2y d\u1ef1ng<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#build-block\"><\/a><\/h3>\n<p>Kh\u1ed1i n\u00e0y&nbsp;<code>build<\/code>cho Packer bi\u1ebft ph\u1ea3i l\u00e0m g\u00ec khi m\u1eabu \u0111\u01b0\u1ee3c x\u00e2y d\u1ef1ng. Kh\u1ed1i n\u00e0y s\u1ebd tham chi\u1ebfu a&nbsp;<code>source<\/code>v\u00e0 t\u00f9y ch\u1ecdn ch\u1ec9 \u0111\u1ecbnh a&nbsp;<code>provisioner<\/code>ho\u1eb7c&nbsp;<code>post-processor<\/code>.<\/p>\n<h2 id=\"building-the-image\">X\u00e2y d\u1ef1ng h\u00ecnh \u1ea3nh<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#building-the-image\"><\/a><\/h2>\n<p>Sau khi t\u1ec7p m\u1eabu \u0111\u01b0\u1ee3c l\u01b0u v\u1edbi c\u00e1c th\u00f4ng s\u1ed1 mong mu\u1ed1n, gi\u1edd \u0111\u00e2y b\u1ea1n \u0111\u00e3 s\u1eb5n s\u00e0ng \u0111\u1ec3 x\u00e2y d\u1ef1ng h\u00ecnh \u1ea3nh.<\/p>\n<p>1.Tr\u01b0\u1edbc ti\u00ean, h\u00e3y x\u00e1c th\u1ef1c m\u1eabu b\u1eb1ng c\u00e1ch ch\u1ea1y&nbsp;<code>packer validate<\/code>l\u1ec7nh b\u00ean d\u01b0\u1edbi. N\u1ebfu b\u1ea1n kh\u00f4ng \u0111\u1eb7t TOKEN l\u00e0m bi\u1ebfn trong m\u00f4i tr\u01b0\u1eddng shell c\u1ee7a m\u00ecnh, h\u00e3y thay th\u1ebf&nbsp;<em>$TOKEN<\/em>&nbsp;b\u1eb1ng m\u00e3 th\u00f4ng b\u00e1o API Linode c\u1ee7a ri\u00eang b\u1ea1n. N\u1ebfu th\u00e0nh c\u00f4ng, s\u1ebd kh\u00f4ng c\u00f3 l\u1ed7i n\u00e0o \u0111\u01b0\u1ee3c \u0111\u01b0a ra.<\/p>\n<pre class=\"wp-block-code\"><code>packer validate -var linode_api_token=$TOKEN example.pkr.hcl<\/code><\/pre>\n<p class=\"has-background\" style=\"background-color:#74f78c33\">Ghi ch\u00fa: \u0110\u1ec3 t\u00ecm hi\u1ec3u c\u00e1ch l\u01b0u tr\u1eef v\u00e0 s\u1eed d\u1ee5ng m\u00e3 th\u00f4ng b\u00e1o API v4 m\u1ed9t c\u00e1ch an to\u00e0n, h\u00e3y xem ph\u1ea7n&nbsp;<a href=\"https:\/\/www.packer.io\/docs\/templates\/hcl_templates\/functions\/contextual\/vault\" target=\"_blank\" rel=\"noreferrer noopener\">Vault<\/a>&nbsp;trong t\u00e0i li\u1ec7u c\u1ee7a Packer.<\/p>\n<p>2.X\u00e2y d\u1ef1ng h\u00ecnh \u1ea3nh b\u1eb1ng c\u00e1ch ch\u1ea1y&nbsp;<code>packer build<\/code>l\u1ec7nh b\u00ean d\u01b0\u1edbi. Gi\u1ed1ng nh\u01b0 trong b\u01b0\u1edbc cu\u1ed1i c\u00f9ng, n\u1ebfu b\u1ea1n kh\u00f4ng \u0111\u1eb7t TOKEN l\u00e0m bi\u1ebfn trong m\u00f4i tr\u01b0\u1eddng shell c\u1ee7a m\u00ecnh, h\u00e3y thay th\u1ebf&nbsp;<em>$TOKEN<\/em>&nbsp;b\u1eb1ng m\u00e3 th\u00f4ng b\u00e1o API Linode c\u1ee7a ri\u00eang b\u1ea1n. Qu\u00e1 tr\u00ecnh n\u00e0y c\u00f3 th\u1ec3 m\u1ea5t v\u00e0i ph\u00fat \u0111\u1ec3 ho\u00e0n t\u1ea5t.<code>packer build -var linode_api_token=$TOKEN example.pkr.hcl <\/code>\u0110\u1ea7u ra c\u1ee7a l\u1ec7nh n\u00e0y s\u1ebd ph\u00e1c th\u1ea3o t\u1eebng quy tr\u00ecnh m\u00e0 Packer tr\u1ea3i qua. Khi ho\u00e0n t\u1ea5t, d\u00f2ng cu\u1ed1i c\u00f9ng s\u1ebd cung c\u1ea5p cho b\u1ea1n ID cho h\u00ecnh \u1ea3nh t\u00f9y ch\u1ec9nh m\u1edbi.<\/p>\n<h2 id=\"deploying-a-linode-with-the-new-image\">Tri\u1ec3n khai Linode v\u1edbi Image m\u1edbi<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#deploying-a-linode-with-the-new-image\"><\/a><\/h2>\n<p>Sau khi qu\u00e1 tr\u00ecnh x\u00e2y d\u1ef1ng Packer ho\u00e0n t\u1ea5t, m\u1ed9t&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/products\/tools\/images\/\">Custom Image<\/a>&nbsp;m\u1edbi s\u1ebd xu\u1ea5t hi\u1ec7n tr\u00ean t\u00e0i kho\u1ea3n c\u1ee7a b\u1ea1n. C\u00f3 th\u1ec3 tri\u1ec3n khai Image n\u00e0y theo m\u1ed9t s\u1ed1 c\u00e1ch sau:<\/p>\n<p><strong>Cloud Manager:<\/strong>&nbsp;S\u1eed d\u1ee5ng Cloud Manager \u0111\u1ec3 tri\u1ec3n khai \u1ea2nh t\u00f9y ch\u1ec9nh b\u1eb1ng c\u00e1ch l\u00e0m theo h\u01b0\u1edbng d\u1eabn&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/products\/tools\/images\/guides\/deploy-image-to-new-linode\/\">Tri\u1ec3n khai \u1ea2nh cho Phi\u00ean b\u1ea3n t\u00ednh to\u00e1n m\u1edbi<\/a>&nbsp;.<\/p>\n<p><strong>Linode CLI:<\/strong>&nbsp;S\u1eed d\u1ee5ng Linode CLI th\u00f4ng qua d\u00f2ng l\u1ec7nh b\u1eb1ng c\u00e1ch l\u00e0m theo h\u01b0\u1edbng d\u1eabn&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/products\/tools\/cli\/get-started\/\">S\u1eed d\u1ee5ng Linode CLI<\/a>&nbsp;. H\u01b0\u1edbng d\u1eabn&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/products\/tools\/cli\/guides\/linode-instances\/\">Linode Instances<\/a>&nbsp;cung c\u1ea5p c\u00e1c l\u1ec7nh v\u00ed d\u1ee5. L\u1ec7nh b\u00ean d\u01b0\u1edbi s\u1ebd tri\u1ec3n khai m\u1ed9t Linode m\u1edbi trong trung t\u00e2m d\u1eef li\u1ec7u Newark. Thay&nbsp;<em>mypassword<\/em>&nbsp;b\u1eb1ng m\u1eadt kh\u1ea9u g\u1ed1c m\u00e0 b\u1ea1n mu\u1ed1n s\u1eed d\u1ee5ng v\u00e0&nbsp;<em>linode\/debian10<\/em>&nbsp;b\u1eb1ng ID c\u1ee7a image m\u1edbi c\u1ee7a b\u1ea1n.<\/p>\n<pre class=\"wp-block-code\"><code>linode-cli linodes create --root_pass mypassword --region us-east --image linode\/debian10\n<\/code><\/pre>\n<p><strong>Linode APIv4:<\/strong>&nbsp;S\u1eed d\u1ee5ng Linode API \u0111\u1ec3 t\u1ea1o Linode m\u1edbi theo ch\u01b0\u01a1ng tr\u00ecnh b\u1eb1ng c\u00e1ch xem l\u1ea1i t\u00e0i li\u1ec7u \u0111\u01b0\u1ee3c n\u00eau trong&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/api\/linode-instances\/#linode-create\">API &gt; Linode Instances &gt; Linode Create<\/a>&nbsp;. L\u1ec7nh curl v\u00ed d\u1ee5 sau s\u1ebd tri\u1ec3n khai Linode 1GB (Nanode) \u0111\u1ebfn trung t\u00e2m d\u1eef li\u1ec7u Newark. \u0110\u1ea3m b\u1ea3o b\u1ea1n thay th\u1ebf m\u1ecdi tham s\u1ed1 c\u1ea7n thi\u1ebft, bao g\u1ed3m thay th\u1ebf&nbsp;<code>linode\/debain10<\/code>b\u1eb1ng ID c\u1ee7a Custom Image v\u00e0 ch\u1ec9 \u0111\u1ecbnh c\u1ee7a ri\u00eang b\u1ea1n&nbsp;<code>root_pass<\/code>v\u00e0&nbsp;<code>label<\/code>.<\/p>\n<pre class=\"wp-block-code\"><code>curl -H \"Content-Type: application\/json\" \\\n    -H \"Authorization: Bearer $TOKEN\" \\\n    -X POST -d '{\n      \"image\": \"private\/7550080\",\n      \"root_pass\": \"aComplexP@ssword\",\n      \"booted\": true,\n      \"label\": \"my-example-label\",\n      \"type\": \"g6-nanode-1\",\n      \"region\": \"us-east\"\n    }' \\\n    https:&#47;&#47;api.linode.com\/v4\/linode\/instances<\/code><\/pre>\n<h2 id=\"going-further-with-ansible\">Ti\u1ebfn xa h\u01a1n v\u1edbi Ansible<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#going-further-with-ansible\"><\/a><\/h2>\n<p>Packer l\u00e0 c\u00f4ng c\u1ee5 c\u1ef1c k\u1ef3 m\u1ea1nh m\u1ebd v\u00e0 c\u00f3 th\u1ec3 t\u00f9y ch\u1ec9nh \u0111\u1ec3 t\u1ea1o h\u00ecnh \u1ea3nh. M\u1eabu \u0111\u1ea7u ti\u00ean \u0111\u01b0\u1ee3c n\u00eau trong h\u01b0\u1edbng d\u1eabn n\u00e0y l\u00e0 m\u1ed9t v\u00ed d\u1ee5 t\u1ed1i gi\u1ea3n v\u00e0 kh\u00f4ng th\u1ec3 hi\u1ec7n h\u1ebft ti\u1ec1m n\u0103ng th\u1ef1c s\u1ef1 c\u1ee7a Packer. \u0110\u1ec3 ti\u1ebfn xa h\u01a1n, ph\u1ea7n n\u00e0y s\u1ebd \u0111\u1ec1 c\u1eadp \u0111\u1ebfn vi\u1ec7c t\u00edch h\u1ee3p Packer v\u1edbi Ansible. Ansible l\u00e0 m\u1ed9t trong nhi\u1ec1u t\u00f9y ch\u1ecdn kh\u00e1c nhau c\u00f3 s\u1eb5n \u0111\u1ec3 t\u00f9y ch\u1ec9nh h\u00ecnh \u1ea3nh trong Packer.<\/p>\n<p>Ansible l\u00e0 m\u1ed9t c\u00f4ng c\u1ee5 t\u1ef1 \u0111\u1ed9ng h\u00f3a \u0111\u1ec3 cung c\u1ea5p, c\u1ea5u h\u00ecnh v\u00e0 qu\u1ea3n l\u00fd m\u00e1y ch\u1ee7. Tr\u01b0\u1edbc khi ti\u1ebfp t\u1ee5c, h\u00e3y l\u00e0m theo h\u01b0\u1edbng d\u1eabn&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/guides\/getting-started-with-ansible\/\">B\u1eaft \u0111\u1ea7u v\u1edbi Ansible &#8211; C\u00e0i \u0111\u1eb7t v\u00e0 thi\u1ebft l\u1eadp c\u01a1 b\u1ea3n<\/a>&nbsp;\u0111\u1ec3 c\u00e0i \u0111\u1eb7t Ansible v\u00e0 l\u00e0m quen v\u1edbi c\u00e1c kh\u00e1i ni\u1ec7m c\u01a1 b\u1ea3n c\u1ee7a Ansible.<\/p>\n<h3 id=\"creating-the-ansible-playbook\">T\u1ea1o Playbook Ansible<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#creating-the-ansible-playbook\"><\/a><\/h3>\n<p>Playbook Ansible ph\u00e1c th\u1ea3o c\u00e1c t\u00e1c v\u1ee5 v\u00e0 t\u1eadp l\u1ec7nh s\u1ebd ch\u1ea1y khi cung c\u1ea5p m\u00e1y ch\u1ee7. B\u1ea1n s\u1ebd t\u1ea1o m\u1ed9t playbook th\u00eam t\u00e0i kho\u1ea3n ng\u01b0\u1eddi d\u00f9ng gi\u1edbi h\u1ea1n tr\u00ean Linode&nbsp;<em>tr\u01b0\u1edbc khi<\/em>&nbsp;Packer t\u1ea1o h\u00ecnh \u1ea3nh cu\u1ed1i c\u00f9ng.<\/p>\n<p>1.S\u1eed d\u1ee5ng ti\u1ec7n \u00edch&nbsp;<a href=\"https:\/\/linux.die.net\/man\/1\/mkpasswd\" target=\"_blank\" rel=\"noreferrer noopener\">mkpasswd<\/a>&nbsp;(c\u00f3 s\u1eb5n tr\u00ean nhi\u1ec1u h\u1ec7 th\u1ed1ng Linux) \u0111\u1ec3 t\u1ea1o m\u1eadt kh\u1ea9u b\u0103m. Ti\u1ec7n \u00edch n\u00e0y s\u1ebd \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng khi c\u1ea5u h\u00ecnh&nbsp;<a href=\"https:\/\/docs.ansible.com\/ansible\/latest\/modules\/user_module.html\" target=\"_blank\" rel=\"noreferrer noopener\">m\u00f4-\u0111un ng\u01b0\u1eddi d\u00f9ng<\/a>&nbsp;c\u1ee7a Ansible cho t\u00e0i kho\u1ea3n ng\u01b0\u1eddi d\u00f9ng gi\u1edbi h\u1ea1n c\u1ee7a b\u1ea1n.<\/p>\n<pre class=\"wp-block-code\"><code>mkpasswd --method=sha-512\n<\/code><\/pre>\n<p>B\u1ea1n s\u1ebd \u0111\u01b0\u1ee3c nh\u1eafc nh\u1eadp m\u1eadt kh\u1ea9u d\u1ea1ng v\u0103n b\u1ea3n thu\u1ea7n t\u00fay v\u00e0 ti\u1ec7n \u00edch s\u1ebd tr\u1ea3 v\u1ec1 m\u00e3 b\u0103m c\u1ee7a m\u1eadt kh\u1ea9u.<\/p>\n<p>2.T\u1ea1o t\u1ec7p playbook v\u1edbi n\u1ed9i dung sau. Thay&nbsp;<em>username<\/em>&nbsp;b\u1eb1ng t\u00ean ng\u01b0\u1eddi d\u00f9ng b\u1ea1n mu\u1ed1n th\u00eam v\u00e0 thay th\u1ebf&nbsp;<code>password<\/code>b\u1eb1ng b\u0103m m\u1eadt kh\u1ea9u \u0111\u01b0\u1ee3c t\u1ea1o \u1edf b\u01b0\u1edbc tr\u01b0\u1edbc.<\/p>\n<pre class=\"wp-block-code\"><code>---\n- hosts: all\n  remote_user: root\n  vars:\n    NORMAL_USER_NAME: 'username'\n  tasks:\n    - name: \"Create a secondary, non-root user\"\n      user: name={{ NORMAL_USER_NAME }}\n            password='$6$eebkauNy4h$peyyL1MTN7F4JKG44R27TTmbXlloDUsjPir\/ATJue2bL0u8FBk0VuUvrpsMq6rSSOCm8VSip0QHN8bDaD\/M\/k\/'\n            shell=\/bin\/bash\n    - name: Add remote authorized key to allow future passwordless logins\n      authorized_key: user={{ NORMAL_USER_NAME }} key=\"{{ lookup('file', '~\/.ssh\/id_rsa.pub') }}\"\n    - name: Add normal user to sudoers\n      lineinfile: dest=\/etc\/sudoers\n                  regexp=\"{{ NORMAL_USER_NAME }} ALL\"\n                  line=\"{{ NORMAL_USER_NAME }}\"<\/code><\/pre>\n<p>S\u1ed5 tay h\u01b0\u1edbng d\u1eabn n\u00e0y c\u0169ng s\u1ebd th\u00eam kh\u00f3a SSH c\u00f4ng khai \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef tr\u00ean m\u00e1y t\u00ednh c\u1ee5c b\u1ed9 c\u1ee7a b\u1ea1n. N\u1ebfu kh\u00f3a c\u00f4ng khai b\u1ea1n mu\u1ed1n s\u1eed d\u1ee5ng \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef \u1edf v\u1ecb tr\u00ed kh\u00e1c ngo\u00e0i&nbsp;<code>~\/.ssh\/id_rsa.pub<\/code>, b\u1ea1n c\u00f3 th\u1ec3 c\u1eadp nh\u1eadt gi\u00e1 tr\u1ecb \u0111\u00f3. Cu\u1ed1i c\u00f9ng, s\u1ed5 tay h\u01b0\u1edbng d\u1eabn s\u1ebd th\u00eam ng\u01b0\u1eddi d\u00f9ng h\u1ec7 th\u1ed1ng m\u1edbi v\u00e0o t\u1ec7p&nbsp;<code>sudoers<\/code>.<\/p>\n<h3 id=\"modifying-or-creating-a-new-template-file\">S\u1eeda \u0111\u1ed5i ho\u1eb7c t\u1ea1o m\u1ed9t t\u1ec7p m\u1eabu m\u1edbi<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#modifying-or-creating-a-new-template-file\"><\/a><\/h3>\n<p>Ch\u1ec9nh s\u1eeda t\u1ec7p m\u1eabu hi\u1ec7n t\u1ea1i c\u1ee7a b\u1ea1n ho\u1eb7c t\u1ea1o t\u1ec7p m\u1eabu m\u1edbi v\u1edbi n\u1ed9i dung sau. C\u1ee5 th\u1ec3, b\u1ea1n s\u1ebd th\u00eam m\u1ed9t&nbsp;<code>provisioner<\/code>kh\u1ed1i trong&nbsp;<code>build<\/code>kh\u1ed1i, thi\u1ebft l\u1eadp&nbsp;<code>ansible<\/code>l\u00e0 lo\u1ea1i nh\u00e0 cung c\u1ea5p v\u00e0 cung c\u1ea5p v\u1ecb tr\u00ed c\u1ee7a t\u1ec7p playbook m\u00e0 b\u1ea1n \u0111\u00e3 t\u1ea1o.<\/p>\n<pre class=\"wp-block-code\"><code>variable \"linode_api_token\" {\n  type    = string\n  default = \"\"\n}\n\nsource \"linode\" \"ansible-example\" {\n  image             = \"linode\/debian10\"\n  image_description = \"This image was created using Packer.\"\n  image_label       = \"packer-advanced-debian-10\"\n  instance_label    = \"temp-packer-debian-10\"\n  instance_type     = \"g6-nanode-1\"\n  linode_token      = \"${var.linode_api_token}\"\n  region            = \"us-east\"\n  ssh_username      = \"root\"\n}\n\nbuild {\n  sources = &#91;\"source.linode.ansible-example\"]\n\n  provisioner \"ansible\" {\n    playbook_file = \".\/limited_user_account.yml\"\n  }\n}<\/code><\/pre>\n<h3 id=\"understanding-the-provisioner-block\">Hi\u1ec3u v\u1ec1 Kh\u1ed1i cung c\u1ea5p<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#understanding-the-provisioner-block\"><\/a><\/h3>\n<p>M\u1ed9t provisioner cho ph\u00e9p b\u1ea1n c\u1ea5u h\u00ecnh th\u00eam h\u1ec7 th\u1ed1ng c\u1ee7a m\u00ecnh b\u1eb1ng c\u00e1ch ho\u00e0n th\u00e0nh c\u00e1c t\u00e1c v\u1ee5 qu\u1ea3n tr\u1ecb h\u1ec7 th\u1ed1ng th\u00f4ng th\u01b0\u1eddng, nh\u01b0 th\u00eam ng\u01b0\u1eddi d\u00f9ng, c\u00e0i \u0111\u1eb7t v\u00e0 c\u1ea5u h\u00ecnh ph\u1ea7n m\u1ec1m, v.v. V\u00ed d\u1ee5 s\u1eed d\u1ee5ng tr\u00ecnh cung c\u1ea5p Ansible t\u00edch h\u1ee3p c\u1ee7a Packer v\u00e0 th\u1ef1c thi c\u00e1c t\u00e1c v\u1ee5 \u0111\u01b0\u1ee3c x\u00e1c \u0111\u1ecbnh trong&nbsp;<code>limited_user_account.yml<\/code>playbook c\u1ee5c b\u1ed9. \u0110i\u1ec1u n\u00e0y c\u00f3 ngh\u0129a l\u00e0 \u1ea3nh Linode c\u1ee7a b\u1ea1n c\u0169ng s\u1ebd ch\u1ee9a b\u1ea5t k\u1ef3 th\u1ee9 g\u00ec \u0111\u01b0\u1ee3c th\u1ef1c thi b\u1edfi playbook. Packer h\u1ed7 tr\u1ee3 m\u1ed9t s\u1ed1 provisioner kh\u00e1c, nh\u01b0 Chef, Salt v\u00e0 shell script. T\u00ecm hi\u1ec3u th\u00eam v\u1ec1 c\u00e1c provisioner c\u1ee7a Packer tr\u00ean trang&nbsp;<a href=\"https:\/\/www.packer.io\/docs\/templates\/hcl_templates\/blocks\/build\/provisioner\" target=\"_blank\" rel=\"noreferrer noopener\">Provisioner<\/a>&nbsp;c\u1ee7a t\u00e0i li\u1ec7u Packer.<\/p>\n<h3 id=\"building-and-deploying-the-image\">X\u00e2y d\u1ef1ng v\u00e0 tri\u1ec3n khai h\u00ecnh \u1ea3nh<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#building-and-deploying-the-image\"><\/a><\/h3>\n<p>Th\u1ef1c hi\u1ec7n theo c\u00e1c ph\u1ea7n tr\u01b0\u1edbc \u0111\u1ec3&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#building-the-image\">x\u00e2y d\u1ef1ng h\u00ecnh \u1ea3nh<\/a>&nbsp;v\u00e0&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#deploying-a-linode-with-the-new-image\">tri\u1ec3n khai h\u00ecnh \u1ea3nh<\/a>&nbsp;. Khi m\u1ed9t Linode m\u1edbi \u0111\u01b0\u1ee3c tri\u1ec3n khai b\u1eb1ng h\u00ecnh \u1ea3nh m\u1edbi t\u1ea1o, b\u1ea1n s\u1ebd c\u00f3 th\u1ec3 \u0111\u0103ng nh\u1eadp v\u00e0o Linode \u0111\u00f3 qua ssh b\u1eb1ng c\u00e1ch ch\u1ea1y l\u1ec7nh sau. Thay th\u1ebf&nbsp;<em>username<\/em>&nbsp;b\u1eb1ng t\u00ean ng\u01b0\u1eddi d\u00f9ng b\u1ea1n \u0111\u00e3 ch\u1ec9 \u0111\u1ecbnh trong playbook Ansible v\u00e0 thay th\u1ebf&nbsp;<em>192.0.2.0<\/em>&nbsp;b\u1eb1ng \u0111\u1ecba ch\u1ec9 IPv4 c\u1ee7a Linode m\u1edbi c\u1ee7a b\u1ea1n.<\/p>\n<pre class=\"wp-block-code\"><code>ssh username@192.0.2.0\n<\/code><\/pre>\n<h2 id=\"next-steps\">C\u00e1c b\u01b0\u1edbc ti\u1ebfp theo<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/#next-steps\"><\/a><\/h2>\n<p>N\u1ebfu b\u1ea1n mu\u1ed1n t\u00ecm hi\u1ec3u c\u00e1ch s\u1eed d\u1ee5ng Terraform \u0111\u1ec3 tri\u1ec3n khai Linodes b\u1eb1ng h\u00ecnh \u1ea3nh do Packer t\u1ea1o, b\u1ea1n c\u00f3 th\u1ec3 l\u00e0m theo h\u01b0\u1edbng d\u1eabn Terraform c\u1ee7a ch\u00fang t\u00f4i \u0111\u1ec3 b\u1eaft \u0111\u1ea7u:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.linode.com\/docs\/guides\/beginners-guide-to-terraform\/\">H\u01b0\u1edbng d\u1eabn cho ng\u01b0\u1eddi m\u1edbi b\u1eaft \u0111\u1ea7u s\u1eed d\u1ee5ng Terraform<\/a><\/li>\n<li><a href=\"https:\/\/www.linode.com\/docs\/guides\/create-terraform-module\/\">T\u1ea1o m\u1ed9t m\u00f4-\u0111un Terraform<\/a><\/li>\n<li><a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-build-your-infrastructure-using-terraform-and-linode\/\">S\u1eed d\u1ee5ng Terraform \u0111\u1ec3 cung c\u1ea5p m\u00f4i tr\u01b0\u1eddng Linode<\/a><\/li>\n<li><a href=\"https:\/\/www.linode.com\/docs\/applications\/configuration-management\/introduction-to-hcl\/\">Gi\u1edbi thi\u1ec7u v\u1ec1 Ng\u00f4n ng\u1eef c\u1ea5u h\u00ecnh HashiCorp (HCL)<\/a><\/li>\n<\/ul>\n<p>Ngu\u1ed3n: https:\/\/www.linode.com\/docs\/guides\/how-to-use-linode-packer-builder\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gi\u1edbi thi\u1ec7u v\u1ec1 Packer Packer&nbsp;l\u00e0 m\u1ed9t c\u00f4ng c\u1ee5 m\u00e3 ngu\u1ed3n m\u1edf do HashiCorp duy tr\u00ec, \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea1o h\u00ecnh \u1ea3nh m\u00e1y. H\u00ecnh \u1ea3nh m\u00e1y cung c\u1ea5p h\u1ec7 \u0111i\u1ec1u h\u00e0nh, \u1ee9ng d\u1ee5ng, c\u1ea5u h\u00ecnh \u1ee9ng d\u1ee5ng v\u00e0 t\u1ec7p d\u1eef li\u1ec7u m\u00e0 phi\u00ean b\u1ea3n m\u00e1y \u1ea3o s\u1ebd ch\u1ea1y sau khi \u0111\u01b0\u1ee3c tri\u1ec3n khai. Packer c\u00f3<\/p>\n","protected":false},"author":1,"featured_media":35984,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[120],"tags":[],"class_list":["post-34963","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-packer"],"_links":{"self":[{"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/posts\/34963","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=34963"}],"version-history":[{"count":0,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/posts\/34963\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/media\/35984"}],"wp:attachment":[{"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/media?parent=34963"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/categories?post=34963"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/tags?post=34963"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}