分类 技术 下的文章

在终端基础系列的 上一章 中,你学到了在 Linux 命令行中改变文件夹的知识。

我在最后给出了一个练习,简单地提到了创建目录。

在本系列的这一部分,我将讨论如何使用 mkdir 命令在 Linux 命令行中建立新的文件夹。

mkdir dir_name

mkdir 是 “ 创建目录 make directories ” 的简称。让我们来看看这个命令的使用情况。

? 如果你不知道,文件夹在 Linux 中被称为目录。

在 Linux 中创建一个新目录

你现在应该已经熟悉了 Linux 中绝对路径和相对路径的概念。如果没有,请参考 本教程

如果你的系统还没有打开终端,请打开它。通常情况下,你从主目录(/home/username)开始。但为了本教程和回忆一些事情,我假定你不在你的主目录中。

所以,先换到你的主目录:

cd

是的,如果你简单地输入 cd,没有任何选项和参数,它就会把你带到你的主目录。你也可以使用 cd ~ 等方法。

在这里,建立一个新的目录,叫做 practice

mkdir practice

你能切换到这个新建立的 practice 目录吗?

cd practice

很好!现在你有了一个专门的文件夹,你将在这里练习本系列中的 Linux 命令行教程。

Example of making new directory in Linux

创建多个新目录

你刚刚创建了一个新的目录。如果你要创建不止一个呢?比方说,有三个。

你可以对每个目录连续使用三次 mkdir 命令。这将会起作用。然而,这并不是真的需要。你可以像这样同时创建多个目录来节省时间和精力:

mkdir dir1 dir2 dir3

请继续这样做吧。你可以列出 practice 目录的内容,查看所有新创建的目录。以后会有更多关于 ls 命令的内容。

Create multiple new directories in Linux with mkdir command

? 你不能在同一地方有两个同名的文件夹或文件。

创建多个嵌套的子目录

你现在知道了一次创建多个目录的方法。

但是,如果你要创建一个嵌套的目录结构呢?比方说,你需要在 dir1 里面的 subdir1 里面创建一个目录 subdir2

dir1/subdir1/subdir2

这里的问题是 subdir1 并不存在。所以如果你尝试 mkdir dir1/subdir1/subdir32,你会得到一个错误:

abhishek@itsfoss:~/practice$ mkdir dir1/subdir1/subdir2
mkdir: cannot create directory ‘dir1/subdir1/subdir2’: No such file or directory

如果你不知道的话,你会选择 mkdir dir1/subdir1,然后运行 mkdir dir1/subdir2。这将会起作用。然而,有一个更好的方法。

你使用 -p 选项,它会在需要时创建父目录。如果你运行下面的命令:

mkdir -p dir1/subdir1/subdir2

它将创建 subdir1,然后在 subdir1 里面创建 subdir2

? 不是命名惯例,但最好在文件和目录名中避免空格。使用下划线或破折号代替,因为处理文件/目录名中的空格需要额外精力。

测试你的知识

这是一个相当简短的教程,因为 mkdir 命令只有几个选项。

现在,让我给你一些实践练习,以利用你先前创建的 practice 目录。

  • 不进入 dir2 目录,在其中创建两个新的子目录。
  • 不进入 dir3 目录,创建两级嵌套子目录(subdir1/subdir2
  • 进入 dir2 目录。在这里,在你的主目录下创建一个名为 temp_stuff 的目录。不要担心,我们将在本系列教程的后面删除它。
  • 回到父目录 practice,尝试创建一个名为 dir3 的目录。你看到一个错误。你能用 -p 选项使它消失吗?

你可以 在社区论坛讨论这个练习

在终端基础系列的下一章中,你将学习如何用 ls 命令列出一个目录的内容。

如果你有问题或建议,请告诉我。


via: https://itsfoss.com/make-directories/

作者:Abhishek Prakash 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Artipie 是一个开源的自托管的仓库管理器,它不仅可以用于 Python。

在学生时代使用 Python 开发时,我发现我需要一些私人的集中存储。这样我就可以存储二进制和文本数据文件,以及 Python 软件包。我在 Artipie 中找到了答案,这是一个开源的自托管的软件仓库管理器。

在大学里,我和我的同事们对来自实验测量的大量数据进行研究。我使用 Python 来处理和可视化它们。当时我的大学同事是数学家,没有软件开发技术的经验。他们通常只是在闪存盘上或通过电子邮件传递数据和代码。我努力向他们介绍像 Git 这样的版本管理系统,但没有成功。

Python 仓库

Artipie 支持 PyPI 仓库,与 twinepip 兼容。这意味着你可以完全像在 PyPITestPyPI 仓库上安装或发布软件包那样使用 Artipie Python 仓库。

要创建你自己的 Python 仓库,你可以使用名为 Artipie Central 的 Artipie 托管实例。当你登录后,你会看到一个列出你的仓库的页面(开始时是空的),以及一个添加新仓库的表单。为你的新仓库选择一个名字(例如,mypython),选择 Python 作为仓库类型,然后点击 “ 添加 Add ” 按钮。

接下来,你会看到一个以 YAML 格式显示仓库设置的页面:

---
repo:
  type: pypi
  storage: default
  permissions:
    olenagerasimova:
      - upload
    "*":
      - download

配置中的 type 映射设置了仓库的类型。在这个例子中,Python 仓库被配置为默认的 Artipie Central 存储。

storage 映射定义了所有仓库包的存储位置。这可以是任何文件系统或 S3 存储兼容的位置。Artipie Central 有一个预先配置的 default 存储,可以使用它进行测试。

permissions 映射允许为用户 olenagerasimova 上传,并允许任何人下载任何软件包。

为了确保这个仓库的存在和工作,在你的浏览器中打开 索引页。显示的是软件包列表。如果你刚刚创建了一个新的版本库,但还没有上传软件包,那么仓库的索引页是空白的。

二进制仓库

你可以在 Artipie 中存储任何种类的文件。存储类型是 filebinary,我用这个作为实验数据的存储。我把它作为 Python 可视化的输入。在 Artipie Central 可以创建一个文件仓库,与 Python 仓库的方式相同。你给它一个名字,选择 binary 类型,然后点击 “ 添加 Add ” 按钮。

---
repo:
  type: file
  storage: default
  permissions:
    olenagerasimova:
      - upload
      - download
    "*":
      - download

这些设置基本上与 Python 相同。只有仓库的类型不同。在这个例子中,二进制仓库被称为 data。它包含三个带有一些数字的文本文件:

6
3.5
5
4
4.5
3
2.7
5
6
3
1.2
3.2
6

另外两个文件的形式相同(只是数字不同)。要想自己看这些文件,请在浏览器中打开链接 并下载文件,或者你可以用 httpie 执行 GET 请求:

httpie -a https://central.artipie.com/olenagerasimova/data/y1.dat > ./data/y1.da

这些文件是用 PUT 请求上传到 Artipie Central 的 data 存储库的:

httpie -a olenagerasimova:*** PUT 
https://central.artipie.com/olenagerasimova/data/y1.dat @data/y1.dat

httpie -a olenagerasimova:*** PUT 
https://central.artipie.com/olenagerasimova/data/y2.dat @data/y2.dat

httpie -a olenagerasimova:*** PUT 
https://central.artipie.com/olenagerasimova/data/y3.dat @data/y3.dat

由于这个二进制仓库的 API 非常简单(HTTP PUTGET 请求),用任何语言编写一段代码来上传和下载所需的文件都很容易。

Python 项目

可以从我的 GitHub 仓库中获得一个 Python 项目的示例源代码。这个示例的主要想法是,从 Artipie Central 下载三个数据文件,将数字读入数组,并使用这些数组来绘制一个图。使用 pip 来安装这个例子包并运行它:

$ python3 -m pip install --index-url \
  https://central.artipie.com/olenagerasimova/pypi/ \
  pypiexample
$ python3 -m pypiexample

通过设置 --index-url 到 Artipie Central 的 Python 仓库,pip 从它那里下载软件包,而不是通常默认的 PyPi 仓库。运行这些命令后,会显示一个带有三条曲线的极坐标图,这是数据文件的可视化。

要将软件包发布到 Artipie Central 仓库,请用 twine 构建并上传:

commandline
$ python setup.py sdist bdist_wheel

$ twine upload --repository-url \
  https://central.artipie.com/olenagerasimova/pypi
  -u olenagerasimova -p *** dist/*

在 Artipie Central 中设置 files 仓库,并创建一个 Python 示例项目是多么容易。不过,你不必使用 Artipie Central。Artipie 可以自托管,所以你可以在你自己的本地网络上运行一个仓库。

将 Artipie 作为一个容器运行

将 Artipie 作为一个容器运行,设置起来就像安装 Podman 或 Docker 一样容易。假设你已经安装了其中之一,打开终端:

$ podman run -it -p 8080:8080 -p 8086:8086 artipie/artipie:latest

这将启动一个运行最新 Artipie 版本的新容器。它还映射了两个端口。你的仓库在 8080 端口提供服务。Artipie 的 Rest API 和 Swagger 文档在 8086 端口提供。新的镜像会生成一个默认的配置,打印一个正在运行的仓库列表,测试证书,以及一个指向 Swagger 文档的链接到你的控制台。

你也可以使用 Artipie Rest API 来查看现有的仓库:

  • 进入 Swagger 文档页面 http://localhost:8086/api/index-org.html
  • 在 “ 选择一个定义 Select a definition ” 列表中,选择 “ 认证令牌 Auth token ”。
  • 生成并复制用户 artipie 的认证令牌,密码是 artipie
  • 切换到 “ 仓库 Repositories ” 定义,点击 “ 认证 Authorize ” 按钮,然后粘贴令牌。

Image of the Swagger documentation page,

/api/v1/repository/list 执行一个 GET 请求。在响应中,你会收到一个包含三个默认仓库的 JSON 列表:

[
  "artipie/my-bin",
  "artipie/my-docker",
  "artipie/my-maven"
]

默认配置中不包括 Python 仓库。你可以通过从 Swagger 接口向 /api/v1/repository/{user}/{repo} 执行 PUT 请求来纠正。在这种情况下,user 是默认用户的名字(artipie),repo 是新仓库的名字。你可以把你的新 Python 代码库称为 my-pypi。下面是一个请求体的例子,包含带仓库设置的 JSON 对象:

{ 
  "repo": {
    "type": "pypi",
    "storage": "default",
    "permissions": {
      "*": [
        "download"
      ],
      "artipie": [
        "upload"
      ]
    }
  }
}

所有的 JSON 字段都和你在仪表板上创建 YAML 格式的仓库时一样。我们版本库的类型是 pypi,使用默认存储,任何人都可以下载,但只有用户 artipie 可以上传。

再次向 /api/v1/repository/list 发出 GET 请求,确保你的仓库被创建。现在,你有四个仓库:

[
  "artipie/my-bin",
  "artipie/my-docker",
  "artipie/my-maven",
  "artipie/my-pypi"
]

你已经创建了你自己的 Artipie 安装,包含了几个仓库! Artipie 镜像既可以在个人电脑上运行,也可以在私人网络内的远程服务器上运行。你可以用它来在一个公司、团体或大学内交换软件包。这是一个建立你自己的软件服务的简单方法,而且它不仅仅适用于 Python。花些时间来探索 Artipie,看看它能为你带来什么。


via: https://opensource.com/article/22/12/python-package-index-repository-artipie

作者:Alena Gerasimova 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

通过使用命令行让用户告诉程序要什么,可以让程序更加灵活。

 title=

在已经知道要处理什么文件和对文件进行哪些操作的情况下,编写处理文件的 C 语言程序就很容易了。如果将文件名“硬编码”在程序中,或者你的程序只以一种方式来处理文件,那么你的程序总是知道要做什么。

但是如果程序每次运行时能够对用户的输入做出反应,可以使程序更灵活。让用户告诉程序要处理什么文件,或者以不同的方式完成任务,要实现这样的功能就需要读取命令行参数。

读取命令行

一个 C 语言程序可以用如下声明开头:

int main()

这是启动 C 程序最简单的形式。但如果在圆括号中加入标准参数,你的程序就可以从命令行中读取选项了:

int main(int argc, char **argv)

argc 表示命令行中的参数个数。它总是一个至少为 1 的数。

argv 是一个二级指针,它指向一个字符串数组。这个数组中保存的是从命令行接收的各个参数。数组的第一个元素 *argv[0] 是程序的名称。**argv 数组的其它元素包含剩下的命令行参数。

下面我将写一个简单的示例程序,它能够回显通过命令行参数传递给它的选项。它跟 Linux 的 echo 命令类似,只不过我们的程序会打印出程序名。同时它还会调用 puts 函数将命令行选项按行打印输出。

#include <stdio.h>

int
main(int argc, char **argv)
{
  int i;

  printf("argc=%d\n", argc); /* debugging */

  for (i = 0; i < argc; i++) {
    puts(argv[i]);
  }

  return 0;
}

编译此程序,并在运行时提供一些命令行参数,你会看到传入的命令行参数被逐行打印出来:

$ ./echo this program can read the command line
argc=8
./echo
this
program
can
read
the
command
line

这个命令行将程序的 argc 置为 8,**argv 数组包含 8 个元素:程序名以及用户输入的 7 个单词。由于 C 语言中数组下标从 0 开始,所以这些元素的标号分别是 0 到 7。这也是在 for 循环中处理命令行参数时能够用 i < argc 作为比较条件的原因。

你也可以用这个方式实现自己的 catcp 命令。cat 命令的基本功能是显示一个或几个文件的内容。下面是一个简化版的cat 命令,它从命令行获取文件名:

#include <stdio.h>

void
copyfile(FILE *in, FILE *out)
{
  int ch;

  while ((ch = fgetc(in)) != EOF) {
    fputc(ch, out);
  }
}

int
main(int argc, char **argv)
{
  int i;
  FILE *fileptr;

  for (i = 1; i < argc; i++) {
    fileptr = fopen(argv[i], "r");

    if (fileptr != NULL) {
      copyfile(fileptr, stdout);
      fclose(fileptr);
    }
  }

  return 0;
}

这个简化版的 cat 命令从命令行读取文件名列表,然后将各个文件的内容逐字符地显示到标准输出上。假定我有一个叫做 hello.txt 的文件,其中包含数行文本内容。我能用自己实现的 cat 命令将它的内容显示出来:

$ ./cat hello.txt
Hi there!
This is a sample text file.

以这个简单程序为出发点,你也可以实现自己版本的其它 Linux 命令。比如 cp 命令,它从命令行读取两个文件名:要读取的文件和要写入的文件。

读取命令行选项

通过命令行读取文件名和其它文本固然很棒,但是如果想要程序根据用户给出的选项改变行为呢?比如 Linux 的 cat 命令就支持以下命令行选项:

  • -b 显示非空行的行号
  • -E 在行尾显示 $
  • -n 显示行号
  • -s 合并显示空行
  • -T 将制表符显示为 ^I
  • -v^xM-x 方式显示非打印字符,换行符和制表符除外

这些以一个连字符开头的单字母的选项叫做短选项。通常短选项是分开使用的,就像这样 cat -E -n。但是也可以将多个短选项合并,比如 cat -En

值得庆幸的是,所有 Linux 和 Unix 系统都包含 getopt 库。它提供了一种简单的方式来读取命令行参数。getopt 定义在头文件 unistd.h 中。你可以在程序中使用 getopt 来读取命令行短选项。

与其它 Unix 系统不同的是,Linux 上的 getopt 总是保证短选项出现在命令行参数的最前面。比如,用户输入的是 cat -E file -n-E 在最前面,-n 在文件名之后。如果使用 Linux 的 getopt 来处理,程序会认为用户输入的是 cat -E -n file。这样做可以使处理过程更顺畅,因为 getopt 可以解析完所有短选项,剩下的文件名列表可以通过 **argv 来统一处理。

你可以这样使用 getopt:

#include <unistd.h>

int getopt(int argc, char **argv, char *optstring);

optstring 是由所有合法的选项字符组成的字符串。比如你的程序允许的选项是 -E-n, 那么 optstring 的值就是 "En"

通常通过在循环中调用 getopt 来解析命令行选项。每次调用时 getopt 会返回找到的下一个短选项,如果遇到无法识别的选项则返回 '?'。当没有更多短选项时它返回 -1,并且设置全局变量 optind 的值指向 **argv 中所有段选项之后的第一个元素。

下面看一个简单的例子。这个演示程序没有实现 cat 命令的所有选项,但它只是能够解析命令行。每当发现一个合法的命令行选项,它就打印出相应的提示消息。在你自己的程序中,你可能会根据这些命令行选项执行变量赋值等者其它操作。

#include <stdio.h>
#include <unistd.h>

int
main(int argc, char **argv)
{
  int i;
  int option;

  /* parse short options */

  while ((option = getopt(argc, argv, "bEnsTv")) != -1) {
    switch (option) {
    case 'b':
      puts("Put line numbers next to non-blank lines");
      break;
    case 'E':
      puts("Show the ends of lines as $");
      break;
    case 'n':
      puts("Put line numbers next to all lines");
      break;
    case 's':
      puts("Suppress printing repeated blank lines");
      break;
    case 'T':
      puts("Show tabs as ^I");
      break;
    case 'v':
      puts("Verbose");
      break;
    default:                          /* '?' */
      puts("What's that??");
    }
  }

  /* print the rest of the command line */

  puts("------------------------------");

  for (i = optind; i < argc; i++) {
    puts(argv[i]);
  }

  return 0;
}

假如你把程序编译为 args,你可以通过尝试不同的命令行参数组合,来了解程序是怎么解析短选项,以及是怎么将其它的命令行参数留下来的。最简单的例子是将所有的选项都放在最前面,就像这样:

$ ./args -b -T file1 file2
Put line numbers next to non-blank lines
Show tabs as ^I
------------------------------
file1
file2

现在试试将两个短选项合并使用的效果:

$ ./args -bT file1 file2
Put line numbers next to non-blank lines
Show tabs as ^I
------------------------------
file1
file2

如果有必要的话,getopt可以对命令行参数进行重排:

$ ./args -E file1 file2 -T
Show the ends of lines as $
Show tabs as ^I
------------------------------
file1
file2

如果用户输入了错误的短选项,getopt 会打印一条消息:

$ ./args -s -an file1 file2
Suppress printing repeated blank lines
./args: invalid option -- 'a'
What's that??
Put line numbers next to all lines
------------------------------
file1
file2

