分类 技术 下的文章

Shell 是类 Unix 系统中超级好用的工具,而 Zsh 是 shell 中的佼佼者,但是现在网上一搜索 Zsh 的配置方案,遍地都是的互相复制粘贴的 oh-my-zsh 配置方案。事实上 oh-my-zsh 并不好用,严重拖慢了 Zsh 的速度,反而让你的工作并不高效。现在将我自己的使用方案分享给大家,教大家配置一个高效好用的 Zsh。

安装 Zsh

我笔记本电脑使用的是 ArchLinux,服务器使用的是 Ubuntu。主要介绍这两个发行版的配置方法,红帽系的发行版请自行尝试。

我个人喜欢尽量从发行版的源里安装。从源安装具有方便,稳定,容易维护等优点。

在 ArchLinux 安装 Zsh

终端里面输入:

sudo pacman -Sy zsh

在 Ubuntu 安装 Zsh

终端里面输入:

sudo apt-get update
sudo apt-get install zsh

安装插件

我只需要两个插件:

  • zsh-autosuggestions:这个是自动建议插件,能够自动提示你需要的命令。
  • zsh-syntax-highlighting:这个是代码高亮插件,能够使你的命令行各个命令清晰明了。

还有一个主题:

  • zsh-theme-powerlevel10k 这个主题提供漂亮的提示符,可以显示当前路径、时间、命令执行成功与否,还能够支持 git 分支显示等等。

同样是尽可能从源里面安装。

Ubuntu 20.10 的源里面是 powerlevel9k,配置好后实际使用体验和 powerlevel10k 差别不大。

在 ArchLinux 安装插件和主题

终端里面输入命令:

sudo pacman -S zsh-autosuggestions zsh-syntax-highlighting zsh-theme-powerlevel10k zsh-completions

在 Ubuntu 安装插件和主题

终端里面输入命令:

sudo apt-get install zsh-autosuggestions zsh-syntax-highlighting zsh-theme-powerlevel9k

这样插件和主题就安装好了。

更改默认 shell,并配置插件和主题

安装好了之后就是启用 Zsh,并且配置插件和主题了。

更改默认 shell

终端输入命令:

chsh -s /usr/bin/zsh

ArchLinux 和 Ubuntu 都是同样的操作,然后注销并重新登录,就启用了 Zsh。第一次进入 Zsh 会自动出现一个配置界面,这个界面可以根据需要自定义 Zsh。

在这里输入 1 就可以进入配置界面了。

配置界面中各个菜单代表的意思分别是:

  • 1:设置命令历史记录相关的选项
  • 2:设置命令补全系统
  • 3:设置热建
  • 4:选择各种常见的选项,只需要选择“On”或者“Off”
  • 0:退出,并使用空白(默认)配置
  • a:终止设置并退出
  • q:退出

这里根据提示,然后按照你自己的喜好配置就可以了。配置好后,会在你的用户目录下生成 .zshrc 文件。然后我们要去这个文件中启用插件和主题。

配置插件和主题

Zsh 的配置文件是 ~/.zshrc 文件,这个文件在你的用户目录下 ~/。删掉了这个文件,再次进入 Zsh,又会触发 Zsh 的配置界面。

在 ArchLinux 启用插件和主题

打开 ~/.zshrc 文件,将以下行代码添加到其中:

source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
source /usr/share/zsh-theme-powerlevel10k/powerlevel10k.zsh-theme
在 Ubuntu 启用插件和主题

打开 ~/.zshrc 文件,将以下行代码添加到其中:

source /usr/share/powerlevel9k/powerlevel9k.zsh-theme
source /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh
source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

这样就成功的启用了插件和主题,插件不需要额外的配置就很好用,有额外配置需求的可以自行研究。

powerlevel10k 主题在首次进入时,会触发一个配置界面。

然后根据提示和你的喜好一步步完成配置即可。

这里可以选择你喜欢的提示符。

