README-zh_CN.md
:information_source: 此存储库包含有关各种技术主题的问题和练习,有时与 DevOps 和 SRE 相关
:bar_chart: 当前有 2624 个问题
:warning: 您可以使用这些来准备面试,但大多数问题和练习并不代表实际的面试。请阅读常见问题了解更多详情
:page_facing_up: 不同的面试官专注于不同的事情。 有些人将重点放在你的简历上,而另一些人可能将重点放在方案问题或特定的技术问题上。 在这个仓库,我尽力覆盖各种类型的 DevOps 问题,供你练习和测试你的知识
:pencil: 你可以通过提交拉取请求来添加更多练习:) 在此处阅读贡献指南
</b></details>
<details> <summary>什么是 TCP/IP?</summary> <b>一组协议,定义了两个或多个设备如何相互通信。
了解更多关于TCP/IP, 阅读 这里
</b></details>
<details> <summary>什么是以太网?</summary> <b>以太网简单地指的是当今最常见的局域网(LAN)类型。与跨越较大地理区域的广域网(WAN)相对,LAN是一个连接在小范围内的计算机网络,比如你的办公室、大学校园或者家庭。
</b></details>
<details> <summary>什么是 MAC 地址?它有什么用途?</summary> <b>MAC地址是用于识别网络上各个设备的唯一标识号码或代码。
通过以太网发送的数据包始终来自一个 MAC 地址并发送到一个 MAC 地址。如果网络适配器接收到一个数据包,它会将该数据包的目标 MAC 地址与适配器自身的 MAC 地址进行比较。
</b></details>
<details> <summary>这个 MAC 地址是在什么时候使用的?: ff:ff:ff:ff:ff:ff</summary> <b>当设备向广播 MAC 地址(FF:FF:FF:FF:FF:FF)发送数据包时,它会传递给本地网络上的所有站点。以太网广播用于在数据链路层通过 ARP 解析 IP 地址到 MAC 地址。 </b></details>
<details> <summary>什么是 IP 地址?</summary> <b>互联网协议地址(IP 地址)是分配给连接到使用互联网协议进行通信的计算机网络上的每个设备的数字标签。IP地址具有两个主要功能:主机或网络接口识别和位置寻址。 </b></details>
<details> <summary>解释子网掩码并举例说明</summary> <b>子网掩码是一个32位的数字,用于屏蔽 IP 地址并将 IP 地址分为网络地址和主机地址。子网掩码通过将网络位设置为全部"1",将主机位设置为全部"0"来生成。在给定的网络中,总可用主机地址中始终保留两个用于特定目的,并且不能分配给任何主机。这些是第一个地址,被保留作为网络地址(也称为网络 ID),以及最后一个用于网络广播的地址。
</b></details>
<details> <summary>私有 IP 地址是什么?在哪些场景/系统设计中应该使用它?</summary> <b> 私有IP地址被分配给同一网络中的主机,以便彼此通信。正如“私有”这个名字所暗示的那样,拥有私有IP地址的设备无法被来自任何外部网络的设备访问到。例如,如果我住在一个宿舍,并且我希望我的室友们加入我托管的游戏服务器,我会要求他们通过我的服务器的私有IP地址加入,因为该网络是局域网。 </b></details> <details> <summary>什么是公共 IP 地址?在哪些场景/系统设计中,应该使用它?</summary> <b> 公共IP地址是面向公众的 IP 地址。如果你正在托管一个游戏服务器,希望你的朋友加入,你会给他们提供你的公共IP地址,以便他们的计算机能够识别和定位到你的网络和服务器,从而进行连接。在与与您连接到同一网络的朋友玩耍时,并不需要使用面向公众的IP地址,在这种情况下,您将使用私有IP地址。为了使某人能够连接到内部位置的服务器上,您需要设置端口转发来告诉路由器允许来自公共域名和网络之间的流量通信。 </b></details> <details> <summary>解释 OSI 模型。有哪几层?每层负责什么?</summary> <b>您可以在 penguintutor.com 阅读有关OSI模型的更多信息。 </b></details>
<details> <summary>对于以下每个确定其属于哪个 OSI 层:单播:一对一的通信,其中有一个发送者和一个接收者。
广播:向网络中的所有人发送消息。地址 ff:ff:ff:ff:ff:ff 用于广播。 使用广播的两个常见协议是 ARP 和 DHCP。
多播:向一组订阅者发送消息。它可以是一对多或多对多的。 </b></details>
<details> <summary>什么是 CSMA/CD?它在现代以太网网络中使用吗?</summary> <b>CSMA/CD 代表载波侦听多路访问冲突检测。 其主要目标是管理对共享介质/总线的访问,每次只有一个主机可以传输。
CSMA/CD 算法:
路由器、交换机和集线器都是用于连接局域网(LAN)中的设备的网络设备。然而,每个设备的操作方式不同,并且具有其特定的使用情况。以下是对每个设备及其之间区别的简要描述:
三个冲突域和一个广播域 </b></details>
<details> <summary>路由器是如何工作的?</summary> <b>路由器是一种物理或虚拟设备,用于在两个或多个分组交换的计算机网络之间传递信息。路由器检查给定数据包的目标互联网协议地址(IP地址),计算它到达目的地的最佳路径,然后相应地转发它。
</b></details>
<details> <summary>什么是NAT?</summary> <b>网络地址转换(NAT)是一个过程,其中一个或多个本地IP地址被翻译成一个或多个全局IP地址,反之亦然,以便为本地主机提供互联网访问。
</b></details>
<details> <summary>什么是代理?它是如何工作的?我们为什么需要它?</summary> <b>代理服务器充当您和互联网之间的网关。它是一个中介服务器,将最终用户与他们浏览的网站分离开来。
如果您使用代理服务器,互联网流量将通过代理服务器传输到您请求的地址。然后,该请求再次通过相同的代理服务器返回(有一些例外情况),然后代理服务器将从网站接收到的数据转发给您。
代理服务器根据您的使用情况、需求或公司政策提供不同级别的功能、安全性和隐私保护。 </b></details>
<details> <summary>TCP 是什么?它如何工作?三次握手是什么?</summary> <b>TCP 三次握手,又称为三向握手,在 TCP/IP 网络中用于建立服务器和客户端之间的连接的过程。
三次握手主要用于创建 TCP 套接字连接。它在以下情况下起作用:
摘自 维基百科:"发送信号所需的时间加上收到信号确认所需的时间"。
附加问题:局域网的 RTT 是多少? </b></details>
<details> <summary>SSL 握手是如何进行的?</summary> <b> SSL 握手是在客户端和服务器之间建立安全连接的过程。TCP 在客户端和服务器之间建立连接,以保证数据包的顺序,而 UDP 不在客户端和服务器之间建立连接,也不处理数据包顺序。这使得 UDP 比 TCP 更轻便,是流媒体等服务的理想选择。
Penguintutor.com 提供了很好的解释。 </b></details>
<details> <summary>您熟悉哪些 TCP/IP 协议?</summary> <b> </b></details> <details> <summary>解释“默认网关”</summary> <b>默认网关是一个接入点或 IP 路由器,联网计算机利用它将信息发送到另一个网络或互联网上的计算机。 </b></details>
<details> <summary>什么是 ARP?它是如何工作的?</summary> <b>ARP 是地址解析协议(Address Resolution Protocol)的缩写。当您尝试 ping 本地网络上的一个 IP 地址(如 192.168.1.1)时,您的系统必须将 IP 地址 192.168.1.1 转换为 MAC 地址。这就需要使用 ARP 来解析该地址,ARP 也因此而得名。
系统会保存一个 ARP 查找表,其中存储了哪些 IP 地址与哪些 MAC 地址相关联的信息。当试图向某个 IP 地址发送数据包时,系统会首先查询该表,看是否已经知道该 MAC 地址。如果有缓存值,则不使用 ARP。 </b></details>
<details> <summary>什么是 TTL?它有助于防止什么?</summary> <b>它代表动态主机配置协议,为主机分配 IP 地址、子网掩码和网关。它是这样工作的:
更多信息 此处 </b></details>
<details> <summary>同一个网络中可以有两个 DHCP 服务器吗?它是如何工作的?</summary> <b>可以在同一网络上安装两个 DHCP 服务器,但不建议这样做,而且必须仔细配置,以防止冲突和配置问题。
下面介绍 SSL 隧道的工作原理:
我们应该考虑使用 IPv6 而不是 IPv4 有几个原因:
MTU 是最大传输单元(Maximum Transmission Unit)的缩写。它是指单个事务中可发送的最大 PDU(协议数据单元)的大小。 </b></details>
<details> <summary>如果发送的数据包大于 MTU,会发生什么情况?</summary> <b>在 IPv4 协议中,路由器可以对 PDU 进行分片,然后通过事务发送所有已分片的 PDU。
使用 IPv6 协议时,它会向用户计算机发出错误信息。 </b></details>
<details> <summary>真还是假?Ping 使用 UDP 是因为它不在乎连接是否可靠</summary> <b>错。Ping 实际上使用的是 ICMP(互联网控制报文协议),这是一种用于发送与网络通信有关的诊断信息和控制信息的网络协议。 </b></details>
<details> <summary>什么是 SDN?</summary> <b>ICMP消息被用于各种目的,包括:
NAT 是网络地址转换的缩写。它是一种在传输信息前将多个本地专用地址映射到一个公共地址的方法。希望多个设备使用一个 IP 地址的组织和大多数家用路由器一样,都会使用 NAT。 例如,你电脑的私有 IP 可能是 192.168.1.100,但你的路由器会将流量映射到它的公共 IP(如 1.1.1.1)。互联网上的任何设备都会看到来自公共 IP(1.1.1.1)而不是私人 IP(192.168.1.100)的流量。 </b></details>
<details> <summary>下列协议中使用的端口号分别是?有几个因素会影响网络性能,包括:
APIPA 是分配给设备的一组 IP 地址 当主 DHCP 服务器无法访问时分配给设备的 IP 地址
</b></details>
<details> <summary>APIPA 使用哪个 IP 范围?</summary> <b>APIPA 使用的 IP 范围是169.254.0.1 - 169.254.255.254.
</b></details>
控制平面是网络的一部分,它决定如何将数据包路由和转发到不同的位置。 </b></details>
<details> <summary>数据平面 "指的是什么?</summary> <b>数据平面是网络中实际转发数据/数据包的部分。 </b></details>
<details> <summary>管理平面 "指的是什么?</summary> <b>它指的是监测和管理功能。 </b></details>
<details> <summary>创建路由表属于哪个平面(数据、控制......)?</summary> <b>控制平面。 </b></details>
<details> <summary>解释生成树协议(STP)。</summary> <b> </b></details> <details> <summary>什么是链路聚合?为什么要使用?</summary> <b> </b></details> <details> <summary>什么是非对称路由?如何处理?</summary> <b> </b></details> <details> <summary>您熟悉哪些覆盖(隧道)协议?</summary> <b> </b></details> <details> <summary>什么是 GRE?它是如何运作的?</summary> <b> </b></details> <details> <summary>什么是 VXLAN?它是如何工作的?</summary> <b> </b></details> <details> <summary>什么是 SNAT?</summary> <b> </b></details> <details> <summary>解释 OSPF。</summary> <b>OSPF(开放式最短路径优先)是一种路由协议,可在各种类型的路由器上实施。一般来说,大多数现代路由器都支持 OSPF,包括思科、瞻博网络和华为等供应商的路由器。该协议设计用于基于 IP 的网络,包括 IPv4 和 IPv6。此外,它采用分层网络设计,将路由器分组为区域,每个区域都有自己的拓扑图和路由表。这种设计有助于减少路由器之间需要交换的路由信息量,提高网络的可扩展性。
OSPF 4 路由器类型有
了解有关 OSPF 路由器类型的更多信息: https://www.educba.com/ospf-router-types </b></details>
<details> <summary>什么是延迟?</summary> <b>延迟是指信息从信息源到达目的地所需的时间。 </b></details>
<details> <summary>什么是带宽?</summary> <b>带宽是通信信道的容量,用于衡量后者在特定时间段内可处理的数据量。带宽越大,意味着处理的流量越多,数据传输量也就越大。 </b></details>
<details> <summary>什么是吞吐量?</summary> <b>吞吐量是指在一定时间内通过任何传输通道传输的实际数据量。 </b></details>
<details> <summary>在进行搜索查询时,延迟和吞吐量哪个更重要?如何确保我们对全球基础设施进行管理? </summary> <b>延迟。要获得良好的延迟,搜索查询应转发到最近的数据中心。 </b></details>
<details> <summary>上传视频时,延迟和吞吐量哪个更重要?如何确保这一点?</summary> <b>吞吐量。为获得良好的吞吐量,上传数据流应被路由到未充分利用的链路。 </b></details>
<details> <summary>转发请求时还需要考虑哪些因素(除了延迟和吞吐量)?</summary> <b>当网络上需要传输的数据过多,而网络容量不足以满足需求时,就会出现网络拥塞。 </br> 这会导致延迟和数据包丢失增加。原因可能是多方面的,如网络使用率高、文件传输量大、恶意软件、硬件问题或网络设计问题。</br> 为防止网络拥塞,必须监控网络使用情况,并实施策略来限制或管理需求。 </b></details>
<details> <summary>关于 UDP 数据包格式,您能告诉我什么?TCP 数据包格式如何?有何不同?</summary> <b> </b></details> <details> <summary>什么是指数后退算法?在哪里使用?</summary> <b> </b></details> <details> <summary>使用汉明码,以下数据字 100111010001101 的码字是什么?</summary> <b>00110011110100011101 </b></details>
<details> <summary>举例说明应用层中的协议</summary> <b>阅读更多 [此处](https://www.globalsign.com/en/blog/what-is-hsts-and-how-do-i-use-it#:~:text=HTTP%20Strict%20Transport%20Security%20(HSTS,and%20back%20to%20the%20browser.) </b></details>
互联网是一个由网络组成的网络,在全球范围内传输大量数据。
万维网是一个运行在数百万服务器上的应用程序,它位于互联网之上,可通过所谓的网络浏览器访问 </b></details>
<details> <summary>什么是ISP?</summary> <b>ISP(互联网服务提供商)是当地的互联网公司。 </b></details>
<a name="devops-beginner"></a>
开发人员经常将代码集成到共享仓库中的一种开发实践。 它的范围可以从每天或每周进行几次更改,到大规模在一个小时内进行几次更改。
验证每段代码(更改/补丁),以使更改可以安全地合并。 如今,使用自动构建来确保代码可以集成的测试更改是一种常见的做法。 它可以是一个运行在不同级别(单元,功能等)的多个测试的构建,也可以是所有或某些必须通过以将更改合并到存储库中的多个单独的构建。 </b></details>
<details> <summary>什么是持续部署?</summary> <b> </b></details> <details> <summary>什么是持续交付?</summary> <b> </b></details> <details> <summary>你认为CI / CD的最佳做法是什么?</summary> <b> </b></details> <details> <summary>你将用于以下哪些系统和/或工具?:你可以使用以下一项或全部: * 成熟与尖端 * 社区规模 * 体系结构方面-代理与无代理,主控与无主控等 </b></details>
<details> <summary>解释可变基础架构与不变基础架构</summary> <b>在可变的基础架构原则中,更改将应用到现有基础架构之上并随着时间的推移而变化 基础架构建立了变化的历史。 Ansible,Puppet和Chef这些工具 遵循可变的基础架构原则。
在不变的基础架构原则中,每项更改实际上都是新的基础架构。 所以改变 到服务器将导致新服务器而不是更新服务器。 Terraform是 遵循不变的基础架构原则的一个例子。 </b></details>
<details> <summary>你熟悉什么方式来交付软件?</summary> <b> * 存档 - 将你所有的应用文件收集到一个存档中(例如tar),并将其交付给用户。 * 打包 - 取决于操作系统,你可以使用OS软件包格式(例如,在RHEL / Fefodra中为RPM)来交付软件,并使用标准打包程序命令来安装,卸载和更新它 * 映像 - VM或容器映像,其中包已包含在其中,以便成功运行。 </b></details> <details> <summary>什么是缓存? 缓存是怎么工作的? 为什么缓存很重要?</summary> <b> </b></details> <details> <summary>解释一下无状态和有状态</summary> <b> </b></details> <details> <summary>什么是HTTP及其工作方式?</summary> <b> </b></details> <details> <summary>描述一下设置某些类型的Web服务器的工作流程 (Apache, IIS, Tomact, ...)</summary> <b> </b></details> <details> <summary>解释一下监控. 它是什么? 为什么监控是重要的?</summary> <b> </b></details> <details> <summary>你熟悉那些监控方法?</summary> <b> </b></details><a name="devops-advanced"></a>
当配置和软件完全相同的服务器环境中的某个服务器上发生配置漂移 或服务器正在应用其他服务器无法获得的更新或配置,并且随着时间的推移,这些服务器将变为 略有不同。
这种情形可能会导致难以识别和重现的错误。 </b></details>
<details> <summary>怎样处理配置漂移?</summary> <b> </b></details> <details> <summary>你是否有跨项目变更测试的经验? (又名交叉依赖)</summary> <b>注意:交叉依赖是指你对单独的项目进行了两个或多个更改,并且你希望在相互构建中对其进行测试,而不是分别测试每个更改。 </b></details>
<details> <summary>在哪种情况下,你希望使用SQL?</summary> <b> * 同类数据,预计不会发生变化 * ACID合规性很重要 </b></details><a name="jenkins-beginner"></a>
</b></details>
<details> <summary>解释以下:</b></details>
<details> <summary> 你在 Jenkins 用过什么插件?</summary> <b> </b></details> <details> <summary>解释一下 CI/CD 你在 Jenkins 是怎么实现他们的 </summary> <b> </b></details> <details> <summary>有什么类型的工作? 你使用了哪些类型,为什么?</summary> <b> </b></details> <details> <summary>你如何向用户报告构建结果? 你熟悉什么那些方式?</summary> <b> </b></details> <details> <summary>每次有更改提交,你都需要运行单元测试。 详细描述管道的环境以及每个阶段将执行的操作</summary> <b> </b></details> <details> <summary>怎样保护 Jenkins?</summary> <b> </b></details> <details> <summary>你能描述一些 Jenkins 最佳实践吗?</summary> <b> </b></details><a name="jenkins-advanced"></a>
<a name="cloud-beginner"></a>
IAAS PAAS SAAS </b></details>
<details> <summary>解释一下以下云计算部署:</b></details>
<a name="aws-beginner"></a>
边缘位置基本上是内容传递网络,它缓存数据并确保较低的延迟和更快地传递给任何位置的用户。 他们位于世界主要城市。 </b>
</details>停止实例,使其实例类型与所需的RAM匹配,然后启动实例。 </b></details>
<details> <summary>什么是 AMI?</summary> <b> </b></details> <details> <summary>EC2实例有多少个存储选项?</summary> <b> </b></details> <details> <summary>EC2实例停止或终止时会发生什么?</summary> <b> </b></details> <details> <summary>什么是安全组?</summary> <b> </b></details> <details> <summary>如何将实例迁移到另一个可用性区域?</summary> <b> </b></details> <details> <summary>什么是安全组?</summary> <b> </b></details> <details> <summary>什么是竞价型实例?</summary> <b> </b></details><a name="network-beginner"></a>
应用层:用户端(HTTP在这一层) 表示层:在应用程序层实体之间建立上下文(加密在这一层) 会话层:建立,管理和终止连接 传输层:将可变长度的数据序列从源传输到目标主机(TCP和UDP在这一层) 网络层:将数据报从一个网络传输到另一个网络(IP 层在这里) 数据链接层:提供两个直接连接的节点之间的链接(MAC在这一层) 物理层:数据连接的电气和物理规格(比特在这一一层) </b></details>
<details> <summary>你熟悉哪些传送方案?</summary> <b> 单位广播:一对一通信,其中有一个发送方和一个接收方。广播:向网络中的所有人发送消息。 地址ff:ff:ff:ff:ff:ff:ff用于广播。 使用广播的两个常见协议是ARP和DHCP。
组播:向一组订户发送消息。 它可以是一对多或多对多。 </b></details>
<details> <summary>什么是 CSMA/CD? 在现代以太网中有使用吗?</summary> <b>CSMA / CD代表载波侦听多路访问/冲突检测。 它的主要重点是管理对共享媒体/总线的访问,在该共享媒体/总线上,在给定的时间点只能传输一个主机。
CSMA / CD算法:
</b></details>
<details> <summary>什么是 NAT?</summary> <b> </b></details> <details> <summary>TCP 和 UDP 两者之间有那些区别?</summary> <b> </b></details> <details> <summary>TCP 是怎样工作的? 什么是 3 次握手?</summary> <b> </b></details> <details> <summary>什么是 ARP? 它是怎么工作的?</summary> <b> </b></details> <details> <summary>什么是 TTL?</summary> <b> </b></details> <details> <summary>什么是DHCP? 它是怎么工作的?</summary> <b> </b></details> <details> <summary>什么是SSL 隧道? 它是怎么工作的?</summary> <b> </b></details> <details> <summary>什么是套接字? 在哪里可以看到系统中的套接字列表?</summary> <b> </b></details> <details> <summary>什么是IPv6? 如果我们拥有IPv4,为什么要考虑使用它?</summary> <b> </b></details> <details> <summary>什么是VLAN?</summary> <b> </b></details> <details> <summary>什么是MTU?</summary> <b> </b></details> <details> <summary>什么是SDN?</summary> <b> </b></details> <details> <summary>什么是ICMP? 它有什么用途?</summary> <b> </b></details> <details> <summary>什么是NAT? 它是怎么工作的?</summary> <b> </b></details><a name="network-advanced"></a>
00110011110100011101 </b></details>
<a name="linux-beginner"></a>
</b></details>
<details> <summary>运行命令 <code>df</code> 你会得到 "找不到命令". 可能出现什么问题以及如何修复它?</summary> <b> </b></details> <details> <summary>如何确保服务将在你选择的操作系统上启动?</summary> <b> </b></details> <details> <summary>你如何定期安排任务?</summary> <b>你能使用命令 <code>cron</code> 和 <code>at</code>. 对于cron,使用以下格式安排任务:
<minute> <hour> <day of month> <month> <day of week> <command to execute>
任务存储在cron文件中。 </b></details>
<details> <summary>你过去是否安排了任务? 什么样的任务?</summary> <b>通常,你将安排批处理作业。
</b></details>
使用 chmod 命令.
</b></details>
<details> <summary>下面的权限意味着什么?:777 - 所有人有读和写和可执行权限(意味着你很懒) 644 - 拥有者有读和写的权限、其他人只有读权限 750 - 拥有者有所有权限, 组成员可以读和执行权限、其他人没有权限 </b></details>
<details> <summary>解释一下什么是setgid, setuid 和 sticky bit</summary> <b> </b></details> <details> <summary>如何在不向其提供登录系统功能的情况下将新用户添加到系统?</summary> <b></b></details>
<details> <summary>在使用systemd的系统上,如何显示日志?</summary></b></details>
<code>dstat -t</code> 非常适合辨别网络和磁盘问题。 <code>netstat -tnlaup</code> 可用于查看哪些进程在哪些端口上运行。 <code>lsof -i -P</code> 可以用于与netstat相同的目的。 <code>ngrep -d any metafilter</code> 用于将正则表达式与数据包的载荷相匹配。 <code>tcpdump</code> 用于捕获数据包 <code>wireshark</code> 与tcpdump相同的概念,但带有GUI(可选)。 </b></details>
<details> <summary>你正在使用什么进行故障排除和调试 <b>磁盘 & 文件系统</b> 问题?</summary> <b><code>dstat -t</code> 非常适合辨别网络和磁盘问题。 <code>opensnoop</code> 可以用来查看正在系统上打开哪些文件(实时)。 </b></details>
<details> <summary>你正在使用什么进行故障排除和调试 <b>进程</b> 问题?</summary> <b><code>strace</code> 非常适合了解你的程序的功能。 它打印你的程序执行的每个系统调用。 </b></details>
<details> <summary>你正在使用什么来调试CPU相关问题?</summary> <b><code>top</code> 显示每个进程消耗多少CPU占比 <code>perf</code> 是采样分析器的理想选择,通常来说,找出哪些CPU周期被“浪费”了 <code>flamegraphs</code> 非常适合CPU消耗可视化(http://www.brendangregg.com/flamegraphs.html) </b></details>
<details> <summary>你收到一个电话,说“我的系统运行缓慢” - 你将如何处理?</summary> <b>退出码(或返回码)表示子进程返回其父进程的码。
0是退出码,表示成功,而大于1的码表示错误。 每个数字都有不同的含义,具体取决于应用程序的开发方式。
我认为这是一篇可以了解更多的好博客:https://shapeshed.com/unix-exit-codes </b></details>
<details> <summary>软链接和硬链接之间的区别是什么?</summary> <b>硬链接是使用相同inode的相同文件。 软链接是使用不同inode的另一个文件的快捷方式。
可以在不同的文件系统之间创建软链接,而硬链接只能在同一文件系统内创建。 </b></details>
<details> <summary>什么是交换分区? 它用来做什么的?</summary> <b> </b></details> <details> <summary>你试图创建一个新文件,但显示“文件系统已满”。 你使用df检查是否有可用空间,你看到还有20%的空间。 可能是什么问题?</summary> <b> </b></details> <details> <summary>你对LVM有什么了解?</summary> <b> </b></details> <details> <summary>解释以下关于LVM:</b></details>
<details> <summary>RAID用于什么用途? 你能否解释RAID 0、1、5和10之间的区别?</summary> <b> </b></details> <details> <summary>什么是懒卸载?</summary> <b> </b></details> <details> <summary>修复以下命令:</b></details>
<details> <summary>解释以下每个路径中存储的内容以及是否有一些独特之处</summary> <b>你可以通过在命令末尾指定&来实现。至于为什么,因为一些命令/过程会占用大量的时间来完成执行或永远运行 </b></details>
<details> <summary>你如何查找特定进程占用的内存量?</summary> <b> </b></details> <details> <summary>运行“ kill”时使用什么信号 <process id>'?</summary> <b>默认信号为SIGTERM(15)。 该信号可以优雅地终止进程,这意味着它可以保存当前状态配置。 </b></details>
<details> <summary>你熟悉哪些信号?</summary> <b>SIGTERM - 终止进程的默认信号 SIGHUP - 常用用法是重新加载配置 SIGKILL - 不能捕获或忽略的信号
运行 kill -l 查看所有可用的信号
</b></details>
Running(运行态) Waiting (等待态)) Stopped(暂停态) Terminated(终止态) Zombie(假死态) </b></details>
<details> <summary>什么是僵尸进程? 你是如何避免的?</summary> </b></details> <details> <summary>什么是初始进程?</summary> <b> </b></details> <details> <summary>如何更改进程的优先级? 你为什么想这么做?</summary> <b> </b></details> <details> <summary>你能解释一下网络进程/连接如何建立以及如何终止?</summary> </b> </b></details> <details> <summary>什么是系统调用? 你熟悉哪些系统调用?</summary> <b> </b></details> <details> <summary><code>strace</code> 做什么的?</summary> <b> </b></details> <details> <summary>查找所有以“ .yml”结尾的文件,并替换每个文件中的2分之一的数字</summary> <b>ind /some_dir -iname *.yml -print0 | xargs -0 -r sed -i "s/1/2/g" </b></details>
<details> <summary>如何查看系统有多少可用内存? 如何检查每个进程的内存消耗?</summary> <b>你可以使用命令<code>top</code> 和 <code>free</code> </b></details>
<details> <summary>你如何将一个50行的文件拆分为两个25行的文件?</summary> <b>你可以使用 <code>split</code> 命令就像这样<code>split -l 25 some_file</code> </b></details>
<details> <summary>什么是文件描述符? 你熟悉那些文件描述符?</summary> <b> Kerberos 文件描述符,也称为文件处理程序,是一个唯一的编号,用于标识操作系统中的打开文件。在 Linux (和 Unix) 前三个描述符是:
这有一篇好的文章关于这个主题的: https://www.computerhope.com/jargon/f/file-descriptor.htm </b></details>
<details> <summary>什么是 inode?</summary> <b>Linux中的每个文件(和目录)都有一个索引节点,即与文件相关的存储元数据信息的数据结构 ,例如文件的大小,所有者,权限等。 </b></details>
<details> <summary>如何列出活动的网络连接?</summary> <b> </b></details> <details> <summary>什么是NTP? 它是用来干什么的?</summary> <b> </b></details> <details> <summary>什么是SELiunx?</summary> <b> </b></details> <details> <summary>什么是Kerberos?</summary> <b> </b></details> <details> <summary>什么是nftables?</summary> <b> </b></details> <details> <summary>firewalld守护程序负责什么?</summary> <b> </b></details>A记录将域名指向IP地址,而PTR记录则相反,并将IP地址解析为域名。 </b></details>
<details> <summary>什么是 MX 记录?</summary> <b> </b></details> <details> <summary>DNS是使用TCP还是UDP?</summary> <b> </b></details><a name="linux-advanced"></a>
open("/my/file") = 5
read(5, "file content")
系统调用正在读 <code>/my/file</code>文件 以及 5 是文件描述符数字. </b></details>
<details> <summary>进程和线程的区别是什么?</summary> <b> </b></details>这有一些方式去做:
这有一篇好的文章关于这个主题的: https://ops.tips/blog/how-linux-creates-sockets </b></details>
<a name="ansible-beginner"></a>
任务 – 调用特定的Ansible模块 模块 – Ansible在你自己的主机或远程主机上执行的实际代码单元。 模块按类别(数据库,文件,网络等)编制索引,也称为任务插件。
Play – 在给定主机上执行的一个或多个任务
Playbook – 一个或多个Play。 每个Play可以在相同或不同的主机上执行
角色 – Ansible角色使你可以基于某些功能/服务对资源进行分组,以便可以轻松地重用它们。 在角色中,你具有变量,默认值,文件,模板,处理程序,任务和元数据的目录。 然后,你只需在剧本中指定角色即可使用该角色。 </b></details>
<details> <summary>你熟悉哪些Ansible最佳做法? 至少列出 3 条</summary> <b> </b></details> <details> <summary>什么是清单文件以及如何定义一个?</summary> <b>清单文件定义了在其上执行Ansible任务的主机和/或主机组。
一个清单文件的例子
192.168.1.2 192.168.1.3 192.168.1.4
[web_servers] 190.40.2.20 190.40.2.21 190.40.2.22 </b></details>
<details> <summary>什么是动态清单文件? 什么时候使用?</summary>动态清单文件可跟踪来自一个或多个来源(例如云提供商和CMDB系统)的主机。
应该使用当使用外部源时,尤其是在环境中的主机正在自动启动和关闭,而无需跟踪这些源中的所有更改。 </b></details>
<details> <summary>你只想在特定的次要操作系统上运行Ansible Play,你将如何实现?</summary> <b> </b></details> <details> <summary>写任务创建目录 ‘/tmp/new_directory’</summary> <b>- name: Create a new directory
file:
path: "/tmp/new_directory"
state: directory
</b></details>
<details> <summary>接下来的Play会有什么结果?</summary> <b>---
- name: Print information about my host
hosts: localhost
gather_facts: 'no'
tasks:
- name: Print hostname
debug:
msg: "It's me, {{ ansible_hostname }}"
提供完成的代码后,请始终进行彻底检查。 如果你的回答是“这将失败”,那么你是对的。 我们正在使用一个事实(ansible_hostname), 这是我们正在运行的主机上收集到的信息。 但是在这种情况下,我们禁用了事实收集(gather_facts:no),因此该变量将是未定义的,这将导致失败。 </b></details>
<details> <summary>如果系统上存在文件 "/tmp/mario",则编写 playbook 以在所有主机上安装 "zlib" 和 "vim" .</summary> <b>---
- hosts: all
vars:
mario_file: /tmp/mario
package_list:
- 'zlib'
- 'vim'
tasks:
- name: Check for mario file
stat:
path: "{{ mario_file }}"
register: mario_f
- name: Install zlib and vim if mario file exists
become: "yes"
package:
name: "{{ item }}"
state: present
with_items: "{{ package_list }}"
when: mario_f.stat.exists
</b></details>
<details> <summary>编写一个 playbook ,将文件 "/tmp/system_info" 部署到除控制器组之外的所有主机上,并具有以下内容:</summary> <b>我是 <HOSTNAME> 我的操作系统是 <OS>
替换 <HOSTNAME> 和 <OS> 以及正在运行的特定主机的实际数据 The playbook 部署system_info文件
---
- name: Deploy /tmp/system_info file
hosts: all:!controllers
tasks:
- name: Deploy /tmp/system_info
template:
src: system_info.j2
dest: /tmp/system_info
The content of the system_info.j2 template
# {{ ansible_managed }}
I'm {{ ansible_hostname }} and my operating system is {{ ansible_distribution }}
</b></details>
<details> <summary>变量 "whoami" 在以下位置定义:根据可变优先级,将使用哪个?
</summary> <b>正确的答案是 ‘toad’。
变量优先级是关于变量在不同位置设置时如何相互覆盖的。 如果你到目前为止还没有体验过,我相信你会在某个时候确定的,这使它成为一个有用的话题。
在我们的问题上下文中,顺序将是额外的var(始终覆盖任何其他变量)-> 主机事实 -> 库存变量 -> 角色默认值(最弱)。
完整的列表可以在上面的链接中找到。 另外,请注意Ansible 1.x和2.x之间存在显着差异。 </b></details>
<details> <summary>对于以下每个语句,确定对还是错:<a name="ansible-advanced"></a>
<a name="terraform-beginner"></a>
读 这里 </b></details>
<details> <summary>什么使基础架构代码受益?</summary> <b>常见的错误答案是说 Ansible 和 Puppet 是配置管理工具而 Terraform 是置备工具。 尽管从技术上讲是正确的,但这并不意味着 Ansible 和 Puppet 不能 用于配置基础结构。 另外,这根本没有解释为什么应该在 CloudFormation上 使用 Terraform。
Terraform与其他工具相比的优势:
它跟踪创建的资源的ID,以便Terraform知道它正在管理什么。 </b></details>
<details> <summary>解释以下命令的作用:<code>terraform init</code> 扫描你的代码以查明你正在使用哪些提供程序并下载它们。 <code>terraform plan</code> 可以让你在实际执行操作之前先查看terraform即将执行的操作。 <code>terraform apply</code> 将提供指定的.tf文件资源。 </b></details>
<details> <summary>如何记下一个由外部源或者通过 <code>terraform apply</code>改变的变量?</summary> <b>你用这种方式: <code>variable “my_var” {}</code> </b></details>
<details> <summary>举例说明几种Terraform最佳实践</summary> <b> </b></details> <details> <summary>解释一下隐式和显式依赖项在Terraform中如何工作</summary> <b> </b></details> <details> <summary>什么是<code>local-exec</code> and <code>remote-exec</code> in the context of provisioners?</summary> <b> </b></details> <details> <summary>什么是"tainted 资源"?</summary> <b>这是成功创建的资源,但在配置期间失败。 Terraform将失败,并将该资源标记为“tainted”。 </b></details>
<details> <summary><code>terraform taint</code> 做了什么?</summary> <b> </b></details> <details> <summary>Terraform支持哪些类型的变量?</summary> <b>Strimg Integer Map List </b></details>
<details> <summary>什么是输出变量以及 <code>terraform output</code> 做了什么?</summary> <b> </b></details> <details> <summary>解释 Modules</summary> </b></details> <details> <summary>什么是 Terraform Registry?</summary> <b> </b></details><a name="terraform-advanced"></a>
<a name="docker-beginner"></a>
容器和虚拟机之间的主要区别是容器使你可以虚拟化 操作系统上有多个工作负载,而对于VM,则将硬件虚拟化为 在多台计算机上运行各自的操作系统。 </b></details>
<details> <summary>在哪种情况下,你将使用容器,而在哪种情况下,则更喜欢使用虚拟机?</summary> <b>在以下情况下,你应该选择虚拟机: * 你需要运行一个需要操作系统所有资源和功能的应用程序 * 你需要完全隔离和安全
在以下情况下,你应该选择容器: * 你需要快速启动的轻量级解决方案 * 运行单个应用程序的多个版本或实例 </b></details>
<details> <summary>解释一下 Docker 架构</summary> <b> </b></details> <details> <summary>详细描述一下当运行`docker run hello-world`时背后发生了什么?</summary> <b>Docker CLI 将你的请求传递给Docker守护程序。 Docker 守护程序从 Docker Hub 下载映像 Docker 守护程序使用下载的映像创建一个新容器 Docker 守护程序将输出从容器重定向到 Docker CLI,后者将其重定向到标准输出 </b></details>
<details> <summary>你怎样运行容器?</summary> <b> </b></details> <details> <summary>你熟悉那些与容器相关的最佳实践?</summary> <b> </b></details> <details> <summary>`docker commit` 干什么的? 什么时候需要使用它?</summary> <b> </b></details> <details> <summary>你如何将数据从一个容器转移到另一个容器?</summary> <b> </b></details> <details> <summary>容器存在时容器的数据会发生什么?</summary> <b> </b></details> <details> <summary>解释以下每个命令的作用</b></details>
<details> <summary>如何删除未运行的旧容器?</summary> <b> </b></details>Docker Hub是一个本地 Docker 注册表服务,可让你运行 pull 和 push 命令以从 Docker Hub 安装和部署 Docker映像。
Docker Cloud构建在Docker Hub之上,因此Docker Cloud提供了 与Docker Hub相比,你拥有更多的可选/功能。 一个例子是 群管理,这意味着你可以在Docker Cloud中创建新的群。 </b></details>
<details> <summary>存储 Docker 镜像的位置在哪里?</summary> <b> </b></details> <details> <summary>解释一下镜像层</summary> <b> </b></details><a name="docker-advanced"></a>
<a name="kubernetes-beginner"></a>
<a name="coding-beginner"></a>
<a name="coding-advanced"></a>
<a name="python-beginner"></a>
1. 这是一种由 Guido Van Rosum 于1991年创建的高级通用编程语言。
2. 语言被解释为CPython(用C语言编写)最常用/维护的实现。
3. 它是强类型的。 类型系统是鸭子类型和渐进式的。
4. Python注重可读性,并使用空格/缩进代替括号{}
5. python 包管理器称为PIP“ pip install packages”,具有超过200.000可用的软件包。
6. Python 附带安装了pip和一个大的标准库,为程序员提供了许多预置的解决方案。
7. 在python中,“一切”都是一个对象。
还有许多其他特性,但这是每个python程序员都应该知道的主要特性。
</b></details>
<details> <summary>Python支持哪些数据类型,哪些是可变的? 如何显示某个数据类型是可变的?</summary> <b>可变数据类型是:
List
Dictionary
Set
不可变数据类型是:
Numbers (int, float, ...)
String
Bool
Tuple
Frozenset
通常,你可以使用函数hash()来检查对象的可变性,如果它是可哈希的,则是不可变的,尽管由于用户定义的对象可能是可变的且可哈希的,所以它并不总是按预期工作 </b></details>
<details> <summary>什么是PEP8? 举例说明3种风格指南</summary> <b>PEP8是Python的编码约定和样式指南的列表
5 种样式指南:
根据定义,继承是一种机制,其中一个对象充当另一个对象的基础,并保留其所有对象属性。
因此,如果B类继承自A类,那么A类的每个特征也将在B类中提供。A类将是“基类”,B类将是“派生类”。
当你有几个共享相同功能的类时,这很方便。
基本语法:
class Base: pass
class Derived(Base): pass
A more forged example:
class Animal:
def __init__(self):
print("and I'm alive!")
def eat(self, food):
print("ñom ñom ñom", food)
class Human(Animal):
def __init__(self, name):
print('My name is ', name)
super().__init__()
def write_poem(self):
print('Foo bar bar foo foo bar!')
class Dog(Animal):
def __init__(self, name):
print('My name is', name)
super().__init__()
def bark(self):
print('woof woof')
michael = Human('Michael')
michael.eat('Spam')
michael.write_poem()
bruno = Dog('Bruno')
bruno.eat('bone')
bruno.bark()
>>> My name is Michael
>>> and I'm alive!
>>> ñom ñom ñom Spam
>>> Foo bar bar foo foo bar!
>>> My name is Bruno
>>> and I'm alive!
>>> ñom ñom ñom bone
>>> woof woof
调用super()会调用Base方法,因此,调用super().__init__() 就是调用 Animal__init__。
有一个称为 MetaClasses 的更高级的python功能,可帮助程序员直接控制类的创建。
</b></details>
<details> <summary> 什么是一个错误? 什么是一个异常? 你熟悉哪些异常类型?</summary> <b>
# 请注意,你通常不需要了解编译过程,而只需知道一切都来自哪里
# 并给出完整的答案表明你真正知道你在说什么。
通常,每个编译过程都有两个步骤。
- 分析
- 产生代码.
Analysis can be broken into:
1. 词法分析 (标记源代码)
2. 语法分析 (如果语法正确,请检查标记是否合法,tldr)
for i in 'foo'
^
SyntaxError: invalid syntax
We missed ':'
3. 语义分析 (上下文分析,合法语法仍然会触发错误,你是否尝试过除以0,哈希可变对象或使用未声明的函数?)
1/0
ZeroDivisionError: division by zero
这三个分析步骤负责错误处理。
第二步将负责错误,主要是语法错误,这是最常见的错误。
第三步将负责异常。
如我们所见,异常是语义错误,有许多内置的异常:
ImportError
ValueError
KeyError
FileNotFoundError
IndentationError
IndexError
...
你还可以具有用户定义的异常,这些异常必须直接或间接地从Exception类继承。
常见例子:
class DividedBy2Error(Exception):
def __init__(self, message):
self.message = message
def division(dividend,divisor):
if divisor == 2:
raise DividedBy2Error('I dont want you to divide by 2!')
return dividend / divisor
division(100, 2)
>>> __main__.DividedBy2Error: I dont want you to divide by 2!
</b></details>
<details> <summary>解释 异常处理以及如何在Python中使用它</summary> <b> </b></details> <details> <summary>编写一个可以恢复字符串的程序(例如,pizza -> azzip)</summary> <b>最简单的是 str[::-1] 但不是效率最高的.
"经典" 方式:
foo = ''
for char in 'pizza':
foo = char + foo
>> 'azzip'
</b></details>
<details> <summary>编写一个函数以返回一个或多个数字的和。 用户将决定要使用多少个数字</summary> <b>首先,你询问用户要使用的数字量。 使用while循环,每个循环将amount_of_numbers减1,直到amount_of_numbers变为0。 在while循环中,你想询问用户一个数字,该数字将在每次循环运行时添加一个变量。
def return_sum():
amount_of_numbers = int(input("How many numbers? "))
total_sum = 0
while amount_of_numbers != 0:
num = int(input("Input a number. "))
total_sum += num
amount_of_numbers -= 1
return total_sum
</b></details>
<details> <summary>如何将两个排序列表合并为一个排序列表?</summary> <b> </b></details> <details> <summary> _ 在 Python 中用于什么?</summary> <b>with open('file.txt', 'w') as file:
file.write("My insightful comment")
</b></details>
<details> <summary>如何反转文件?</summary> <b> </b></details>使用 re 模式 </b></details>
<details> <summary>如何用 "blue" 替换字符串 "green"?</summary> <b> </b></details> <details> <summary>如何找到一个变量中的所有IP地址? 如何在文件中找到它们?</summary> <b> </b></details> <details> <summary>按每个嵌套列表的第二项对列表列表进行排序</summary> <b>li = [[1, 4], [2, 1], [3, 9], [4, 2], [4, 5]]
sorted(x, key=lambda l: l[1])
</b></details>
<details> <summary>你可以编写一个函数来打印给定目录中的所有文件吗? 包括子目录</summary> <b> </b></details> <details> <summary>你有下面的列表: <code>[{'name': 'Mario', 'food': ['mushrooms', 'goombas']}, {'name': 'Luigi', 'food': ['mushrooms', 'turtles']}]</code> 获取所有的食物类型,最后输出: {'mushrooms', 'goombas', 'turtles'}</summary> <b>brothers_menu = \
[{'name': 'Mario', 'food': ['mushrooms', 'goombas']}, {'name': 'Luigi', 'food': ['mushrooms', 'turtles']}]
# "经典" 方式
def get_food(brothers_menu) -> set:
temp = []
for brother in brothers_menu:
for food in brother['food']:
temp.append(food)
return set(temp)
# 一直先行方式 (Using list comprehension)
set([food for bro in x for food in bro['food']])
</b></details>
<details> <summary>什么是List 加强? 它比典型的循环更好吗? 为什么? 你能示范如何使用它吗?</summary> <b> </b></details> <details> <summary>怎样反转 string?</summary> <b>最简短的方式是: <code>my_string[::-1]</code> 但是这不是效率最高的.
经典方式是:
def reverse_string(string):
temp = ""
for char in string:
temp = char + temp
return temp
</b></details>
<details> <summary>如何按值对字典排序?</summary> <b> </b></details> <details> <summary>如何按键对字典排序?</summary> <b> </b></details> <details> <summary>解释数据序列化以及如何使用Python执行</summary> <b> </b></details> <details> <summary>你如何在Python中处理参数解析?</summary> <b> </b></details> <details> <summary>解释什么是GIL</summary> <b> </b></details> <details> <summary>什么是迭代器? 为什么使用迭代器?</summary> <b> </b></details> <details> <summary>解释以下方法的类型以及如何使用它们:</b></details>
<details> <summary>怎样反转 list?</summary> <b> </b></details> <details> <summary>空的 <code>return</code> 返回什么?</summary> <b> </b></details><a name="python-advanced"></a>
<a name="prometheus-beginner"></a>
负责抓取存储数据的Prometheus服务器推送网关用于短期作业警报管理负责警报 ;) </b></details>
<details> <summary>什么是一个实例? 什么是一个作业?</summary> <b> </b></details> <details> <summary>Prometheus支持哪些核心指标类型?</summary> <b> </b></details> <details> <summary>什么是一个 exporter? 它用来做什么?</summary> <b> </b></details> <details> <summary>你熟悉哪些Prometheus最佳做法? 至少命名三个</summary> <b> </b></details> <details> <summary>如何在给定时间内获得总请求?</summary> <b> </b></details><a name="prometheus-advanced"></a>
<a name="git-beginner"></a>
简单来说, git pull = git fetch + git merge
当你运行git pull时,它会从远程或中央获取所有更改 存储库,并将其附加到本地存储库中的相应分支。
git fetch从远程存储库获取所有更改,将更改存储在 本地存储库中的单独分支 </b></details>
<details> <summary>解释以下: <code>git 目录</code>, <code>工作目录</code> 和 <code>暂存区</code></summary> <b>Git目录是Git存储项目的元数据和对象数据库的地方。 这是Git最重要的部分,当你从另一台计算机克隆存储库时,它就是复制的。
工作目录是项目一个版本的单个签出。 这些文件将从Git目录中的压缩数据库中拉出,并放置在磁盘上供你使用或修改。
暂存区是一个简单文件,通常包含在你的Git目录中,用于存储有关下一次提交的内容的信息。 有时称为索引,但将其称为暂存区已成为标准。
答案来自 git-scm.com </b></details>
<details> <summary>怎么解决 git merge 冲突?</summary> <b> <p> 首先,打开有冲突的文件,然后确定有什么冲突。 接下来,根据你的公司或团队接受的是什么,你可以与自己的 同事解决冲突或自行解决 解决冲突后,使用 git add <file_name> 添加文件。 最后,运行`git rebase --continue`。 </p> </b></details> <details> <summary><code>git reset</code> 和 <code>git revert</code>区别是什么?</summary> <b> <p>git revert 创建一个新的提交,撤消上一次提交的更改。
git reset 根据使用情况,可以修改索引或更改分支头当前指向的提交。
使用 <code>git rebase></code> 命令 </b></details>
<details> <summary>那种情形你会使用 <code>git rebase</code>?</summary> <b> </b></details> <details> <summary>你熟悉哪些合并策略?</summary> <b>提及两个或三个就足够了,最好提到“递归”作为默认值。
recursive resolve ours theirs
这篇文章解释是最好的: https://git-scm.com/docs/merge-strategies </b></details>
<details> <summary>在提交更改之前,如何查看已完成的更改?</summary> <b><code>git diff</code> </b></details>
<details> <summary>如何将特定文件还原为先前的提交?</summary> <b>git checkout HEAD~1 -- /path/of/the/file
</b></details>
<a name="git-advanced"></a>
也许不错,它是:
有一篇文章关于 Octopus merge: http://www.freblogg.com/2016/12/git-octopus-merge.html </b></details>
<a name="go-beginner"></a>
Go 而且有一个很好的社区. </b></details>
<details> <summary><code>var x int = 2</code> 和 <code>x := 2</code>区别是什么?</summary> <b>结果相同,变量值为2。
with <code>var x int = 2</code> we are setting the variable type to integer while with <code>x := 2</code> we are letting Go figure out by itself the type. </b></details>
<details> <summary>对还是错? 在Go中,我们可以重新声明变量,并且一旦声明就必须使用它.</summary>错. 我们不能重新声明变量,必须使用声明的变量。 </b></details>
<details> <summary>你使用了哪些Go库?</summary> <b>应该根据你的使用情况回答此问题,一些示例是:
func main() {
var x float32 = 13.5
var y int
y = x
}
package main
import "fmt"
func main() {
var x int = 101
var y string
y = string(x)
fmt.Println(y)
}
它看起来在101处设置了什么unicode值,并将其用于将整数转换为字符串。 如果要获取“ 101”,则应使用“ strconv” 软件包,然后替换 <code>y = string(x)</code> with <code>y = strconv.Itoa(x)</code> </b></details>
<details> <summary>以下代码块什么是错的?:package main
func main() {
var x = 2
var y = 3
const someConst = x + y
}
package main
import "fmt"
const (
x = iota
y = iota
)
const z = iota
func main() {
fmt.Printf("%v\n", x)
fmt.Printf("%v\n", y)
fmt.Printf("%v\n", z)
}
package main
import "fmt"
const (
_ = iota + 3
x
)
func main() {
fmt.Printf("%v\n", x)
}
<a name="mongo-beginner"></a>
主要区别在于SQL数据库是结构化的(数据以带有行和列的表格-像是Excel电子表格表格),而NoSQL是 非结构化的,并且数据存储会根据NoSQL DB的设置方式而有所不同,例如 作为键值对,面向文档等 </b></details>
<details> <summary>在哪种情况下,这个查询希望使用 NoSQL/Mongo 而不是SQL?</summary> <b><a name="openshift-beginner"></a>
<a name="shell-scripting-beginner"></a>
取决于所使用的语言和设置,例如在Bash中,默认情况下,脚本将继续运行。 </b></details>
<details> <summary>今天,我们拥有Ansible之类的工具和技术。 为什么还会有人使用Shell脚本?</summary> <b> </b></details> <details> <summary>说出下面每个命令的结果是什么:</b></details>
<details> <summary>你如何调试Shell脚本?</summary> <b> </b></details> <details> <summary>如何在Shell脚本中从用户获得输入?</summary> <b> </b></details> <details> <summary>解释一下条件语句以及如何使用它们</summary> <b> </b></details> <details> <summary>什么是循环? 你熟悉哪些类型的循环?</summary> <b> </b></details> <details> <summary>解释 <code>continue</code> 和 <code>break</code>. 你什么时候使用它们?</summary> <b> </b></details> <details> <summary>如何将命令的输出存储在变量中?</summary> <b> </b></details> <details> <summary>你如何检查可变长度?</summary> <b> </b></details> <details> <summary>单引号和双引号之间的区别是什么?</summary> <b> </b></details><a name="shell-scripting-advanced"></a>
<code>:(){ :|:& };:</code>
</summary> <b> </b></details> <details> <summary>你能举一些Bash最佳实践的例子吗?</summary> <b> </b></details> <details> <summary>什么是三元运算符? 你如何在bash中使用它?</summary> <b>使用 if/else 的一种简短方法。 一个例子:
[[ $a = 1 ]] && b="yes, equal" || b="nope" </b></details>
<a name="sql-beginner"></a>
Structured Query Language(结构化查询语言)
</b></details>
<details> <summary>SQL 和 NoSQL 有那些不同</summary> <b>主要区别在于SQL数据库是结构化的(数据以 带有行和列的表格-像是Excel电子表格表格),而NoSQL是 非结构化的,并且数据存储会根据NoSQL DB的设置方式而有所不同,例如 作为键值对,面向文档等 </b></details>
<details> <summary>数据库符合ACID的含义是什么?</summary>ACID代表原子性,一致性,隔离性,耐久性。为了符合ACID,数据库必须满足四个标准中的每个标准
原子性 - 数据库发生更改时,它整体上应该成功或失败。
例如,如果你要更新表,则更新应完全执行。如果仅部分执行,则 更新被视为整体失败,并且不会通过-数据库将恢复为原始状态 更新发生之前的状态。还应该提到的是,原子性确保每个 事务以其自身的独立“单元”完成 - 如果任何部分失败,则整个语句都会失败。
一致性 - 对数据库所做的任何更改都应将其从一种有效状态转变为另一种有效状态。
例如,如果你对数据库进行了更改,则不应破坏它。通过检查和约束来保持一致性 在数据库中预定义。例如,如果你尝试将列的值从字符串更改为int 应该是数据类型字符串,一致的数据库将不允许该事务通过,并且该操作将 不执行
隔离 - 确保数据库不会被“更新中”-因为多个事务正在运行 同时,它仍应保持数据库处于与按顺序运行事务相同的状态。
例如,假设有20个人同时对数据库进行了更改。在 当你执行查询时,已完成20项更改中的15项,但仍有5项正在进行中。你应该 仅看到已完成的15个更改 - 随着更改的进行,你将看不到数据库的更新中。
耐用性 - 更改一旦提交,无论发生什么情况都将保持提交状态 (电源故障,系统崩溃等)。这意味着所有已完成的交易 必须记录在非挥发性内存中。
请注意,SQL本质上符合ACID。某些NoSQL DB可能符合ACID,具体取决于 它们的工作方式,但是根据一般经验,NoSQL DB不被视为符合ACID
</details> <details> <summary>什么时候最好使用SQL/NoSQL?</summary> <b>SQL - 当数据完整性至关重要时,最适合使用。 由于符合ACID,SQL通常由许多业务实现特别是金融领域。
NoSQL - 非常适合你需要快速扩展的情况。 请记住NoSQL是为Web应用程序设计的 ,如果你需要快速将相同信息散布到多台服务器,它将会很好的用 此外,由于 NoSQL 不遵守具有列和行结构的严格表 关系数据库所要求的,你可以将不同的数据类型存储在一起。 </b></details>
<details> <summary>什么是笛卡尔积?</summary>笛卡尔积是指第一个表中的所有行都与第二个表中的所有行连接在一起时的结果 表。 这可以通过不定义要联接的键来隐式完成,也可以通过以下方式显式地完成: 在两个表上调用CROSS JOIN,如下所示:
Select * from customers CROSS JOIN orders;
请注意,笛卡尔积也可能是一件坏事 - 执行联接时 在两个都没有唯一键的表上,这可能会导致返回信息 是不正确的。
</details>对于这些问题,我们将使用下面显示的“客户和订单”表:
Customers
| Customer_ID | Customer_Name | Items_in_cart | Cash_spent_to_Date |
|---|---|---|---|
| 100204 | John Smith | 0 | 20.00 |
| 100205 | Jane Smith | 3 | 40.00 |
| 100206 | Bobby Frank | 1 | 100.20 |
ORDERS
| Customer_ID | Order_ID | Item | Price | Date_sold |
|---|---|---|---|---|
| 100206 | A123 | Rubber Ducky | 2.20 | 2019-09-18 |
| 100206 | A123 | Bubble Bath | 8.00 | 2019-09-18 |
| 100206 | Q987 | 80-Pack TP | 90.00 | 2019-09-20 |
| 100205 | Z001 | Cat Food - Tuna Fish | 10.00 | 2019-08-05 |
| 100205 | Z001 | Cat Food - Chicken | 10.00 | 2019-08-05 |
| 100205 | Z001 | Cat Food - Beef | 10.00 | 2019-08-05 |
| 100205 | Z001 | Cat Food - Kitty quesadilla | 10.00 | 2019-08-05 |
| 100204 | X202 | Coffee | 20.00 | 2019-04-29 |
Select *
From Customers; </b></details>
<details> <summary>约翰的购物车中有几件?</summary> <b>Select Items_in_cart
From Customers
Where Customer_Name = "John Smith"; </b></details>
<details> <summary>所有客户花费的所有现金的总和是多少?</summary> <b>Select SUM(Cash_spent_to_Date) as SUM_CASH
From Customers; </b></details>
<details> <summary>在购物车有商品的有多少人?</summary> <b>Select count(1) as Number_of_People_w_items
From Customers
where Items_in_cart > 0; </b></details>
<details> <summary>你如何将客户表加入订单表?</summary> <b>你可以加入他们的唯一键。 在这种情况下,唯一键为中的Customer_ID 客户表和订单表 </b></details>
<details> <summary>你如何显示哪些客户订购了哪些物品?</summary> <b>Select c.Customer_Name, o.Item
From Customers c
Left Join Orders o
On c.Customer_ID = o.Customer_ID;
</b></details>
<a name="sql-advanced"></a>
with cat_food as (
Select Customer_ID, SUM(Price) as TOTAL_PRICE
From Orders
Where Item like "%Cat Food%"
Group by Customer_ID
)
Select Customer_name, TOTAL_PRICE
From Customers c
Inner JOIN cat_food f
ON c.Customer_ID = f.Customer_ID
where c.Customer_ID in (Select Customer_ID from cat_food);
尽管这是一个简单的声明,但“ with”子句在 在连接到另一个表之前,需要在一个表上运行一个复杂的查询。 用语句很好, 因为你在运行查询时会创建一个伪临时文件,而不是创建一个新表。
目前尚无法获得所有猫粮的总和,因此我们使用了with语句来创建 伪表检索每个客户花费的价格总和,然后正常加入该表。
</b></details>
<a name="azure-beginner"></a>
<a name="gcp-beginner"></a>
<a name="openstack-beginner"></a>
</b></details>
<details> <summary>详细描述如何使用可以从云外部访问的IP来启动实例</summary> <b> </b></details> <details> <summary>你收到客户打来的电话,说:“我可以ping我的实例,但不能连接(ssh)它”。 可能是什么问题?</summary> <b> </b></details> <details> <summary>OpenStack支持哪些类型的网络?</summary> <b> </b></details> <details> <summary>你如何调试OpenStack存储问题? (工具,日志等)</summary> <b> </b></details> <details> <summary>你如何调试OpenStack计算问题? (工具,日志等)</summary> <b> </b></details> <details> <summary>你熟悉 TripleO吗? 它有那些优点?</summary> <b> </b></details><a name="openstack-advanced"></a>
<a name="security-beginner"></a>
<a name="puppet-beginner"></a>
</b></details>
<details> <summary>解释一下Facter</summary> <b> </b></details> <details> <summary>什么是MCollective?</summary> <b> </b></details><a name="puppet-advanced"></a>
方案是没有口头回答的问题,需要你满足以下条件之一:
这些问题通常作为应聘者的一项家庭任务作为候选,可以将多个主题结合在一起。 在下面,你可以找到一些场景问题: