歡迎光臨
每天分享高質量文章

如何使用 cloud-init 來預配置 LXD 容器 | Linux 中國

當你正在建立 LXD 容器的時候,你希望它們能被預先配置好。例如在容器一啟動就自動執行 apt update來安裝一些軟體包,或者執行一些命令。
— Simos Xenitellis


致謝
編譯自 | https://blog.simos.info/how-to-preconfigure-lxd-containers-with-cloud-init/ 
 作者 | Simos Xenitellis
 譯者 | Kane Gong (kaneg) ? 共計翻譯:1 篇 貢獻時間:2 天

當你正在建立 LXD 容器的時候,你希望它們能被預先配置好。例如在容器一啟動就自動執行 apt update來安裝一些軟體包,或者執行一些命令。

這篇文章將講述如何用 cloud-init[1] 來對 LXD 容器進行進行早期初始化[2]

接下來,我們將建立一個包含cloud-init指令的LXD profile,然後啟動一個新的容器來使用這個profile。

如何建立一個新的 LXD profile

檢視已經存在的 profile:

  1. $ lxc profile list

  2. +---------|---------+

  3. | NAME    | USED BY |

  4. +---------|---------+

  5. | default | 11      |

  6. +---------|---------+

我們把名叫 default 的 profile 複製一份,然後在其內新增新的指令:

  1. $ lxc profile copy default devprofile

  2. $ lxc profile list

  3. +------------|---------+

  4. | NAME       | USED BY |

  5. +------------|---------+

  6. | default    | 11      |

  7. +------------|---------+

  8. | devprofile | 0       |

  9. +------------|---------+

我們就得到了一個新的 profile: devprofile。下麵是它的詳情:

  1. $ lxc profile show devprofile

  2. config:

  3. environment.TZ: ""

  4. description: Default LXD profile

  5. devices:

  6. eth0:

  7. nictype: bridged

  8. parent: lxdbr0

  9. type: nic

  10. root:

  11. path: /

  12. pool: default

  13. type: disk

  14. name: devprofile

  15. used_by: []

註意這幾個部分: config: 、 description: 、 devices: 、 name: 和 used_by:,當你修改這些內容的時候註意不要搞錯縮排。(LCTT 譯註:因為這些內容是 YAML 格式的,縮排是語法的一部分)

如何把 cloud-init 新增到 LXD profile 裡

cloud-init[1] 可以新增到 LXD profile 的 config 裡。當這些指令將被傳遞給容器後,會在容器第一次啟動的時候執行。

下麵是用在示例中的指令:

  1. package_upgrade: true

  2. packages:

  3. - build-essential

  4. locale: es_ES.UTF-8

  5. timezone: Europe/Madrid

  6. runcmd:

  7. - [touch, /tmp/simos_was_here]

package_upgrade: true 是指當容器第一次被啟動時,我們想要 cloud-init 執行 sudo apt upgradepackages: 列出了我們想要自動安裝的軟體。然後我們設定了 locale 和 timezone。在 Ubuntu 容器的映象裡,root 使用者預設的 locale 是 C.UTF-8,而 ubuntu 使用者則是 en_US.UTF-8。此外,我們把時區設定為 Etc/UTC。最後,我們展示了如何使用 runcmd 來執行一個 Unix 命令[3]

我們需要關註如何將 cloud-init 指令插入 LXD profile。

我首選的方法是:

  1. $ lxc profile edit devprofile

它會開啟一個文字編輯器,以便你將指令貼上進去。結果應該是這樣的[4]

  1. $ lxc profile show devprofile

  2. config:

  3.  environment.TZ: ""

  4.  user.user-data: |

  5.    #cloud-config

  6.    package_upgrade: true

  7.    packages:

  8.      - build-essential

  9.    locale: es_ES.UTF-8

  10.    timezone: Europe/Madrid

  11.    runcmd:

  12.      - [touch, /tmp/simos_was_here]

  13. description: Default LXD profile

  14. devices:

  15.  eth0:

  16.    nictype: bridged

  17.    parent: lxdbr0

  18.    type: nic

  19.  root:

  20.    path: /

  21.    pool: default

  22.    type: disk

  23. name: devprofile

  24. used_by: []

如何使用 LXD profile 啟動一個容器

使用 profile devprofile 來啟動一個新容器:

  1. $ lxc launch --profile devprofile ubuntu:x mydev

然後訪問該容器來檢視我們的指令是否生效:

  1. $ lxc exec mydev bash

  2. root@mydev:~# ps ax

  3. PID TTY STAT TIME COMMAND

  4. 1 ? Ss 0:00 /sbin/init

  5. ...

  6. 427 ? Ss 0:00 /usr/bin/python3 /usr/bin/cloud-init modules --mode=f

  7. 430 ? S 0:00 /bin/sh -c tee -a /var/log/cloud-init-output.log

  8. 431 ? S 0:00 tee -a /var/log/cloud-init-output.log

  9. 432 ? S 0:00 /usr/bin/apt-get --option=Dpkg::Options::=--force-con

  10. 437 ? S 0:00 /usr/lib/apt/methods/http

  11. 438 ? S 0:00 /usr/lib/apt/methods/http

  12. 440 ? S 0:00 /usr/lib/apt/methods/gpgv

  13. 570 ? Ss 0:00 bash

  14. 624 ? S 0:00 /usr/lib/apt/methods/store

  15. 625 ? R+ 0:00 ps ax

  16. root@mydev:~#

如果我們連線得夠快,透過 ps ax 將能夠看到系統正在更新軟體。我們可以從 /var/log/cloud-init-output.log 看到完整的日誌:

  1. Generating locales (this might take a while)...

  2. es_ES.UTF-8... done

  3. Generation complete.

以上可以看出 locale 已經被更改了。root 使用者還是保持預設的 C.UTF-8,只有非 root 使用者 ubuntu 使用了新的locale 設定。

  1. Hit:1 http://archive.ubuntu.com/ubuntu xenial InRelease

  2. Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]

  3. Get:3 http://security.ubuntu.com/ubuntu xenial-security InRelease [102 kB]

以上是安裝軟體包之前執行的 apt update

  1. The following packages will be upgraded:

  2. libdrm2 libseccomp2 squashfs-tools unattended-upgrades

  3. 4 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.

  4. Need to get 211 kB of archives.

以上是在執行 package_upgrade: true 和安裝軟體包。

  1. The following NEW packages will be installed:

  2. binutils build-essential cpp cpp-5 dpkg-dev fakeroot g++ g++-5 gcc gcc-5

  3. libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl

以上是我們安裝 build-essential 軟體包的指令。

runcmd 執行的結果如何?

  1. root@mydev:~# ls -l /tmp/

  2. total 1

  3. -rw-r--r-- 1 root root 0 Jan 3 15:23 simos_was_here

  4. root@mydev:~#

可見它已經生效了!

結論

當我們啟動 LXD 容器的時候,我們常常需要預設啟用一些配置,並且希望能夠避免重覆工作。通常解決這個問題的方法是建立 LXD profile,然後把需要的配置新增進去。最後,當我們啟動新的容器時,只需要應用該 LXD profile 即可。


via: https://blog.simos.info/how-to-preconfigure-lxd-containers-with-cloud-init/

作者:Simos Xenitellis[6] 譯者:kaneg 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

贊(0)

分享創造快樂