配置完成后就可以愉快的使用啦!

LCTT 的 CI 已经在 Travis CI 上运转了多年,一致保持着良好的使用体验。自 2019 年 Github 推出了自家的 CI 工具 Github Action 后,我们就在考虑将 CI 从 Travis-CI 迁移到 Github,以降低维护和沟通的成本,并借助于 GitHub Action Marketplace 实现更强的功能。

项目首页

最近,因为 TravisCI 屡屡部署出错,而我们的账户因为使用的较多,已经超出了免费使用的限制,以此为契机,将 CI 从 Travis CI 迁移到 GitHub Action。

Travis CI 的提醒

项目介绍

Translate ProjectLCTT 翻译组的主要协作项目,几百位译者通过 GitHub 进行围绕开源、Linux、软件工程等领域的文章翻译,从 2013 年来,累计了大量的提交,致使项目下有非常多的文件。

Translate Project 借助于 CI 帮助译者对基本的文章格式和拉取请求进行检查;并定时执行命令,以进行所有的申请检查,对于超时未完成翻译的工作进行回收;对于文章的状态进行标记,生成相应的徽章。

生成徽章

迁移思路

Travis CI 和 Github Action 在使用方面,其实总体差异不会太大,都是基于 YAML 文件格式来编写配置文件。不过,和 Travis CI 不同的是,Github Action 支持多个不同的配置文件,因此,你可以根据不同的场景,设定不同的配置文件,降低单个配置的文件的复杂度。

此外,由于我们的脚本中依赖了一些 Travis CI 的环境变量,也需要将其替换为 Github Action 中的相应环境变量,从而确保脚本可以运转。

改造实践

1. 分析之前的 CI 流程

我们在 TravisCI 上的 CI 配置文件如图:

配置文件

总体可以分为三块:

  1. 命令区:说明了安装阶段和执行阶段的操作有哪些
  2. 条件区:指定了这个配置文件在哪些条件下会生效
  3. 部署区:写明了构建产物如何进行部署

在命令区中,有预置的安装过程和后续的执行过程。在安装过程中,安装了一些依赖,并将当前的 pages 资源克隆到本地,以继承上一次构建生成的资料。

在条件区则指明了仅作用于 master 分支。

在部署区便是将前面命令区的执行结果进行部署。

基本流程

在实际的执行过程中,还会根据环境变量不同,决定是否要执行特定的命令,这部分在后续的改造过程中,就可以调整部署,拆分到不同的文件中。

构建流程

2. 直接套用配置文件

在完成了基本的分析后,就可以建立新的 Action 配置文件了。由于基本的语法很类似,对于其中的不少内容可以进行直接套用。

比如,我们的配置文件在直接套用后,结果如下

直接套用后的结果

直接套用的文件已经可以直接运行,不过,这里有很多不满足需要的地方,所以需要做一些修改。

3. 恢复 Travis CI 的环境变量

由于我们使用的 Badge 等生成脚本并非我所编写,所以在这一次的迁移中,并不打算对齐进行调整,以避免出现故障。而脚本中依赖了一些变量,需要将其重新设置出来。

Github Action 提供了一些方法,可以让你手动设置环境变量。你可以在你的构建的步骤中,加入如下代码,从而在构建环境中设定 TRAVIS_BRANCHTRAVIS_EVENT_TYPE 环境变量,确保你可以使用这个环境变量。

 - name: Set ENV variables
        run: |
 echo "::set-env name=TRAVIS\_BRANCH::${TRAVIS\_BRANCH:-$(echo $GITHUB\_REF | awk 'BEGIN { FS = "/" } ; { print $3 }')}" 
 echo "::set-env name=TRAVIS\_EVENT\_TYPE::$(if [ "schedule" == "${{ github.event\_name }}" ]; then echo "cron"; else echo "${{ github.event\_name }}"; fi)"

此外,由于 set-env 这个方法相对比较危险,你还需要在环境变量中,开启危险函数的执行。

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      ACTIONS\_ALLOW\_UNSECURE\_COMMANDS: true

4. 拆分配置文件

Github Action 和 TravisCI 不同的一点是你可以将你的 CI 文件拆分成多个文件,从而降低每一个单独的配置文件的复杂度。

根据前面对于流程的分析,可以将我们的 CI 流程拆分成三个部分:

  1. 生成 badge 文件,应当跟随每一次提交进行
  2. 生成 status 文件,执行时间较长,可以定期执行
  3. 根据拉取请求内容进行整理,做核验

则将我们的配置文件拆分成三个不同的文件:

也得益于拆分开,则在 checker 中就可以免于安装一些必要的依赖,从而精简 CI 流程,提升 CI 的执行时间。

5. 测试 CI 的运行情况

在完成了配置文件的编写和拆分后,就可以进行本地的执行测试。Github Action 写完了,难免要执行一下,确保整个流程是正常的。

这个时候你可以安装工具(https://github.com/nektos/act),来在本地执行 Action ,从而确认你的代码执行是正确的。

如果你是 macOS ,只需要执行 brew install act 就可以安装 act 工具,来完成 act 的安装。

安装完成 act ,就可以通过执行 act 命令来在本地执行 Action ,比如,执行 act pull_request 来触发 GitHub 的拉取请求事件

通过本地测试后,再将你的配置文件推送到 GitHub 上,进行生产环境的测试即可。

6. 移除 Travis-CI

通过上述的一些步骤,我们完成了从 Travis CI 到 GitHub Action 的迁移,此时,就可以移除项目根目录中的 .travis.yml 文件,彻底关闭 Travis CI。

7. 替换环境变量

在完成了基本的迁移后,需要对代码中的一些历史问题进行修复。在第三步中,我们对于 Travis-CI 的环境变量进行替换,但长期维护的项目应当尽量将这些未标注上下文的信息替换为有文档标注的,因此,我们需要将其替换。

替换环境变量主要依赖 Github 官方的环境变量说明,你可以参考官方文档

简化后,配置文件从之前的 27 行,减少至 17 行,变得更加的精简、易懂。

name: LCTT Article Checker

on:
  pull_request:
    branches: [master]
jobs:
  build:
    runs-on: ubuntu-latest
    env:
      PULL_REQUEST_ID: ${{ github.event.number }}
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: "checkout master branch & return to pull request branch"
        run: CURRENT=$(echo ${{github.ref}} |  sed "s|refs/|refs/remotes/|") && git checkout master && git checkout $CURRENT
      - name: run check
        run: sh ./scripts/check.sh;

8. 修改 GitHub 的分支保护条件

为了确保修改符合标准,我们限制了新的拉取请求必须通过 CI 检查,才能合并进入 master 分支,因此,也需要修改相应的分支保护规则,确保设定相应的保护。

一些注意事项

1. 环境变量不同

如果你依赖了环境变量,则需要进行相应的修改。或者可以像我一样,先通过 set-env 来让本地拥有临时的环境变量,后续再逐步进行迁移。

2. Action 运行依赖要注意安全

Action 执行过程中会有两个部分。Action 本身流程依赖于 master 分支,但执行过程中调用的脚本是根据源决定的,因此,从安全角度来看,你应当尽可能将所有的流程放在 Action 中,而不是放在你的源码目录中。

3. 如何触发 CI 的拉取请求检查?

在进行拉取请求测试的时候,需要不断触发不同的提交 ,你可以通过执行 git commit --allow-empty -m "Trigger notification" && git push 来触发一个空白的提交, 推送到 Github 后,就可以再次触发拉取请求的构建,提升构建的效率。

总结

通过对 TravisCI 的流程整理、代码修改等流程,我们将之前的 Travis-CI 迁移至速度更快、性能更好的 GitHub Action ,一方面可以优化我们的工作流,另一方面,也让我们的代码更加简洁明了。

对于还在使用 Travis CI 的项目来说,也可以考虑迁移到 GitHub Action 中,来优化自己的工作流。

参考阅读

使用 ceph-ansible 安装 Ceph 存储,并将其部署在树莓派集群中。

 title=

Ceph 是一个开源软件存储平台,它在统一的存储集群中提供对象、块和文件系统存储。我第一次使用 Ceph 是在 OpenStack 中集成它的时候。一开始,我很困惑,既然存储设备广泛存在,为什么要使用 Ceph。但在使用了三年多之后,这个平台的稳定性和完整性一再证明了它的价值。

本文将告诉你如何使用 ceph-ansible(Ceph 官方支持的 Ansible playbook)安装 Ceph,并将其部署在树莓派集群中。

材料:

  1. 树莓派 4B 4GB 型号四台。
  2. 四张 32GB 的 microSD 卡(用于启动操作系统)
  3. 四个树莓派外壳,带风扇和散热片(非常重要)
  4. 四个树莓派充电器
  5. 6 个 32GB U 盘(用于 Ceph OSD 节点)

架构:

 title=

关于配置:

  • 前端和后端网络都在同一个子网中
  • Ceph Monitor 软件使用 4GB 内存的树莓派 4B。
  • Ceph OSD 节点使用相同的树莓派型号,但有两个 U 盘用于 OSD 磁盘

使用 ceph-ansible 部署 Ceph

使用 Ceph 的 Ansible 仓库可以让部署变得顺畅简单

1、复制 ssh 密钥到所有服务器

我在所有的服务器上都有一个名为 cephadmin 的共同用户(在此背景下,每个树莓派都是一台服务器)。cephadmin 用户配置了无密码的 sudo,以方便工作。

使用 ssh-keygen 生成密钥后,使用 ssh-copy-id 部署所有密钥。

我使用了一个 Bash for 循环,因为我使用的是一致并递增的主机名:

$ for i in {0..3}; \
  do ssh-copy-id cephadmin@rpi4b4-$i; \
done

你需要每个接受并输入密码,但你可以用 expect 来自动完成。

2、克隆 ceph-ansible 并安装依赖

安装 Git 来克隆仓库:

$ sudo yum install git -y

克隆 ceph-ansible 仓库:

$ git clone https://github.com/ceph/ceph-ansible.git
$ cd ceph-ansible/

我使用的是 CentOS 7 的 AArch64 构建,所以在继续之前,我必须安装一些所需的包。

首先安装 Python pip

$ sudo yum install python3-pip -y

接着是 ceph-ansible 需要的包:

$ sudo yum install python3-devel libffi-devel openssl-devel -y

最后,ceph-ansible 需要的依赖:

$ pip3 install -r requirements.txt --user

我收到了这个错误:

You are linking against OpenSSL 1.0.2, which is no longer supported by the OpenSSL project.
To use this version of cryptography you need to upgrade to a newer version of OpenSSL. For
this version only you can also set the environment variable
CRYPTOGRAPHY_ALLOW_OPENSSL_102 to allow OpenSSL 1.0.2.

这可能与架构有关,因为我无法在 CentOS 7 虚拟机中复现该错误。

部署时,将 CRYPTOGRAPHY_ALLOW_OPENSSL_102 导出为 True,这样 Ansible 就可以运行了。

$ export CRYPTOGRAPHY_ALLOW_OPENSSL_102=True

3、配置 ceph-ansible 进行部署

现在你可以使用 ceph-ansible 部署 Ceph 了。

复制 site.yml.samplesite.yml

$ mv site.yml.sample site.yml

group_vars 目录下创建 all.yml

$ cat << EOF >> group_vars/all.yml
ceph_origin: repository
ceph_repository: community
ceph_repository_type: cdn
ceph_stable_release: nautilus
monitor_interface: wlan0
public_network: "192.168.100.0/24"
cluster_network: "192.168.100.0/24"
dashboard_enabled: false
configure_firewall: false
EOF

group_vars 目录下创建 osds.yml

$ cat << EOF >> group_vars/all.yml
osd_scenario: collocated
devices:
 - /dev/sda
 - /dev/sdb
EOF

创建一个 inventory 文件:

$ cat << EOF >> inventory
[mons]
rpi4b4-0

[osds]
rpi4b4-1
rpi4b4-2
rpi4b4-3
EOF

在写这篇文章的时候,ceph-ansible 仓库里有一个 bug(根据这个 bug 工单)。你可以通过编辑角色的第 85 行和第 86 行来减轻这个 bug。

    - (wait_for_all_osds_up.stdout | from_json)["osdmap"]["num_osds"] | int > 0
    - (wait_for_all_osds_up.stdout | from_json)["osdmap"]["num_osds"] == (wait_for_all_osds_up.stdout | from_json)["osdmap"]["num_up_osds"]

4、部署 Ceph

用你的 inventory 文件运行 Ansible 剧本:

$ ansible-playbook -i inventory site.yml

15-20 分钟后,你应该看到这个结果:

 title=

下面的步骤

之前,我在另一个树莓派集群中手动部署了一个 OpenStack 集群。我希望能将其与这个集群整合在一起。我也在研究用 TripleO 部署。

树莓派、Ansible 和 OpenStack 的可能性是无穷的。开始做你自己的实验,并在评论中告诉我结果如何。


via: https://opensource.com/article/21/1/ceph-raspberry-pi

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

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

无论你在 Python 编程过程中处于什么阶段,这些 Python 热门文章将会对你有很大帮助。

2019 年是 Python 的好年景。根据 GitHubStack Overflow 的受欢迎资源程度来看,它正在成为全球第二大流行语言。(LCTT 译注:原文发表于 2019 年底,但是这里提及的文章并没有过时。)

“在我们的调查中,Python 作为增长最快的程序设计语言,在程序设计语言中排名再次上升,今年排在 Java 之前,成为第二大最受欢迎的程序设计语言(仅次于 Rust )。”

Stack Overflow Insights

同样,Python 的读者人数呈跳跃式激增。以下是按主题分组的 2019 年以来最热门的 Python 文章,供你仔细阅读。

为什么选择 Python ?

在众多的程序设计语言中,是什么使 Python 成为首选呢?从文章的阅读量来看,那就是因为它的灵活性。正如 Jigyasa Grover 解释的那样,Python 开发人员可以使用 多种范例,包括 Seth Kenlon 教程所展示的流行的 面向对象程序设计

如果你是 Python 的长期用户,并且正在寻找 Python 为什么是完美的程序设计语言的高级例子,那么可以看 Moshe Zadka 的 喜欢 Python 的 5 大理由。如果这还不够的话,你也可以使用功能强大的工具来尝试,无需编写大量代码,例如 Parul Pandey 关于 图像处理 的教程。

配置 Python

随着 Python 的受欢迎程度不断提高,使用它的人越来越多。这些新手中的许多人都是在 Mac 操作系统上进行的,并且正在使用 Moshe 和我写的 Python3 配置向导

安装 Python 之后,接下来就是决定利用什么工具编写代码。关于文本编辑器和集成开发环境(IDE),有很多选择,但是读者似乎更喜欢图形界面,在有关该主题的文章中,Stephan Avenwedde 的关于 Pythonic 和我关于 JupyterLab 的文章的读者最多。

在对程序设计语言充满信心的途径上,开发人员将不得不面对众多选择,来管理程序设计语言的版本和项目依赖。幸运的是,László Kiss Kollár 的文章 Python 包管理 让其变得更加容易。

当你准备好配置一个具有所有功能的 IDE,以最大限度地利用这门语言时,请一定尝试一下 linter Black,如 Moshe 说的,保持代码的清洁。

小结

无论你处在 Python 程序设计的哪个阶段,这些热门 Python 文章都将为你提供帮助。如果没有至少一次对测试重要性的认可,我无法对此进行总结,为此,Moshe 提供了另一篇 关于 tox 的好文章。


via: https://opensource.com/article/19/12/learn-python

作者:Matthew Broberg 选题:lujun9972 译者:stevenzdg988 校对:wxy

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

作为第 1 部分的延续,本第 2 部分将介绍 Portainer 的其余功能。

监控 docker 容器镜像

root@linuxtechi ~}$ docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS   PORTS                             NAMES
9ab9aa72f015        ubuntu                "/bin/bash"         14 seconds ago      Exited (0) 12 seconds ago                  suspicious_shannon
305369d3b2bb        centos                "/bin/bash"         24 seconds ago      Exited (0) 22 seconds ago                  admiring_mestorf
9a669f3dc4f6        portainer/portainer   "/portainer"        7 minutes ago       Up 7 minutes   0.0.0.0:9000->9000/tcp      trusting_keller