下载速查表

getopt 还有更多的功能。例如,通过设计 -s string-f file 这样的命令行语法规则,可以让短选项拥有自己的二级选项。你也可以告诉 getopt 在遇到无法识别的选项时不显示错误信息。使用 man 3 getopt 命令查看 getopt(3) 手册可以了解 getopt 的更多功能。

如果你需要 getopt()getopt_long()的使用语法和结构上的提示,可以 下载我制作的速查表。它提供了最小可行代码,并列出了你需要了解的一些全局变量的含义。速查表的一面是 getopt() 的用法,另一面是 getopt_long()的用法。


via: https://opensource.com/article/21/8/short-option-parsing-c

作者:Jim Hall 选题:lujun9972 译者:toknow-gh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Terraform 是一种声明性语言,可以作为你正在建设的基础设施的蓝图。

在拥有一个 OpenStack 生产环境和家庭实验室一段时间后,我可以肯定地说,从管理员和租户的角度置备工作负载和管理它是很重要的。

Terraform 是一个开源的基础设施即代码(IaC)软件工具,用于 置备 provisioning 网络、服务器、云平台等。Terraform 是一种声明性语言,可以作为你正在建设的基础设施的蓝图。你可以用 Git 来管理它,它有一个强大的 GitOps 使用场景。

本文介绍了使用 Terraform 管理 OpenStack 集群的基础知识。我使用 Terraform 重新创建了 OpenStack 演示项目。

安装 Terraform

我使用 CentOS 作为跳板机运行 Terraform。根据官方文档,第一步是添加 Hashicorp 仓库:

$ sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo

接下来,安装 Terraform:

$ sudo dnf install terraform -y

验证安装:

$ terraform –version

如果你看到返回的版本号,那么你已经安装了 Terraform。

为 OpenStack 提供者创建一个 Terraform 脚本

在 Terraform 中,你需要一个 提供者 provider ,它是一个转换器,Terraform 调用它将你的 .tf 转换为对你正在协调的平台的 API 调用。

有三种类型的提供者:官方、合作伙伴和社区:

  • 官方提供者由 Hashicorp 维护。
  • 合作伙伴提供者由与 Hashicorp 合作的技术公司维护。
  • 社区提供者是由开源社区成员维护的。

在这个 链接 中有一个很好的 OpenStack 的社区提供者。要使用这个提供者,请创建一个 .tf 文件,并命名为 main.tf

$ vi main.tf

main.tf 中添加以下内容:

terraform {
  required_version = ">= 0.14.0"
  required_providers {
    openstack = {
      source  = "terraform-provider-openstack/openstack"
      version = "1.49.0"
    }
  }
}

provider "openstack" {
  user_name   = “OS_USERNAME”
  tenant_name = “OS_TENANT”
  password    = “OS_PASSWORD”
  auth_url    = “OS_AUTH_URL”
  region      = “OS_REGION”
}

你需要修改 OS_USERNAMEOS_TENANTOS_PASSWORDOS_AUTH_URLOS_REGION 变量才能工作。

创建一个 Terraform 管理文件

OpenStack 管理文件的重点是置备外部网络、路由、用户、镜像、租户配置文件和配额。

此示例提供风格,连接到外部网络的路由、测试镜像、租户配置文件和用户。

首先,为置备资源创建一个 AdminTF 目录:

$ mkdir AdminTF

$ cd AdminTF

main.tf 中,添加以下内容:

terraform {
  required_version = ">= 0.14.0"
  required_providers {
    openstack = {
      source  = "terraform-provider-openstack/openstack"
      version = "1.49.0"
    }
  }
}

provider "openstack" {
  user_name   = “OS_USERNAME”
  tenant_name = “admin”
  password    = “OS_PASSWORD”
  auth_url    = “OS_AUTH_URL”
  region      = “OS_REGION”
}

resource "openstack_compute_flavor_v2" "small-flavor" {
  name      = "small"
  ram       = "4096"
  vcpus     = "1"
  disk      = "0"
  flavor_id = "1"
  is_public = "true"
}

resource "openstack_compute_flavor_v2" "medium-flavor" {
  name      = "medium"
  ram       = "8192"
  vcpus     = "2"
  disk      = "0"
  flavor_id = "2"
  is_public = "true"
}

resource "openstack_compute_flavor_v2" "large-flavor" {
  name      = "large"
  ram       = "16384"
  vcpus     = "4"
  disk      = "0"
  flavor_id = "3"
  is_public = "true"
}

resource "openstack_compute_flavor_v2" "xlarge-flavor" {
  name      = "xlarge"
  ram       = "32768"
  vcpus     = "8"
  disk      = "0"
  flavor_id = "4"
  is_public = "true"
}

