{"id":777,"date":"2023-01-14T21:39:01","date_gmt":"2023-01-14T12:39:01","guid":{"rendered":"https:\/\/wp.zassoul.com\/?p=777"},"modified":"2023-07-24T20:50:40","modified_gmt":"2023-07-24T11:50:40","slug":"openstack-%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9zun%e8%bf%bd%e5%8a%a0","status":"publish","type":"post","link":"https:\/\/wp.zassoul.com\/?p=777","title":{"rendered":"OpenStack \u30b3\u30f3\u30c6\u30ca\u30b5\u30fc\u30d3\u30b9(zun)\u8ffd\u52a0"},"content":{"rendered":"\n<p>All-in-one\u306ePackstack\u74b0\u5883\u306b\u30b3\u30f3\u30c6\u30ca\u30b5\u30fc\u30d3\u30b9\u306ezun\u3092\u8ffd\u52a0\u3059\u308b\u624b\u9806\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u30e1\u30e2\u304c\u3066\u3089\u6b8b\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u624b\u9806\u306f\u3053\u3053(<a rel=\"noreferrer noopener\" href=\"https:\/\/docs.openstack.org\/zun\/latest\/install\/controller-install.html\" target=\"_blank\">https:\/\/docs.openstack.org\/zun\/latest\/install\/controller-install.html<\/a>)\u3092\u53c2\u7167\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30ce\u30fc\u30c9\u5411\u3051\u8a2d\u5b9a<\/h2>\n\n\n\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30e6\u30fc\u30b6\u8ffd\u52a0<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># mysql\nWelcome to the MariaDB monitor.  Commands end with ; or \\g.\nYour MariaDB connection id is 3728741\nServer version: 10.3.35-MariaDB MariaDB Server\n\nCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.\n\nType 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n\nMariaDB &#91;(none)]&gt; GRANT ALL PRIVILEGES ON zun.* TO 'zun' \\\n  IDENTIFIED BY 'ZUN_DBPASS';\nQuery OK, 0 rows affected (0.000 sec)\nMariaDB &#91;(none)]&gt; GRANT ALL PRIVILEGES ON zun.* TO 'zun'@'%' \\\n  IDENTIFIED BY 'ZUN_DBPASS';\nQuery OK, 0 rows affected (0.000 sec)\n\nMariaDB &#91;(none)]&gt; quit\nBye\n#<\/code><\/pre>\n\n\n\n<p>zun service\u4f5c\u6210\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ . admin-openrc\n$ openstack user create --domain default --password-prompt zun\nUser Password:\nRepeat User Password:\n+---------------------+----------------------------------+\n| Field               | Value                            |\n+---------------------+----------------------------------+\n| domain_id           | default                          |\n| enabled             | True                             |\n| id                  | f4f40696f6914b5b9e9054b7e9cfb55d |\n| name                | zun                              |\n| options             | {}                               |\n| password_expires_at | None                             |\n+---------------------+----------------------------------+\n\n$ openstack role add --project services --user zun admin\n\n$ openstack service create --name zun --description \"Container Service\" container\n+-------------+----------------------------------+\n| Field       | Value                            |\n+-------------+----------------------------------+\n| description | Container Service                |\n| enabled     | True                             |\n| id          | 74d60a5188ee4d36b1ba036c23c45f2e |\n| name        | zun                              |\n| type        | container                        |\n+-------------+----------------------------------+\n$  openstack endpoint create --region RegionOne container public http:\/\/192.168.1.10:9517\/v1\n+--------------+----------------------------------+\n| Field        | Value                            |\n+--------------+----------------------------------+\n| enabled      | True                             |\n| id           | ae352beaa62c45899da2ec57d376e2ab |\n| interface    | public                           |\n| region       | RegionOne                        |\n| region_id    | RegionOne                        |\n| service_id   | 74d60a5188ee4d36b1ba036c23c45f2e |\n| service_name | zun                              |\n| service_type | container                        |\n| url          | http:\/\/192.168.1.10:9517\/v1      |\n+--------------+----------------------------------+\n$ openstack endpoint create --region RegionOne container internal http:\/\/192.168.1.10:9517\/v1\n+--------------+----------------------------------+\n| Field        | Value                            |\n+--------------+----------------------------------+\n| enabled      | True                             |\n| id           | d1e241ca8f664f05b1976c5a5628a284 |\n| interface    | internal                         |\n| region       | RegionOne                        |\n| region_id    | RegionOne                        |\n| service_id   | 74d60a5188ee4d36b1ba036c23c45f2e |\n| service_name | zun                              |\n| service_type | container                        |\n| url          | http:\/\/192.168.1.10:9517\/v1      |\n+--------------+----------------------------------+\n$ openstack endpoint create --region RegionOne container admin http:\/\/192.168.1.10:9517\/v1\n+--------------+----------------------------------+\n| Field        | Value                            |\n+--------------+----------------------------------+\n| enabled      | True                             |\n| id           | 911e3f76ba09463bad2833573bfb17ef |\n| interface    | admin                            |\n| region       | RegionOne                        |\n| region_id    | RegionOne                        |\n| service_id   | 74d60a5188ee4d36b1ba036c23c45f2e |\n| service_name | zun                              |\n| service_type | container                        |\n| url          | http:\/\/192.168.1.10:9517\/v1      |\n+--------------+----------------------------------+\n<\/code><\/pre>\n\n\n\n<p>OS\u30e6\u30fc\u30b6\u8ffd\u52a0\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># groupadd --system zun\n# useradd --home-dir \"\/var\/lib\/zun\" \\\n      --create-home \\\n      --system \\\n      --shell \/bin\/false \\\n      -g zun \\\n      zun\n# mkdir -p \/etc\/zun\n# chown zun:zun \/etc\/zun\n# dnf install python3-pip git python3-devel libffi-devel gcc openssl-devel\nUpdating Subscription Management repositories.\nLast metadata expiration check: 2:15:22 ago on Fri 06 Jan 2023 07:01:20 PM JST.\nPackage python3-pip-9.0.3-22.el8.noarch is already installed.\nPackage git-2.31.1-2.el8.x86_64 is already installed.\nPackage python36-devel-3.6.8-38.module+el8.5.0+12207+5c5719bc.x86_64 is already installed.\nPackage gcc-8.5.0-15.el8.x86_64 is already installed.\nDependencies resolved.\n=============================================================================================================================================================================\n Package                                    Architecture                  Version                                 Repository                                            Size\n=============================================================================================================================================================================\nInstalling:\n libffi-devel                               x86_64                        3.1-23.el8                              rhel-8-for-x86_64-baseos-rpms                         29 k\n openssl-devel                              x86_64                        1:1.1.1k-7.el8_6                        rhel-8-for-x86_64-baseos-rpms                        2.3 M\nInstalling dependencies:\n keyutils-libs-devel                        x86_64                        1.5.10-9.el8                            rhel-8-for-x86_64-baseos-rpms                         48 k\n krb5-devel                                 x86_64                        1.18.2-22.el8_7                         rhel-8-for-x86_64-baseos-rpms                        561 k\n libcom_err-devel                           x86_64                        1.45.6-5.el8                            rhel-8-for-x86_64-baseos-rpms                         39 k\n libkadm5                                   x86_64                        1.18.2-22.el8_7                         rhel-8-for-x86_64-baseos-rpms                        187 k\n libselinux-devel                           x86_64                        2.9-6.el8                               rhel-8-for-x86_64-baseos-rpms                        200 k\n libsepol-devel                             x86_64                        2.9-3.el8                               rhel-8-for-x86_64-baseos-rpms                         87 k\n libverto-devel                             x86_64                        0.3.2-2.el8                             rhel-8-for-x86_64-baseos-rpms                         18 k\n pcre2-devel                                x86_64                        10.32-3.el8_6                           rhel-8-for-x86_64-baseos-rpms                        605 k\n pcre2-utf16                                x86_64                        10.32-3.el8_6                           rhel-8-for-x86_64-baseos-rpms                        229 k\n pcre2-utf32                                x86_64                        10.32-3.el8_6                           rhel-8-for-x86_64-baseos-rpms                        220 k\n\nTransaction Summary\n=============================================================================================================================================================================\nInstall  12 Packages\n\nTotal download size: 4.5 M\nInstalled size: 8.0 M\nIs this ok &#91;y\/N]: y\n\uff5e\u4e2d\u7565\uff5e\nInstalled:\n  keyutils-libs-devel-1.5.10-9.el8.x86_64       krb5-devel-1.18.2-22.el8_7.x86_64       libcom_err-devel-1.45.6-5.el8.x86_64       libffi-devel-3.1-23.el8.x86_64\n  libkadm5-1.18.2-22.el8_7.x86_64               libselinux-devel-2.9-6.el8.x86_64       libsepol-devel-2.9-3.el8.x86_64            libverto-devel-0.3.2-2.el8.x86_64\n  openssl-devel-1:1.1.1k-7.el8_6.x86_64         pcre2-devel-10.32-3.el8_6.x86_64        pcre2-utf16-10.32-3.el8_6.x86_64           pcre2-utf32-10.32-3.el8_6.x86_64\n\nComplete!\n\n# cd \/var\/lib\/zun\n# git clone https:\/\/opendev.org\/openstack\/zun.git\nCloning into 'zun'...\nremote: Enumerating objects: 12578, done.\nremote: Counting objects: 100% (12578\/12578), done.\nremote: Compressing objects: 100% (2355\/2355), done.\nremote: Total 25247 (delta 12095), reused 10223 (delta 10223), pack-reused 12669\nReceiving objects: 100% (25247\/25247), 3.88 MiB | 4.09 MiB\/s, done.\nResolving deltas: 100% (19377\/19377), done.\n# chown -R zun:zun zun\n# git config --global --add safe.directory \/var\/lib\/zun\/zun\n# cd zun\n# pwd\n\/var\/lib\/zun\/zun\n# pip3 install -r requirements.txt\n\uff5e\u4e2d\u7565\uff5e\nSuccessfully installed docker-5.0.3 grpcio-1.48.2 kuryr-lib-2.6.0 protobuf-3.19.6 websocket-client-1.3.1\n# python3 setup.py install\n\n# su -s \/bin\/sh -c \"oslo-config-generator --config-file etc\/zun\/zun-config-generator.conf\" zun\n# su -s \/bin\/sh -c \"cp etc\/zun\/zun.conf.sample \/etc\/zun\/zun.conf\" zun\n# su -s \/bin\/sh -c \"cp etc\/zun\/api-paste.ini \/etc\/zun\" zun<\/code><\/pre>\n\n\n\n<p>zun.conf \u7de8\u96c6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># vim \/etc\/zun\/zun.conf\n&#91;DEFAULT]\n...\ntransport_url = rabbit:\/\/guest:PASS@192.168.1.10:5672\/\n\n&#91;api]\n...\n\nport = 9517\n&#91;database]\n...\nconnection=mysql+pymysql:\/\/zun:ZUN-PASS@192.168.1.10\/zun\n&#91;keystone_auth]\n...\nauth_url=http:\/\/192.168.1.10:5000\nproject_domain_name = Default\nusername = zun\npassword = PASS\n\n&#91;keystone_authtoken]\n...\n\nwww_authenticate_uri = http:\/\/192.168.1.10:5000\/\n\nauth_version = v3\n\nusername = zun\npassword = PASS\nauth_protocol = http\n\n&#91;oslo_concurrency]\nlock_path = \/var\/lib\/zun\/tmp\n\n&#91;websocket_proxy]\nbase_url = ws:\/\/$wsproxy_host:$wsproxy_port\/\nwsproxy_host = 192.168.1.10\n\nwsproxy_port = 6784\n<\/code><\/pre>\n\n\n\n<p>DB\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># su -s \/bin\/sh  -c \"\/usr\/local\/bin\/zun-db-manage upgrade\"  zun\n<\/code><\/pre>\n\n\n\n<p>\u8d77\u52d5\u30b9\u30af\u30ea\u30d7\u30c8\u4f5c\u6210<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \/etc\/systemd\/system\/zun-api.service\n&#91;Unit]\nDescription = OpenStack Container Service API\n\n&#91;Service]\nExecStart = \/usr\/local\/bin\/zun-api\nUser = zun\n\n&#91;Install]\nWantedBy = multi-user.target\n\n# \/etc\/systemd\/system\/zun-wsproxy.service\n&#91;Unit]\nDescription = OpenStack Container Service Websocket Proxy\n\n&#91;Service]\nExecStart = \/usr\/local\/bin\/zun-wsproxy\nUser = zun\n\n&#91;Install]\nWantedBy = multi-user.target<\/code><\/pre>\n\n\n\n<p>\u30b5\u30fc\u30d3\u30b9\u8d77\u52d5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># systemctl enable zun-api zun-wsproxy\n# systemctl start zun-api zun-wsproxy<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u30b3\u30f3\u30d4\u30e5\u30fc\u30c8\u30ce\u30fc\u30c9\u5411\u3051\u8a2d\u5b9a<\/h2>\n\n\n\n<p>All-in-One\u69cb\u6210\u306a\u306e\u3067\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u3068\u91cd\u8907\u3059\u308b\u3068\u3053\u308d\u306f\u30b9\u30ad\u30c3\u30d7\u3057\u3066\u5dee\u5206\u3060\u3051\u5b9f\u65bd\u3002<\/p>\n\n\n\n<p>Docker\u3068Kuryr\uff0cEtcd\u3092\u5148\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Docker install\ndnf config-manager \u2015-add-repo https:\/\/download.docker.com\/linux\/rhel\/docker-ce.repo\n<\/code><\/pre>\n\n\n\n<p>RHEL8\u304b\u3089\u306fPodman\u306b\u306a\u3063\u305f\u3068\u306e\u3053\u3068\u3067\u30ea\u30dd\u30b8\u30c8\u30ea\u306eBaseURL\u3092CentOS\u306b\u5909\u66f4\u3057\u306a\u3044\u3068docker\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u306a\u3044\u3089\u3057\u3044\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># vim \/etc\/yum.repos.d\/docker-ce.repo\n\n&#91;docker-ce-stable]\nname=Docker CE Stable - $basearch\n#baseurl=https:\/\/download.docker.com\/linux\/fedora\/$releasever\/$basearch\/stable #\u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\nbaseurl=https:\/\/download.docker.com\/linux\/centos\/$releasever\/$basearch\/stable # \u8ffd\u52a0\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Docker\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Kuryr-libnetwork\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;https:\/\/docs.openstack.org\/kuryr-libnetwork\/latest\/install\/controller-install.html&gt;\n\n$ openstack user create --domain default --password-prompt kuryr\n$ openstack role add --project services --user kuryr admin\n\n&lt;https:\/\/docs.openstack.org\/kuryr-libnetwork\/latest\/install\/compute-install-ubuntu.html#prerequisites&gt;\n\n# groupadd --system kuryr\n# useradd --home-dir \"\/var\/lib\/kuryr\" --create-home --system --shell \/bin\/false -g kuryr kuryr\n#  mkdir -p \/etc\/kuryr\n# chown kuryr:kuryr \/etc\/kuryr\n# cd \/var\/lib\/kuryr\/\n# git clone -b master https:\/\/opendev.org\/openstack\/kuryr-libnetwork.git\n# chown -R kuryr:kuryr kuryr-libnetwork\n# cd kuryr-libnetwork\/\n# python3 setup.py install\n\n# su -s \/bin\/sh -c \".\/tools\/generate_config_file_samples.sh\" kuryr\n# su -s \/bin\/sh -c \"cp etc\/kuryr.conf.sample \/etc\/kuryr\/kuryr.conf\" kuryr\n<\/code><\/pre>\n\n\n\n<p>\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u7de8\u96c6\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \/etc\/kuryr\/kuryr.conf\n\n&#91;DEFAULT]\n...\nbindir = \/usr\/local\/libexec\/kuryr\n\n&#91;neutron]\n...\nauth_url = http:\/\/192.168.1.10:5000\/\nwww_authenticate_uri = http:\/\/192.168.1.10:5000\/\nusername = kuryr\nuser_domain_name = Default\npassword = PASSWORD\nproject_name = services\nproject_domain_name = Default\nauth_type = password\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Etcd\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># dnf list installed etcd\n\n# vim \/etc\/etcd\/etcd.conf\n\nETCD_DATA_DIR=\"\/var\/lib\/etcd\/default.etcd\"\nETCD_LISTEN_PEER_URLS=\"http:\/\/192.168.1.10:2380\"\nETCD_LISTEN_CLIENT_URLS=\"http:\/\/0.0.0.0:2379\"\nETCD_NAME=\"controller\"\nETCD_ADVERTISE_CLIENT_URLS=\"http:\/\/192.168.1.10:2379\"\nETCD_INITIAL_CLUSTER=\"default=http:\/\/192.168.1.10:2380\"\nETCD_INITIAL_CLUSTER_TOKEN=\"etcd-cluster\"\nETCD_INITIAL_CLUSTER_STATE=\"new\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ZUN\u8a2d\u5b9a<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># mkdir -p \/etc\/cni\/net.d\n# chown zun:zun \/etc\/cni\/net.d\/\n\n# dnf install numactl\n\n# su -s \/bin\/sh -c \"cp etc\/zun\/rootwrap.conf \/etc\/zun\/rootwrap.conf\" zun\n# su -s \/bin\/sh -c \"mkdir -p \/etc\/zun\/rootwrap.d\" zun\n# su -s \/bin\/sh -c \"cp etc\/zun\/rootwrap.d\/*  \/etc\/zun\/rootwrap.d\/\" zun\n# su -s \/bin\/sh -c \"cp etc\/cni\/net.d\/* \/etc\/cni\/net.d\/\" zun\n\n# echo \"zun ALL=(root) NOPASSWD: \/usr\/local\/bin\/zun-rootwrap \/etc\/zun\/rootwrap.conf *\" | sudo tee \/etc\/sudoers.d\/zun-rootwrap zun ALL=(root) NOPASSWD: \/usr\/local\/bin\/zun-rootwrap     \/etc\/zun\/rootwrap.conf *<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># \/etc\/zun\/zun.conf\n\n&#91;DEFAULT]\n...\nstate_path = \/var\/lib\/zun\n\n&#91;compute]\n...\nhost_shared_with_nova = true<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Docker \u3068 Kuryr \u8a2d\u5b9a<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># mkdir -p \/etc\/systemd\/system\/docker.service.d<\/code><\/pre>\n\n\n\n<p>docker\u30b5\u30fc\u30d3\u30b9\u8d77\u52d5\u8a2d\u5b9a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \/etc\/systemd\/system\/docker.service.d\/docker.conf\n&#91;Service]\n\nExecStart=\nExecStart=\/usr\/bin\/dockerd --group zun -H tcp:\/\/192.168.1.10:2375 -H unix:\/\/\/var\/run\/docker.sock --cluster-store etcd:\/\/192.168.1.10:2379\n<\/code><\/pre>\n\n\n\n<p>containerd\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u751f\u6210<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># containerd config default &gt; \/etc\/containerd\/config.toml\n<\/code><\/pre>\n\n\n\n<p>containerd\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u7de8\u96c6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \/etc\/containerd\/config.toml\n\n&#91;grpc]\n  ...\n  gid = ZUN_GROUP_ID<\/code><\/pre>\n\n\n\n<p>\u518d\u8d77\u52d5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># systemctl restart containerd\n<\/code><\/pre>\n\n\n\n<p>CNI\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb&amp;\u8a2d\u5b9a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># mkdir -p \/opt\/cni\/bin\n# curl -L https:\/\/github.com\/containernetworking\/plugins\/releases\/download\/v0.7.1\/cni-plugins-amd64-v0.7.1.tgz | tar -C \/opt\/cni\/bin -xzvf - .\/loopback\n\n# install -o zun -m 0555 -D \/usr\/local\/bin\/zun-cni \/opt\/cni\/bin\/zun-cni\n<\/code><\/pre>\n\n\n\n<p>\u30b5\u30fc\u30d3\u30b9\u8a2d\u5b9a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \/etc\/systemd\/system\/zun-compute.service\n&#91;Unit]\nDescription = OpenStack Container Service Compute Agent\n\n&#91;Service]\nExecStart = \/usr\/local\/bin\/zun-compute\nUser = zun\n\n&#91;Install]\nWantedBy = multi-user.target<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># \/etc\/systemd\/system\/zun-cni-daemon.service\n&#91;Unit]\nDescription = OpenStack Container Service CNI daemon\n\n&#91;Service]\nExecStart = \/usr\/local\/bin\/zun-cni-daemon\nUser = zun\n\n&#91;Install]\nWantedBy = multi-user.target<\/code><\/pre>\n\n\n\n<p>\u30b5\u30fc\u30d3\u30b9\u8d77\u52d5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># systemctl enable zun-compute zun-cni-daemon\n# systemctl start zun-compute zun-cni-daemon<\/code><\/pre>\n\n\n\n<p>\u3053\u3053\u3092\u53c2\u8003\u3002(https:\/\/docs.openstack.org\/zun-ui\/latest\/)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Horizen\u5468\u308a\u8a2d\u5b9a<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>$ git clone https:\/\/github.com\/openstack\/zun-ui\n$ cd zun-ui\n\n$ sudo pip3 install .\n\n$ sudo cp .\/zun_ui\/enabled\/* \/usr\/share\/openstack-dashboard\/openstack_dashboard\/local\/enabled\n$ sudo python3 \/usr\/share\/openstack-dashboard\/manage.py collectstatic\n\n$ sudo systemctrl restart httpd<\/code><\/pre>\n\n\n\n<p>\u3053\u308c\u3067\u5b8c\u4e86\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"237\" src=\"https:\/\/wp.zassoul.com\/wp-content\/uploads\/2023\/01\/zun-1024x237.png\" alt=\"\" class=\"wp-image-783\" srcset=\"https:\/\/wp.zassoul.com\/wp-content\/uploads\/2023\/01\/zun-1024x237.png 1024w, https:\/\/wp.zassoul.com\/wp-content\/uploads\/2023\/01\/zun-300x70.png 300w, https:\/\/wp.zassoul.com\/wp-content\/uploads\/2023\/01\/zun-768x178.png 768w, https:\/\/wp.zassoul.com\/wp-content\/uploads\/2023\/01\/zun-1536x356.png 1536w, https:\/\/wp.zassoul.com\/wp-content\/uploads\/2023\/01\/zun-2048x475.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>All-in-one\u306ePackstack\u74b0\u5883\u306b\u30b3\u30f3\u30c6\u30ca\u30b5\u30fc\u30d3\u30b9\u306ezun\u3092\u8ffd\u52a0\u3059\u308b\u624b\u9806\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u30e1\u30e2\u304c\u3066\u3089\u6b8b\u3057\u305f\u3002 \u624b\u9806\u306f\u3053\u3053(https:\/\/docs.openstack.org\/zun\/latest\/install\u2026 <span class=\"read-more\"><a href=\"https:\/\/wp.zassoul.com\/?p=777\">\u7d9a\u304d\u3092\u8aad\u3080 &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[46,45],"tags":[103,105,82,104],"class_list":["post-777","post","type-post","status-publish","format-standard","hentry","category-docker","category-openstack","tag-container","tag-installmemo","tag-openstack","tag-zun"],"_links":{"self":[{"href":"https:\/\/wp.zassoul.com\/index.php?rest_route=\/wp\/v2\/posts\/777","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.zassoul.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wp.zassoul.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wp.zassoul.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.zassoul.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=777"}],"version-history":[{"count":9,"href":"https:\/\/wp.zassoul.com\/index.php?rest_route=\/wp\/v2\/posts\/777\/revisions"}],"predecessor-version":[{"id":811,"href":"https:\/\/wp.zassoul.com\/index.php?rest_route=\/wp\/v2\/posts\/777\/revisions\/811"}],"wp:attachment":[{"href":"https:\/\/wp.zassoul.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=777"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wp.zassoul.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=777"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wp.zassoul.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=777"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}