包括 portainer(docker 容器镜像),所有已退出和当前正在运行的 docker 镜像都会显示出来。下面的 Portainer GUI 屏幕截图显示了相同的情况。

Docker_status

监视事件

单击 portainer 网页中的“Events”选项,如下所示。

基于 docker 容器活动生成和创建的各种事件将被提取并显示在此页面中.

Container-Events-Poratiner-GUI

现在检查并验证“Events”部分是如何工作的。创建一个新的 docker 容器镜像 redis,如下所述,在 docker 命令行检查状态:docker ps –a

root@linuxtechi ~}$ docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS         PORTS                    NAMES
cdbfbef59c31        redis                 "docker-entrypoint.s…"   About a minute ago   Up About a minute         6379/tcp                 angry_varahamihira
9ab9aa72f015        ubuntu                "/bin/bash"              10 minutes ago       Exited (0) 10 minutes ago                            suspicious_shannon
305369d3b2bb        centos                "/bin/bash"              11 minutes ago       Exited (0) 11 minutes ago                            admiring_mestorf
9a669f3dc4f6        portainer/portainer   "/portainer"             17 minutes ago       Up 17 minutes         0.0.0.0:9000->9000/tcp   trusting_keller

单击顶部的“Event List”刷新事件列表,

events_updated

现在事件的页面也更新了这个变化,

主机状态

下面是 portainer 显示主机状态的屏幕截图。这是一个简单的窗口。这显示了主机 Linux 机器的基本信息,如“CPU”、“主机名”、“操作系统信息”等。这个页面在不需要登录主机命令行的情况下提供了非常有用的信息,以便快速浏览。

Host-names-Portainer

Portainer 中的仪表板

到目前为止,我们已经在“Local”部分看到了基于 portainer 的各种特性。现在跳到所选 Docker 容器镜像的“Dashboard”部分。

在 Portainer 的网页中单击“EndPoint”选项时,会出现以下窗口:

End_Point_Settings

对于主机容器镜像,此仪表板有许多状态和选项。

Stacks

单击此选项可提供任何堆栈(如果有的话)的状态。因为这里没有堆栈,所以显示为零。

Images

单击此选项可提供主机中可用的容器镜像。此选项将显示所有活动和退出的容器镜像。

Docker-Container-Images-Portainer

例如,再创建一个“Nginx”容器并刷新此列表以查看更新:

root@linuxtechi ~}$  sudo docker run nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
27833a3ba0a5: Pull complete
ea005e36e544: Pull complete
d172c7f0578d: Pull complete
Digest: sha256:e71b1bf4281f25533cf15e6e5f9be4dac74d2328152edf7ecde23abc54e16c1c
Status: Downloaded newer image for nginx:latest