resource "openstack_networking_network_v2" "external-network" {
  name           = "external-network"
  admin_state_up = "true"
  external       = "true"
  segments {
    network_type     = "flat"
    physical_network = "physnet1"
  }
}

resource "openstack_networking_subnet_v2" "external-subnet" {
  name            = "external-subnet"
  network_id      = openstack_networking_network_v2.external-network.id
  cidr            = "10.0.0.0/8"
  gateway_ip      = "10.0.0.1"
  dns_nameservers = ["10.0.0.254", "10.0.0.253"]
  allocation_pool {
    start = "10.0.0.1"
    end   = "10.0.254.254"
  }
}

resource "openstack_networking_router_v2" "external-router" {
  name                = "external-router"
  admin_state_up      = true
  external_network_id = openstack_networking_network_v2.external-network.id
}

resource "openstack_images_image_v2" "cirros" {
  name             = "cirros"
  image_source_url = "https://download.cirros-cloud.net/0.6.1/cirros-0.6.1-x86_64-disk.img"
  container_format = "bare"
  disk_format      = "qcow2"

  properties = {
    key = "value"
  }
}

resource "openstack_identity_project_v3" "demo-project" {
  name = "Demo"
}

resource "openstack_identity_user_v3" "demo-user" {
  name               = "demo-user"
  default_project_id = openstack_identity_project_v3.demo-project.id
  password = "demo"
}

创建一个租户 Terraform 文件

作为一个 租户 Tenant ,你通常会创建虚拟机。你还为这些虚拟机创建网络和安全组。

这个例子使用上面由 Admin 文件创建的用户。

首先,创建一个 TenantTF 目录,用于与租户相关的置备:

$ mkdir TenantTF
$ cd TenantTF

main.tf 中,添加以下内容:

terraform {
  required_version = ">= 0.14.0"
  required_providers {
    openstack = {
      source  = "terraform-provider-openstack/openstack"
      version = "1.49.0"
    }
  }
}

provider "openstack" {
  user_name   = “demo-user”
  tenant_name = “demo”
  password    = “demo”
  auth_url    = “OS_AUTH_URL”
  region      = “OS_REGION”
}

resource "openstack_compute_keypair_v2" "demo-keypair" {
  name       = "demo-key"
  public_key = "ssh-rsa ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
}


resource "openstack_networking_network_v2" "demo-network" {
  name           = "demo-network"
  admin_state_up = "true"
}

resource "openstack_networking_subnet_v2" "demo-subnet" {
  network_id = openstack_networking_network_v2.demo-network.id
  name       = "demo-subnet"
  cidr       = "192.168.26.0/24"
}

resource "openstack_networking_router_interface_v2" "demo-router-interface" {
  router_id = “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”
  subnet_id = openstack_networking_subnet_v2.demo-subnet.id
}

resource "openstack_compute_instance_v2" "demo-instance" {
  name            = "demo"
  image_id        = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
  flavor_id       = "3"
  key_pair        = "demo-key"
  security_groups = ["default"]

  metadata = {
    this = "that"
  }

  network {
    name = "demo-network"
  }
}

初始化你的 Terraform

创建 Terraform 文件后,你需要初始化 Terraform。

对于管理员:

$ cd AdminTF

$ terraform init

$ terraform fmt

对于租户:

$ cd TenantTF

$ terraform init

$ terraform fmt

命令解释:

  • terraform init 从镜像源下载提供者用于置备此项目。
  • terraform fmt 格式化文件,以便在仓库中使用。

创建一个 Terraform 计划

接下来,为你创建一个 计划 plan ,看看将创建哪些资源。

对于管理员:

$ cd AdminTF

$ terraform validate

$ terraform plan

对于租户:

$ cd TenantTF

$ terraform validate

$ terraform plan

命令解释:

  • terraform validate 验证 .tf 语法是否正确。
  • terraform plan 在缓存中创建一个计划文件,所有管理的资源在创建和销毁时都可以被跟踪。

应用你的第一个 TF

要部署资源,使用 terraform apply 命令。该命令应用计划文件中的所有资源状态。

对于管理员:

$ cd AdminTF

$ terraform apply

对于租户:

$ cd TenantTF

$ terraform apply

接下来的步骤

之前,我写了一篇关于在树莓派上部署最小 OpenStack 集群的 文章。你可以找到更详细的 Terraform 和 Ansible 配置,并通过 GitLab 实现一些 CI/CD。


via: https://opensource.com/article/23/1/terraform-manage-openstack-cluster

作者:AJ Canlas 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

默认情况下,Ubuntu 禁用了 root 账户。你必须使用 sudo 命令来执行任何需要 root 权限的任务。

当然,这是为了你自己的安全。一直以 root 身份使用系统,就像手里拿着一把剑到处跑。它增加了把事情搞乱的机会。

以 root 身份登录在服务器中仍然很常见。在桌面方面,以 root 身份登录的情况相当少见。甚至 Kali Linux 也做了改变。

然而,有一些桌面用户想以 root 身份登录。这不是什么明智之举,但肯定是可以做到的。

在本指南中,我将向你展示如何在 Ubuntu 中 以 root 身份登录 GNOME 桌面

如何在 GNOME 桌面上以 root 身份登录

? 我不建议在桌面上以 root 身份登录。你有 sudo 机制来满足你所有的 root 需求。只有在你有足够理由的情况下才这样做。本教程仅用于演示目的。你已经被警告过了。

步骤 1:启用 root 账户

你想以 root 身份登录。但默认情况下,root 账户是禁用的。第一步是启用它。

改变 root 账户的密码,这将为你启用 root 账户:

sudo passwd root

change the password of root account in ubuntu

不言而喻,你不应该忘记 root 密码。

步骤 2:改变 GDM 配置

? 本教程的这一部分只对 GNOME 有效。请 检查你的桌面环境 并确保它是 GNOME。

Ubuntu 默认使用 GNOME,GNOME 使用 GDM 显示管理器。

为了允许以 root 身份登录到 GNOME,你需要对位于 /etc/gdm3/custom.conf 的 GDM 配置文件做一些修改。

对该配置文件做一个备份:

cp /etc/gdm3/custom.conf /etc/gdm3/custom.conf~

在最坏的情况下,如果你以某种方式把事情搞砸了,备份的文件可以用来从 TTY 上替换现有文件。

现在,用以下命令打开 GDM 文件:

sudo nano /etc/gdm3/custom.conf

并添加以下一行,允许 root 用户登录:

AllowRoot=true

configure GDM on ubuntu

Ctrl+X 退出 Nano,同时保存它。

步骤 3:配置 PAM 认证

现在,你必须配置 PAM 认证守护进程文件,它可以通过以下命令打开:

sudo nano /etc/pam.d/gdm-password

在这个文件中,你必须注释掉以下带有 # 号的一行,该符号拒绝 GUI 中的 root 访问:

auth   required        pam_succeed_if.so user != root quiet_success

保存修改并退出 nano 文本编辑器。

步骤 4:以 root 身份登录

现在,重启你的系统:

reboot

在登录界面,选择 Not listed 选项,在用户名中输入 root,并输入你在本指南开头配置的密码:

Login as a root in ubuntu desktop

当你登录后,它就会通知你,“logged in as a privileged user”

logged in as a privileged user in Ubuntu

这就完成了! 现在,你正在以 root 身份运行你的 Ubuntu 系统。

以 root 用户身份运行系统时,你应该知道的事情

Ubuntu 默认禁用 root 账户是有原因的。想知道为什么吗?在这里你可以找到:

Ubuntu 中的 root 用户-你应该知道的重要事项

再说一遍,在你的桌面 Linux 系统中以 root 登录是不可取的。请遵守规范,远离这种(错误的)冒险。


via: https://itsfoss.com/ubuntu-login-root/

作者:Sagar Sharma 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

新版本的 Endless OS 5.0 已经发布,带来了更多的功能和稳定性。下面是对这个版本的简要点评。

在不变性成为炒作对象之前,Endless OS 已经提供了一种基于 OSTree 的高效桌面体验。它基于 Debian 和 Ubuntu,但正在独立开发。由于其底层基于 OSTree,Endless OS 运行在其用户空间中,同时给你最好的桌面体验。

它是一个适合学校、小规模部署、实验室和离线使用情况的完美发行版。

新版本的 Endless OS 5.0 现在已经推出。下面是对其功能的快速回顾和深入点评。

我们相信,个人计算对生产力、学习和工作技能至关重要。

我们在过去 10 年中致力于设计和提供操作系统和工具,使人们能够获得和控制他们的技术。

借助我们的工具,我们可以通过使用和发现来提高生产力、创造力和学习,我们帮助各种背景的人以更有意义的方式参与数字经济。

—— Endless OS 使命宣言

Endless OS 5 点评

由于这个操作系统的目的是为不太富裕的人提供数字计算的机会,所以它提供了 Windows 安装程序。你可以直接下载它并在 Windows 环境中试用。

此外,它还提供了一个专门的独立 ISO 镜像,可以通过 U 盘进行安装。

上次我在 2021 年点评 Endless OS 时,它并没有提供 ARM 版本。我很惊讶地发现,它现在有一个 ARM 镜像,你可以在树莓派和其他 ARM 板上试用。