下面是刷新后的镜像界面:

Nginx_Image_creation

当 Nginx 镜像处于 stopped/killed 状态时,docker 的容器镜像会改变为 unused 状态。

:你可以看到这里所有的镜像的细节都非常清楚,比如内存使用,创建日期和时间。与命令行选项相比,从这里维护和监视容器将非常容易。

Networks

此选项用于网络操作。例如分配 IP 地址、创建子网、提供 IP 地址范围、访问控制(管理员和普通用户)。下面的窗口提供了各种可能选项的详细信息。根据你的需要,可以进一步去自行研究这些选项。

Conatiner-Network-Portainer

输入所有各种网络参数后,单击“create network”按钮即可创建网络。

Container

此选项将提供容器状态。此列表将提供有关活动的和未运行的容器状态的详细信息。此输出类似于 docker ps 命令选项。

Containers-Status-Portainer

在该窗口中,通过选中复选框并选择上述按钮可以根据需要控制容器停止和启动。一个例子如下:

例如,“CentOS”和“Ubuntu”容器都处于停止状态,现在可以通过选中复选框并点击“Start”按钮来启动它们。

start_containers1

start_containers2

注意: 因为这两个都是 Linux 容器镜像,所以不会被启动。Portainer 尝试启动,但稍后又停止。试试启动“Nginx”,你会看到它变成了 running 状态。

start_containers3

Volume

参见本文章第一部分。

Portainer 中的设置选项

到目前为止,我们已经在“Local”部分看到了基于 portainer 的各种特性。现在跳到所选 Docker 容器图像的“Settings”部分。

在 Portainer 的网页中单击“Settings”选项时,可以使用以下的配置选项:

Extensions

这是一个简单的 Portainer CE 订阅程序。详细信息和用途可以从附加的窗口中看到。这主要用于维护相应版本的许可证和订阅。

Extensions

Users

此选项用于添加具有或不具有管理权限的“用户”。下面的示例提供了相同的示例。

在本例中输入你的想好的用户名比如“shashi”和你选择的密码,然后点击下面的“Create User”按钮。

create_user_portainer

create_user2_portainer

Internal-user-Portainer

类似地,可以通过选中复选框并点击 “remove” 按钮来删除刚刚创建的用户“shashi”。

user_remove_portainer

Endpoints

此选项用于端点终端管理。终端可以添加和删除,如附加窗口中所示。

Endpoint-Portainer-GUI

新终端“shashi”是使用如下所示的各种默认参数创建的,

Endpoint2-Portainer-GUI

类似地,可以通过单击复选框并单击移除按钮来移除此端点。

Registries

此选项用于注册管理。由于 docker hub 有各种镜像的注册,因此此功能可用于类似的目的。

Registry-Portainer-GUI

使用默认选项就可以创建“shashi-registry”。

Registry2-Portainer-GUI

同样,如果不需要了,就可以移除它。

Settings

此选项用于设置以下各种选项,

  • 设置快照间隔
  • 设置自定义徽标
  • 创建外部模板
  • 安全功能,如:为非管理员禁用和启用 bin 挂载,为非管理员禁用/启用权限,启用主机管理功能

下面的屏幕截图显示了出于演示目的启用和禁用的一些选项。一旦全部完成点击“保存设置”按钮保存所有这些选项。

Portainer-GUI-Settings

现在点开“Authentication settings”就会弹出 LDAP、Internal 和 OAuth(extension)选项,如下所示:

Authentication-Portainer-GUI-Settings

根据我们想要的环境安全特性级别,选择相应的选项。

以上就是本文的内容,我希望这些介绍 portainer 的文章能帮助你更有效地管理和监视容器。请分享你的反馈和意见。


via: https://www.linuxtechi.com/monitor-manage-docker-containers-portainer-io-part-2/

作者:Shashidhar Soppin 选题:lujun9972 译者:Chao-zhi 校对:wxy

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

当你学习一门新的编程语言时,这个“猜数字”游戏是一个很好的入门程序。下面是如何用 C 语言来编写它。