在我的测试安装中,一切都很顺利。它使用一个自定义的安装程序,类似于 Fedora 的 Anaconda 安装程序。然而,安装它需要一个完整的磁盘。如果你喜欢双启动,在此 有一个详细的指南。但是,我觉得它的设置有点复杂。

Endless OS installation in Windows

登录和第一印象

这个版本基于 Debian 11 “bullseye”,带有 Linux 主线 内核 5.15。此外,它还为该团队的原生应用程序提供了单独的软件仓库。其桌面基于 GNOME 41

这个版本在外观感受方面有一些改变。首先,底部面板被改变为显示基本的 GNOME 风格的停靠区。它总是可见的,当你把一个窗口移到它上面时,它就会消失。早些时候,它是一个固定的标准面板,有一个应用程序图标、系统托盘和正在运行的应用程序部件。

其次,它引入了一个新的顶部面板,遵循 GNOME 的设计。它包含活动、应用程序启动器和系统托盘。

Look has changed since prior release with dock and top panel in Endless OS 5.0

和 Endless OS 4.0 的外观相比,它有很多改变:

Endless OS Desktop version 4.0

对 GNOME 桌面和工作区的独特定制

默认外观保持不变,包括带有搜索框的桌面应用程序视图。顶部面板上的应用程序是对运行中的应用程序和桌面视图的切换。

超级键(Super)也可以切换到正在运行的应用程序和工作区视图,这一点非常方便。窗口在右上方有最小化、最大化和关闭按钮;它们不需要调整。

然而,在这个版本中,有一个喜欢的功能被放弃了。在 Endless OS 4.0 中,当你点击桌面的空白部分时,它会立即将所有打开的窗口最小化,并向你显示桌面。然而,这个功能已经不再可用了。这是一个多么方便的功能,可以使工作流程更加顺畅。

在 Endless OS 5.0 中引入 Wayland

现代显示服务器 Wayland 在这个版本中首次出现在 Endless OS 中。默认登录是 Wayland。然而,你可以从登录界面切换到 X.Org。得益于 Wayland,你可以感受到 Endless OS 操作系统中流畅的动画、手势和性能。

手势支持

Endless OS 5.0 还引入了多手势支持。你现在可以通过触控板/触摸板使用三指左右轻扫来浏览工作区。此外,三指向上滑动可以切换应用程序网格和工作空间。

支持的应用程序也可以使用捏合缩放,包括双指滚动。

这是一个非常需要的更新,以进一步提高你在 Endless OS 中的生产力。

应用程序中心、Flatpak 和应用程序

Endless OS 作为一个不可变的发行版,你所有的应用程序都运行在一个独立的用户空间。默认情况下,它只支持 Flatpak 软件包。默认配置了世界上最大的 Flatpak 仓库 Flathub。你可以直接从 AppCenter 搜索并安装任何 Flatpak 应用程序。

Flathub repo is pre-configured for Flatpak apps

然而,在默认情况下,几乎所有需要的应用程序都已经预装。如果你想处理文件,一个完整的 LibreOffice 包就在那里。它还包括预装了 Ad-Block 的 Chromium 网络浏览器!此外,你还得到了 Gedit 文本编辑器、Shotwell 图像查看器、Brasero 磁盘刻录应用程序、 文件 Files 应用作为文件管理器、管理你的学校/家庭工作流程的 Kolibri。

所有原生的 GNOME 应用程序现在都默认是 Flatpak 版本,而不是 APT 软件包。这是 Endless OS 5.0 的关键变化之一。

Kolibri is one of the amazing app - pre-loaded

帮助中心

Endless OS 的伟大功能之一是可以从帮助应用程序中获得离线帮助。你也可以通过桌面搜索功能访问它。

任何学生或首次使用的用户都可以快速了解桌面的基本功能,如 “如何更改密码” 或 “如何创建账户” 之类的问题。所有这些都可以作为离线帮助文件使用。

Endless OS desktop offline help

总结

Endless OS 5.0 带来了非常需要的变化,如 Wayland 和手势支持,同时坚持其原则,成为一个易于使用的大众发行版。它是一个设计良好、考虑周到的发行版,非常适合离线/远程使用、实验室、学校和社区。如果配置正确,Linux 可以影响数百万人 —— 对那些买不起昂贵软件的人来说。

另外,对于普通用户来说,如果你打算运行多年,这可能是一个完美的发行版。你可以把自己从升级、系统故障、命令、依赖性问题等的麻烦中解救出来。

这是该团队为社区发布的一个优秀版本。你可以从下面的链接下载它。

下载 Endless OS

你对这个版本的整体印象如何?请在评论栏里告诉我。

参见 Endless OS 5.0 发布说明


via: https://www.debugpoint.com/endless-os-5-0-review/

作者:Arindam 选题:lkxed 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出