我在小学时就开始 自学编程。我的第一个程序是在 Apple II 上编写的,但最终,我还是通过看书和编程练习学会了 C 语言。练习编程的最佳方法是编写示例程序,它能帮助你练习新知识。

在我学习一种新的编程语言时,我喜欢编写一个简单的“猜数字”游戏来练习。电脑从 1 到 100 中随机挑选一个数字,你必须通过猜测来算出来。在另一篇文章中,我展示了如何用 Bash 语言编写这个“猜数字”游戏,我的同事也写了一些文章,介绍如何用 JavaJulia 和其他计算机语言编写它。

“猜数字”游戏的伟大之处在于它践行了几个编程概念:如何使用变量、如何比较值、如何打印输出以及如何读取输入。

整个夏天,我录制了一个系列视频,教人们如何用 C 语言编写程序。从那以后,我听到了很多人都在跟着它学习 C 语言编程的消息。所以,我想接着用 C 语言写一个“猜数字”的游戏。

去取一个随机数

从写一个函数来选择一个随机数字来开始“猜数字”游戏。在编写函数时,优秀的程序员会尽量使它们具有灵活性,这样他们就可以重用它们来解决略有不同的问题。因此,与其硬编码函数来选择 1 到 100 之间的一个随机数,不如编写函数来选择 1 到某个整数 maxval 之间的一个随机数:

#include <stdio.h>
#include <sys/random.h>

int
randnum(int maxval)
{
  /* pick a random number from 1 to maxval */

  int randval;

  getrandom(&randval, sizeof(int), GRND_NONBLOCK);

  /* could be negative, so ensure it's positive */

  if (randval < 0) {
    return (-1 * randval % maxval + 1);
  }
  else {
    return (randval % maxval + 1);
  }
}

该函数使用 Linux 的系统调用 getrandom 来生成一系列随机数。你可以在手册页中了解关于这个系统调用的更多信息,但请注意,getrandom 将用随机的 0 和 1 填充变量。这意味着最终值可以是正的,也可以是负的,因此你需要在之后进行测试,以确保 randnum 函数的结果是正值。

编写程序

你可以用这个函数来写你的“猜数字”程序:

#include <stdio.h>
#include <sys/random.h>
 
int
randnum(int maxval)
{
  ...
}

int
main(void)
{
  int number;
  int guess;

  number = randnum(100);

  puts("Guess a number between 1 and 100");

  do {
    scanf("%d", &guess);

    if (guess < number) {
      puts("Too low");
    }
    else if (guess > number) {
      puts("Too high");
    }
  } while (guess != number);

  puts("That's right!");

  return 0;
}

程序首先使用 randnum 函数从 1 到 100 之间选择一个随机数。在向用户输出一个提示后,程序进入一个 do-while 循环,以便用户可以猜测数字。

在循环的每次迭代中,程序测试用户的猜测的数值。如果用户的猜测小于随机数,程序将输出“Too low”,如果猜测大于随机数,程序将输出“Too high”。循环继续,直到用户的猜测与随机数相同。

当循环退出时,程序输出 “That's right!”,然后立即结束:

$ gcc -o guess -Wall guess.c

$ ./guess
Guess a number between 1 and 100
50
Too high
30
Too low
40
Too low
45
Too high
42
Too low
43
Too low
44
That's right!

尝试动手

在学习一门新的编程语言时,这个“猜数字”游戏是一个很好的入门程序,因为它以一种非常直接的方式练习了几个常见的编程概念。通过用不同的编程语言实现这个简单的游戏,你可以演示一些核心概念,并比较每种语言的细节。

你有最喜欢的编程语言吗?你会如何用它来编写“猜数字”游戏呢?关注本系列文章,查看你可能感兴趣的其他编程语言的示例。


via: https://opensource.com/article/21/1/learn-c

作者:Jim Hall 选题:lujun9972 译者:qfzy1233 校对:wxy

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