From f893160e757e6474a35f36071b1bb6417bcdb851 Mon Sep 17 00:00:00 2001 From: Coki <92775570+HashCookie@users.noreply.github.com> Date: Wed, 12 Jun 2024 17:14:56 +0800 Subject: [PATCH 1/9] Update 1-100 lines of Chinese translation (#10210) * Update 1-100 lines of Chinese translation * update 101-688 --- README-zh_CN.md | 697 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 664 insertions(+), 33 deletions(-) diff --git a/README-zh_CN.md b/README-zh_CN.md index 878a73a40..ea24bef71 100644 --- a/README-zh_CN.md +++ b/README-zh_CN.md @@ -1,17 +1,14 @@ -# DevOps 面试问题 +

- +:information_source:  此存储库包含有关各种技术主题的问题和练习,有时与 DevOps 和 SRE 相关 -:information_source:  本仓库包含各种 DevOps 相关主题的面试问题 +:bar_chart:  当前有 **2624** 个问题 -:bar_chart:  当前有 **413** 个问题 +:warning:  您可以使用这些来准备面试,但大多数问题和练习并不代表实际的面试。请阅读[常见问题](faq.md)了解更多详情 +:page_facing_up:  不同的面试官专注于不同的事情。 有些人将重点放在你的简历上,而另一些人可能将重点放在方案问题或特定的技术问题上。 在这个仓库,我尽力覆盖各种类型的 DevOps 问题,供你练习和测试你的知识 -:warning:  你不需要知道回答这个仓库的所有问题。 DevOps并不是知道一切:) - -:page_facing_up:  不同的面试官专注于不同的事情。 有些人将重点放在你的简历上,而另一些人可能将重点放在方案问题或特定的技术问题上。 在这个仓库,我尽力覆盖各种类型的DevOps问题,供你练习和测试你的知识 - -:pencil:  你可以通过PR来添加更多问题和答案:) +:pencil:  你可以通过提交拉取请求来添加更多练习:) 在[此处](CONTRIBUTING.md)阅读贡献指南 **** @@ -21,41 +18,675 @@
- - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DevOps
DevOps

初级
高级
Jenkins
Jenkins

初级
高级
Git
Git

初级
高级
Ansible
Ansible

初级
高级
Network
Network

初级
高级
Linux
Linux

初级
高级
Terraform
Terraform

初级
高级
Docker
Docker

初级
高级
DevOps
DevOps
Git
Git
Network
Network
Hardware
Hardware
kubernetes
Kubernetes
programming
Software Development
Python
Python
go
Go
perl
Perl
RegEx
Regex
Cloud
Cloud
aws
AWS
azure
Azure
Google Cloud Platform
Google Cloud Platform
openstack
OpenStack
Operating System
Operating System
Linux
Linux
Virtualization
Virtualization
DNS
DNS
Bash
Shell Scripting
Databases
Databases
sql
SQL
Mongo
Mongo
Testing
Testing
Big Data
Big Data
coding
Coding

初级
高级
Python
Python

初级
高级
Go
Go

初级
Bash
Shell Scripting

初级
高级
kubernetes
Kubernetes

初级
Prometheus
Prometheus

初级
高级
Mongo
Mongo

初级
sql
SQL

初级
高级
cicd
CI/CD
Certificates
Certificates
Containers
Containers
OpenShift
OpenShift
Storage
Storage
Cloud
Cloud

初级
AWS
AWS

初级
azure
Azure

初级
gcp
Google Cloud Platform

初级
openstack
OpenStack

初级
高级
security
Security

初级
puppet
Puppet

初级
高级
OpenShift
OpenShift

初级
Terraform
Terraform
puppet
Puppet
Distributed
Distributed
you
Questions you can ask
ansible
Ansible
observability
Observability
Prometheus
Prometheus
Circle CI
Circle CI
DataDog
Grafana
Grafana
Argo
Argo
HR
Soft Skills
security
Security
Design
System Design
Chaos Engineering
Chaos Engineering
Misc
Misc
Elastic
Elastic
Kafka
Kafka
+## 网络 + +
+一般来说,你需要什么才能进行交流?
+ + - 一种共同的语言(供两端理解) + - 与你想要沟通的人交流的方法 + - 一个连接(以便通信内容能够到达接收者) + +
+ +
+什么是 TCP/IP?
+ +一组协议,定义了两个或多个设备如何相互通信。 + +了解更多关于TCP/IP, 阅读 [这里](http://www.penguintutor.com/linux/basic-network-reference) + +
+ +
+什么是以太网?
+ +以太网简单地指的是当今最常见的局域网(LAN)类型。与跨越较大地理区域的广域网(WAN)相对,LAN是一个连接在小范围内的计算机网络,比如你的办公室、大学校园或者家庭。 + +
+ +
+什么是 MAC 地址?它有什么用途?
+ +MAC地址是用于识别网络上各个设备的唯一标识号码或代码。 + +通过以太网发送的数据包始终来自一个 MAC 地址并发送到一个 MAC 地址。如果网络适配器接收到一个数据包,它会将该数据包的目标 MAC 地址与适配器自身的 MAC 地址进行比较。 + +
+ +
+这个 MAC 地址是在什么时候使用的?: ff:ff:ff:ff:ff:ff
+ +当设备向广播 MAC 地址(FF:FF:FF:FF:FF:FF)发送数据包时,它会传递给本地网络上的所有站点。以太网广播用于在数据链路层通过 ARP 解析 IP 地址到 MAC 地址。 +
+ +
+什么是 IP 地址?
+ +互联网协议地址(IP 地址)是分配给连接到使用互联网协议进行通信的计算机网络上的每个设备的数字标签。IP地址具有两个主要功能:主机或网络接口识别和位置寻址。 +
+ +
+解释子网掩码并举例说明
+ +子网掩码是一个32位的数字,用于屏蔽 IP 地址并将 IP 地址分为网络地址和主机地址。子网掩码通过将网络位设置为全部"1",将主机位设置为全部"0"来生成。在给定的网络中,总可用主机地址中始终保留两个用于特定目的,并且不能分配给任何主机。这些是第一个地址,被保留作为网络地址(也称为网络 ID),以及最后一个用于网络广播的地址。 + +[例子](https://github.com/philemonnwanne/projects/tree/main/exercises/exe-09) + +
+ +
+私有 IP 地址是什么?在哪些场景/系统设计中应该使用它?
+私有IP地址被分配给同一网络中的主机,以便彼此通信。正如“私有”这个名字所暗示的那样,拥有私有IP地址的设备无法被来自任何外部网络的设备访问到。例如,如果我住在一个宿舍,并且我希望我的室友们加入我托管的游戏服务器,我会要求他们通过我的服务器的私有IP地址加入,因为该网络是局域网。 +
+ +
+什么是公共 IP 地址?在哪些场景/系统设计中,应该使用它?
+公共IP地址是面向公众的 IP 地址。如果你正在托管一个游戏服务器,希望你的朋友加入,你会给他们提供你的公共IP地址,以便他们的计算机能够识别和定位到你的网络和服务器,从而进行连接。在与与您连接到同一网络的朋友玩耍时,并不需要使用面向公众的IP地址,在这种情况下,您将使用私有IP地址。为了使某人能够连接到内部位置的服务器上,您需要设置端口转发来告诉路由器允许来自公共域名和网络之间的流量通信。 +
+ +
+解释 OSI 模型。有哪几层?每层负责什么?
+ +- 应用程序:用户端( HTTP 在此)。 +- 演示:建立应用层实体之间的上下文(加密在这里)。 +- 会话:建立、管理和终止连接。 +- 传输:将可变长度的数据序列从源主机传输到目标主机( TCP 和 UDP 在此)。 +- 网络:将数据报从一个网络传输到另一个网络( IP 在此)。 +- 数据链路:提供两个直接连接的节点之间的链接(MAC在此)。 +- 物理特性:数据连接的电气和物理规格(位数在此)。 + +您可以在 [penguintutor.com](http://www.penguintutor.com/linux/basic-network-reference) 阅读有关OSI模型的更多信息。 +
+ +
+对于以下每个确定其属于哪个 OSI 层: + + * 错误更正 + * 数据包路由 + * 电缆和电信号 + * MAC 地址 + * IP 地址 + * 终止连接 + * 3 次握手
+ * 错误纠正 - 数据链路 + * 数据包路由 - 网络 + * 电缆和电信号 - 物理 + * MAC 地址 - 数据链路 + * IP 地址 - 网络 + * 终止连接 - 会话 + * 3次握手 - 传输 +
+ +
+你熟悉哪些交付计划?
+ +单播:一对一的通信,其中有一个发送者和一个接收者。 + +广播:向网络中的所有人发送消息。地址 ff:ff:ff:ff:ff:ff 用于广播。 + 使用广播的两个常见协议是 ARP 和 DHCP。 + +多播:向一组订阅者发送消息。它可以是一对多或多对多的。 +
+ +
+什么是 CSMA/CD?它在现代以太网网络中使用吗?
+ +CSMA/CD 代表载波侦听多路访问冲突检测。 +其主要目标是管理对共享介质/总线的访问,每次只有一个主机可以传输。 + +CSMA/CD 算法: + +1. 在发送帧之前,它会检查是否有另一个主机正在传输帧。 +2. 如果没有人在传输,它就开始传输帧。 +3. 如果两个主机同时传输,就会发生碰撞。 +4. 两个主机都停止发送帧,并向所有人发送一个“干扰信号”,通知大家发生了碰撞。 +5. 他们正在等待一个随机的时间再次发送它。 +6. 一旦每个主机等待了随机时间,它们会再次尝试发送帧,从而重新开始循环。 +
+ +
+描述以下网络设备及其之间的区别: + + * 路由器 + * 交换机 + * 集线器
+ +路由器、交换机和集线器都是用于连接局域网(LAN)中的设备的网络设备。然而,每个设备的操作方式不同,并且具有其特定的使用情况。以下是对每个设备及其之间区别的简要描述: + +1. 路由器:一种网络设备,用于连接多个网络段。它在OSI模型的网络层(第3层)上运行,并使用路由协议来指导网络之间的数据传输。路由器使用IP地址来识别设备并将数据包定向到正确的目标位置。 +2. 交换机:一种网络设备,用于连接局域网上的多个设备。它在OSI模型的数据链路层(第二层)工作,并使用MAC地址来识别设备并将数据包定向到正确的目标。交换机可以使同一网络上的设备更高效地相互通信,并且可以防止多个设备同时发送数据时可能发生的数据碰撞。 +3. 集线器:一种网络设备,通过单根电缆连接多个设备,并用于在不分割网络的情况下连接多个设备。然而,与交换机不同的是,它在OSI模型的物理层(第1层)上运行,并且只是将数据包广播到所有连接到它的设备,无论该设备是否为预期接收者。这意味着可能会发生数据碰撞,并且网络效率可能因此受到影响。由于交换机更高效并提供更好的网络性能,所以现代网络设置通常不使用集线器。 +
+ +
+什么是“冲突域”?
+冲突域是一个网络段,在这个网络段中,设备可能会因为试图同时传输数据而相互干扰。当两个设备同时传输数据时,可能会发生碰撞,导致数据丢失或损坏。在冲突域中,所有设备共享同样的带宽,并且任何设备都有可能干扰其他设备的数据传输。 +
+ +
+什么是“广播域”?
+广播域是一个网络段,其中所有设备可以通过发送广播消息相互通信。广播消息是一条发送给网络中所有设备而不是特定设备的消息。在广播域中,所有设备都可以接收和处理广播消息,无论该消息是否针对它们。 +
+ +
+连接到一个交换机的三台计算机。有多少个冲突域?有多少个广播域?
+ +三个冲突域和一个广播域 +
+ +
+路由器是如何工作的?
+ +路由器是一种物理或虚拟设备,用于在两个或多个分组交换的计算机网络之间传递信息。路由器检查给定数据包的目标互联网协议地址(IP地址),计算它到达目的地的最佳路径,然后相应地转发它。 + +
+ +
+什么是NAT?
+ +网络地址转换(NAT)是一个过程,其中一个或多个本地IP地址被翻译成一个或多个全局IP地址,反之亦然,以便为本地主机提供互联网访问。 + +
+ +
+什么是代理?它是如何工作的?我们为什么需要它?
+ +代理服务器充当您和互联网之间的网关。它是一个中介服务器,将最终用户与他们浏览的网站分离开来。 + +如果您使用代理服务器,互联网流量将通过代理服务器传输到您请求的地址。然后,该请求再次通过相同的代理服务器返回(有一些例外情况),然后代理服务器将从网站接收到的数据转发给您。 + +代理服务器根据您的使用情况、需求或公司政策提供不同级别的功能、安全性和隐私保护。 +
+ +
+TCP 是什么?它如何工作?三次握手是什么?
+ +TCP 三次握手,又称为三向握手,在 TCP/IP 网络中用于建立服务器和客户端之间的连接的过程。 + +三次握手主要用于创建 TCP 套接字连接。它在以下情况下起作用: + +- 一个客户节点通过IP网络向同一网络或外部网络上的服务器发送SYN数据包。该数据包的目标是询问/推断服务器是否对新连接开放。 +- 目标服务器必须具有可以接受和发起新连接的开放端口。当服务器从客户节点收到SYN数据包时,它会响应并返回确认收据 - ACK 数据包或 SYN/ACK 数据包。 +- 客户端节点接收到来自服务器的 SYN/ACK,并用一个 ACK数据包作出响应。 +
+ +
+什么是往返延迟或往返时间?
+ +摘自 [维基百科](https://en.wikipedia.org/wiki/Round-trip_delay):"发送信号所需的时间加上收到信号确认所需的时间"。 + +附加问题:局域网的 RTT 是多少? +
+ +
+SSL 握手是如何进行的?
+SSL 握手是在客户端和服务器之间建立安全连接的过程。 + +1. 客户端向服务器发送一个Client Hello消息,其中包括客户端的SSL/TLS协议版本、客户端支持的加密算法列表和一个随机值。 +2. 服务器响应一个Server Hello消息,其中包括服务器的SSL/TLS协议版本、一个随机值和会话ID。 +3. 服务器发送一个证书消息,其中包含了服务器的证书。 +4. 服务器发送 Server Hello Done 信息,表示服务器已完成服务器 Hello 阶段的信息发送。 +5. 客户发送包含客户公钥的客户密钥交换信息。 +6. 客户端发送 "更改密码规格 "报文,通知服务器客户端即将发送使用新密码规格加密的报文。 +7. 客户端发送一个加密的握手消息,其中包含使用服务器的公钥加密的预主密钥。 +8. 服务器发送 "更改密码规格 "信息,通知客户端服务器即将发送使用新密码规格加密的信息。 +9. 服务器发送加密握手信息,其中包含用客户机公钥加密的预主密钥。 +10. 客户端和服务器现在可以交换应用数据。 +
+ +
+TCP 和 UDP 有什么区别?
+ +TCP 在客户端和服务器之间建立连接,以保证数据包的顺序,而 UDP 不在客户端和服务器之间建立连接,也不处理数据包顺序。这使得 UDP 比 TCP 更轻便,是流媒体等服务的理想选择。 + +[Penguintutor.com](http://www.penguintutor.com/linux/basic-network-reference) 提供了很好的解释。 +
+ +
+您熟悉哪些 TCP/IP 协议?
+
+ +
+解释“默认网关”
+ +默认网关是一个接入点或 IP 路由器,联网计算机利用它将信息发送到另一个网络或互联网上的计算机。 +
+ +
+什么是 ARP?它是如何工作的?
+ +ARP 是地址解析协议(Address Resolution Protocol)的缩写。当您尝试 ping 本地网络上的一个 IP 地址(如 192.168.1.1)时,您的系统必须将 IP 地址 192.168.1.1 转换为 MAC 地址。这就需要使用 ARP 来解析该地址,ARP 也因此而得名。 + +系统会保存一个 ARP 查找表,其中存储了哪些 IP 地址与哪些 MAC 地址相关联的信息。当试图向某个 IP 地址发送数据包时,系统会首先查询该表,看是否已经知道该 MAC 地址。如果有缓存值,则不使用 ARP。 +
+ +
+什么是 TTL?它有助于防止什么?
+ +- TTL(生存时间)是IP(Internet Protocol,互联网协议)数据包中的一个值,它决定了在被丢弃之前数据包可以经过多少跳或路由器。每次通过路由器转发数据包时,TTL值会减少一。当TTL值达到零时,数据包将被丢弃,并向发送方发送ICMP(Internet Control Message Protocol,互联网控制消息协议)消息以指示该数据包已过期。 +- TTL 用于防止数据包在网络中无限循环,否则会造成拥塞并降低网络性能。 +- 它还有助于防止数据包陷入路由环路,即数据包在同一组路由器之间不断往返而永远无法到达目的地。 +- 此外,TTL 还可用于帮助检测和防止 IP 欺骗攻击,在这种攻击中,攻击者试图通过使用虚假或伪造的 IP 地址来冒充网络上的其他设备。通过限制数据包的跳数,TTL 可以帮助防止数据包被路由到不合法的目的地。 +
+ +
+什么是 DHCP?它是如何工作的?
+ +它代表动态主机配置协议,为主机分配 IP 地址、子网掩码和网关。它是这样工作的: + +* 主机在进入网络时广播一条寻找 DHCP 服务器的信息(DHCP DISCOVER)。 +* DHCP 服务器会以数据包的形式发回要约信息,其中包含租用时间、子网掩码、IP 地址等信息(DHCP OFFER)。 +* 根据接受的提议,客户端会发送回复广播,让所有 DHCP 服务器都知道(DHCP 请求)。 +* 服务器发送确认(DHCP ACK) + +更多信息 [此处](https://linuxjourney.com/lesson/dhcp-overview) +
+ +
+同一个网络中可以有两个 DHCP 服务器吗?它是如何工作的?
+ +可以在同一网络上安装两个 DHCP 服务器,但不建议这样做,而且必须仔细配置,以防止冲突和配置问题。 +- 在同一网络上配置两个 DHCP 服务器时,两个服务器都有可能为同一设备分配 IP 地址和其他网络配置设置,从而导致冲突和连接问题。此外,如果 DHCP 服务器配置了不同的网络设置或选项,网络上的设备可能会收到冲突或不一致的配置设置。 +- 不过,在某些情况下,可能有必要在同一网络中设置两个 DHCP 服务器,例如在大型网络中,一个 DHCP 服务器可能无法处理所有请求。在这种情况下,可以将 DHCP 服务器配置为不同的 IP 地址范围或不同的子网,这样它们就不会相互干扰。 +
+ +
+什么是 SSL 隧道?它是如何工作的?
+ +- SSL(安全套接字层)隧道是一种技术,用于在互联网等不安全网络上的两个端点之间建立安全的加密连接。SSL 隧道是通过将流量封装在 SSL 连接中创建的,SSL 连接可提供保密性、完整性和身份验证。 + +下面介绍 SSL 隧道的工作原理: + +1. 客户端启动与服务器的 SSL 连接,其中包括建立 SSL 会话的握手过程。 +2. SSL 会话建立后,客户端和服务器会协商加密参数,如加密算法和密钥长度,然后交换数字证书,以验证彼此的身份。 +3. 客户端随后通过 SSL 隧道将流量发送到服务器,服务器解密流量并将其转发到目标位置。 +4. 服务器通过 SSL 隧道将流量发送回客户端,客户端对流量进行解密并将其转发给应用程序。 +
+ +
+什么是套接字?在哪里可以看到系统中的套接字列表?
+ +- 套接字是一种软件端点,可使进程之间通过网络进行双向通信。套接字为网络通信提供了一个标准化接口,允许应用程序在网络上发送和接收数据。查看 Linux 系统上打开的套接字列表: +***netstat -an*** +- 该命令显示所有打开套接字的列表,以及它们的协议、本地地址、外来地址和状态。 +
+ +
+什么是 IPv6?如果我们有 IPv4,为什么还要考虑使用它?
+ +- IPv6(互联网协议版本 6)是互联网协议(IP)的最新版本,用于识别网络上的设备并与之通信。IPv6 地址是 128 位地址,用十六进制表示,如 2001:0db8:85a3:0000:0000:8a2e:0370:7334。 + +我们应该考虑使用 IPv6 而不是 IPv4 有几个原因: + +1. 地址空间:IPv4 的地址空间有限,在世界上许多地方已经耗尽。IPv6 提供了更大的地址空间,可提供数万亿个唯一的 IP 地址。 +2. 安全性:IPv6 包含对 IPsec 的内置支持,为网络流量提供端到端加密和身份验证。 +3. 性能:IPv6 包括一些有助于提高网络性能的功能,例如组播路由,它允许将一个数据包同时发送到多个目的地。 +4. 简化网络配置:IPv6 包含可简化网络配置的功能,例如无状态自动配置,它允许设备自动配置自己的 IPv6 地址,而无需 DHCP 服务器。 +5. 更好的移动性支持:IPv6 包含可改进移动性支持的功能,如移动 IPv6,它允许设备在不同网络之间移动时保持其 IPv6 地址。 +
+ +
+什么是 VLAN?
+ +- VLAN(虚拟局域网)是一种逻辑网络,它将物理网络上的一组设备组合在一起,而不管它们的物理位置如何。创建 VLAN 的方法是配置网络交换机,为连接到交换机上特定端口或端口组的设备发送的帧分配特定的 VLAN ID。 +
+ +
+什么是 MTU?
+ +MTU 是最大传输单元(Maximum Transmission Unit)的缩写。它是指单个事务中可发送的最大 PDU(协议数据单元)的大小。 +
+ +
+如果发送的数据包大于 MTU,会发生什么情况?
+ +在 IPv4 协议中,路由器可以对 PDU 进行分片,然后通过事务发送所有已分片的 PDU。 + +使用 IPv6 协议时,它会向用户计算机发出错误信息。 +
+ +
+真还是假?Ping 使用 UDP 是因为它不在乎连接是否可靠
+ +错。Ping 实际上使用的是 ICMP(互联网控制报文协议),这是一种用于发送与网络通信有关的诊断信息和控制信息的网络协议。 +
+ +
+什么是 SDN?
+ +- SDN 是软件定义网络(Software-Defined Networking)的缩写。它是一种网络管理方法,强调网络控制的集中化,使管理员能够通过软件抽象来管理网络行为。 +- 在传统网络中,路由器、交换机和防火墙等网络设备需要使用专用软件或命令行界面进行单独配置和管理。相比之下,SDN 将网络控制平面与数据平面分开,允许管理员通过集中式软件控制器管理网络行为。 +
+ +
+什么是 ICMP?它有什么用途?
+ +- ICMP 是 Internet Control Message Protocol 的缩写。它是 IP 网络中用于诊断和控制的协议。它是互联网协议套件的一部分,在网络层运行。 + +ICMP消息被用于各种目的,包括: +1. 错误报告:ICMP消息用于报告网络中发生的错误,例如无法将数据包传递到其目的地。 +2. Ping:ICMP 用于发送 ping 信息,该信息用于测试主机或网络是否可连接,并测量数据包的往返时间。 +3. 路径 MTU 发现:ICMP 用于发现路径的最大传输单元(MTU),即无需分片即可传输的最大数据包大小。 +4. 跟踪路由跟踪路由实用程序使用 ICMP 跟踪数据包通过网络的路径。 +5. 路由器发现ICMP 用于发现网络中的路由器。 +
+ +
+什么是 NAT?它是如何工作的?
+ +NAT 是网络地址转换的缩写。它是一种在传输信息前将多个本地专用地址映射到一个公共地址的方法。希望多个设备使用一个 IP 地址的组织和大多数家用路由器一样,都会使用 NAT。 +例如,你电脑的私有 IP 可能是 192.168.1.100,但你的路由器会将流量映射到它的公共 IP(如 1.1.1.1)。互联网上的任何设备都会看到来自公共 IP(1.1.1.1)而不是私人 IP(192.168.1.100)的流量。 +
+ +
+下列协议中使用的端口号分别是? + + * SSH + * SMTP + * HTTP + * DNS + * HTTPS + * FTP + * SFTP +
+ + * SSH - 22 + * SMTP - 25 + * HTTP - 80 + * DNS - 53 + * HTTPS - 443 + * FTP - 21 + * SFTP - 22 +
+ +
+哪些因素会影响网络性能?
+ +有几个因素会影响网络性能,包括: + +1. 带宽:网络连接的可用带宽会极大地影响其性能。带宽有限的网络可能会出现数据传输速率慢、延迟高和响应速度差等问题。 +2. 延迟:延迟是指数据从网络中的一个点传输到另一个点时发生的延迟。高延迟会导致网络性能缓慢,尤其是视频会议和在线游戏等实时应用。 +3. 网络拥塞:当太多设备同时使用网络时,就会出现网络拥塞,导致数据传输速率缓慢和网络性能低下。 +4. 数据包丢失:当数据包在传输过程中丢失时,就会出现丢包现象。这会导致网络速度变慢,整体网络性能降低。 +5. 网络拓扑:网络的物理布局,包括交换机、路由器和其他网络设备的位置,都会影响网络性能。 +6. 网络协议:不同的网络协议具有不同的性能特征,会影响网络性能。例如,TCP 是一种可靠的协议,可以保证数据的传输,但也会因错误检查和重传所需的开销而导致性能降低。 +7. 网络安全:防火墙和加密等安全措施会影响网络性能,尤其是在需要大量处理能力或引入额外延迟的情况下。 +8. 距离:网络设备之间的物理距离会影响网络性能,尤其是无线网络,信号强度和干扰会影响连接性和数据传输速率。 +
+ +
+什么是 APIPA?
+ +APIPA 是分配给设备的一组 IP 地址 +当主 DHCP 服务器无法访问时分配给设备的 IP 地址 + +
+ +
+APIPA 使用哪个 IP 范围?
+ +APIPA 使用的 IP 范围是169.254.0.1 - 169.254.255.254. + +
+ +#### 控制平面和数据平面 + +
+"控制平面"是指什么?
+ +控制平面是网络的一部分,它决定如何将数据包路由和转发到不同的位置。 +
+ +
+数据平面 "指的是什么?
+ +数据平面是网络中实际转发数据/数据包的部分。 +
+ +
+管理平面 "指的是什么?
+ +它指的是监测和管理功能。 +
+ +
+创建路由表属于哪个平面(数据、控制......)?
+ +控制平面。 +
+ +
+解释生成树协议(STP)。
+
+ +
+什么是链路聚合?为什么要使用?
+
+ +
+什么是非对称路由?如何处理?
+
+ +
+您熟悉哪些覆盖(隧道)协议?
+
+ +
+什么是 GRE?它是如何运作的?
+
+ +
+什么是 VXLAN?它是如何工作的?
+
+ +
+什么是 SNAT?
+
+ +
+解释 OSPF。
+ + +OSPF(开放式最短路径优先)是一种路由协议,可在各种类型的路由器上实施。一般来说,大多数现代路由器都支持 OSPF,包括思科、瞻博网络和华为等供应商的路由器。该协议设计用于基于 IP 的网络,包括 IPv4 和 IPv6。此外,它采用分层网络设计,将路由器分组为区域,每个区域都有自己的拓扑图和路由表。这种设计有助于减少路由器之间需要交换的路由信息量,提高网络的可扩展性。 + +OSPF 4 路由器类型有 + * Internal Router + * Area Border Routers + * Autonomous Systems Boundary Routers + * Backbone Routers + + 了解有关 OSPF 路由器类型的更多信息: https://www.educba.com/ospf-router-types +
+ +
+什么是延迟?
+ +延迟是指信息从信息源到达目的地所需的时间。 +
+ +
+什么是带宽?
+ +带宽是通信信道的容量,用于衡量后者在特定时间段内可处理的数据量。带宽越大,意味着处理的流量越多,数据传输量也就越大。 +
+ +
+什么是吞吐量?
+ +吞吐量是指在一定时间内通过任何传输通道传输的实际数据量。 +
+ +
+在进行搜索查询时,延迟和吞吐量哪个更重要?如何确保我们对全球基础设施进行管理? +
+ +延迟。要获得良好的延迟,搜索查询应转发到最近的数据中心。 +
+ +
+上传视频时,延迟和吞吐量哪个更重要?如何确保这一点?
+ +吞吐量。为获得良好的吞吐量,上传数据流应被路由到未充分利用的链路。 +
+ +
+转发请求时还需要考虑哪些因素(除了延迟和吞吐量)?
+ +* 保持缓存更新(这意味着请求可能不会被转发到最近的数据中心) +
+ +
+解释 Spine & Leaf
+
+ +
+什么是网络拥塞?什么原因会导致网络拥塞?
+ +当网络上需要传输的数据过多,而网络容量不足以满足需求时,就会出现网络拥塞。
+这会导致延迟和数据包丢失增加。原因可能是多方面的,如网络使用率高、文件传输量大、恶意软件、硬件问题或网络设计问题。
+为防止网络拥塞,必须监控网络使用情况,并实施策略来限制或管理需求。 +
+ +
+关于 UDP 数据包格式,您能告诉我什么?TCP 数据包格式如何?有何不同?
+
+ +
+什么是指数后退算法?在哪里使用?
+
+ +
+使用汉明码,以下数据字 100111010001101 的码字是什么?
+ +00110011110100011101 +
+ +
+举例说明应用层中的协议
+ +* 超文本传输协议(HTTP)--用于互联网上的网页 +* 简单邮件传输协议(SMTP)--用于电子邮件传输 +* 电信网络(TELNET)--终端模拟,允许客户端访问 telnet 服务器 +* 文件传输协议(FTP)--便于在任何两台机器之间传输文件 +* 域名系统 (DNS) - 域名转换 +* 动态主机配置协议(DHCP)--为主机分配 IP 地址、子网掩码和网关 +* 简单网络管理协议(SNMP)--收集网络设备数据 +
+ +
+举例说明网络层中的协议
+ +* 互联网协议 (IP) - 协助将数据包从一台机器路由到另一台机器 +* 互联网控制消息协议(ICMP)--让人知道发生了什么,如错误信息和调试信息 +
+ +
+什么是 HSTS?
+HTTP 严格传输安全(HTTP Strict Transport Security)是一种网络服务器指令,它通过在开始时发送并返回给浏览器的响应标头,告知用户代理和网络浏览器如何处理其连接。这将强制通过 HTTPS 加密连接,忽略任何脚本通过 HTTP 加载该域中任何资源的调用。 + +阅读更多 [此处](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.) +
+ +#### 网络 - 其他 + +
+什么是互联网?它和万维网一样吗?
+ +互联网是一个由网络组成的网络,在全球范围内传输大量数据。
+万维网是一个运行在数百万服务器上的应用程序,它位于互联网之上,可通过所谓的网络浏览器访问 +
+ +
+什么是ISP?
+ +ISP(互联网服务提供商)是当地的互联网公司。 +
+ ## DevOps From afacd3885f680d2d01c9d0f4f5fdf3fe3c7b1464 Mon Sep 17 00:00:00 2001 From: Ali <115415312+xogoodnow@users.noreply.github.com> Date: Wed, 12 Jun 2024 12:46:52 +0330 Subject: [PATCH 2/9] Update README.md on Ceph section (#10220) 1. The "What is the workflow of retrieving data from Ceph?" question was repeated twice. 2. Added the question "What is the workflow of writing data to Ceph?" 3. There was no answer on the workflow on writeing/reading data. They have been added --- README.md | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 16f3f630d..a881cdb2d 100644 --- a/README.md +++ b/README.md @@ -3953,10 +3953,31 @@ True
What is the workflow of retrieving data from Ceph?
+The work flow is as follows: + +1. The client sends a request to the ceph cluster to retrieve data: +> **Client could be any of the following** +>> * Ceph Block Device +>> * Ceph Object Gateway +>> * Any third party ceph client + + +2. The client retrieves the latest cluster map from the Ceph Monitor +3. The client uses the CRUSH algorithm to map the object to a placement group. The placement group is then assigned to a OSD. +4. Once the placement group and the OSD Daemon are determined, the client can retrieve the data from the appropriate OSD + +
-What is the workflow of retrieving data from Ceph?
+What is the workflow of writing data to Ceph?
+The work flow is as follows: + +1. The client sends a request to the ceph cluster to retrieve data +2. The client retrieves the latest cluster map from the Ceph Monitor +3. The client uses the CRUSH algorithm to map the object to a placement group. The placement group is then assigned to a Ceph OSD Daemon dynamically. +4. The client sends the data to the primary OSD of the determined placement group. If the data is stored in an erasure-coded pool, the primary OSD is responsible for encoding the object into data chunks and coding chunks, and distributing them to the other OSDs. +
From df28b9bdb9290f6196a7e678d26d68b64d6459c7 Mon Sep 17 00:00:00 2001 From: Amogha Kancharla <133768988+amoghakancharla@users.noreply.github.com> Date: Wed, 12 Jun 2024 14:47:19 +0530 Subject: [PATCH 3/9] Update README.md (#10224) Fixed some errors and typos. Co-authored-by: Amogha Kancharla <133768988+amoghak-ds@users.noreply.github.com> --- topics/aws/README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/topics/aws/README.md b/topics/aws/README.md index c17d49305..d8d9ce2e2 100644 --- a/topics/aws/README.md +++ b/topics/aws/README.md @@ -1,8 +1,8 @@ # AWS -**Note**: Some of the exercises cost $$$ and can't be performed using the free tier/resources +**Note**: Some of the exercises cost $$$ and can't be performed using the free tier or resources -**2nd Note**: Provided solutions are using the AWS console. It's recommended you'll use IaC technologies to solve the exercises (e.g. Terraform, Pulumi).
+**2nd Note**: The provided solutions are using the AWS console. It's recommended you use IaC technologies to solve the exercises (e.g., Terraform, Pulumi).
- [AWS](#aws) - [Exercises](#exercises) @@ -10,7 +10,7 @@ - [EC2](#ec2) - [S3](#s3) - [ELB](#elb) - - [Auto Scaling Groups](#auto-scaling-groups) + - [Auto Scaling Groups] (#auto-scaling-groups) - [VPC](#vpc) - [Databases](#databases) - [DNS](#dns) @@ -24,14 +24,14 @@ - [Global Infrastructure](#global-infrastructure) - [IAM](#iam-1) - [EC2](#ec2-1) - - [AMI](#ami) - - [EBS](#ebs) - - [Instance Store](#instance-store) - - [EFS](#efs) - - [Pricing Models](#pricing-models) - - [Launch Template](#launch-template) - - [ENI](#eni) - - [Placement Groups](#placement-groups) + - [AMI](#ami) + - [EBS](#ebs) + - [Instance Store](#instance-store) + - [EFS](#efs) + - [Pricing Models](#pricing-models) + - [Launch Template](#launch-template) + - [ENI](#eni) + - [Placement Groups](#placement-groups) - [VPC](#vpc-1) - [Default VPC](#default-vpc) - [Lambda](#lambda-1) @@ -63,7 +63,7 @@ - [SNS](#sns) - [Monitoring and Logging](#monitoring-and-logging) - [Billing and Support](#billing-and-support) - - [AWS Organizations](#aws-organizations) + - [AWS Organizations](#aws-organizations) - [Automation](#automation) - [Misc](#misc-2) - [High Availability](#high-availability) @@ -3485,6 +3485,6 @@ More details are missing to determine for sure but it might be better to decoupl
What's an ARN?
-ARN (Amazon Resources Names) used for uniquely identifying different AWS resources. -It is used when you would like to identify resource uniqely across all AWS infra. +ARN (Amazon Resources Names) are used for uniquely identifying different AWS resources. +It is used when you would like to identify resource uniqely across all AWS infrastructures.
From e58a9ccd73197df87e7fad59f9298743a9d14258 Mon Sep 17 00:00:00 2001 From: Adarsh Date: Wed, 12 Jun 2024 14:47:49 +0530 Subject: [PATCH 4/9] chore: added aws s3 event triggering script (#10255) --- scripts/aws s3 event triggering/README.md | 1 + .../aws_s3_event_trigger.sh | 122 ++++++++++++++++++ .../s3-lambda/requirements.txt | 1 + .../s3-lambda/s3-lambda.py | 38 ++++++ scripts/aws s3 event triggering/sample.png | Bin 0 -> 80667 bytes 5 files changed, 162 insertions(+) create mode 100644 scripts/aws s3 event triggering/README.md create mode 100644 scripts/aws s3 event triggering/aws_s3_event_trigger.sh create mode 100644 scripts/aws s3 event triggering/s3-lambda/requirements.txt create mode 100644 scripts/aws s3 event triggering/s3-lambda/s3-lambda.py create mode 100644 scripts/aws s3 event triggering/sample.png diff --git a/scripts/aws s3 event triggering/README.md b/scripts/aws s3 event triggering/README.md new file mode 100644 index 000000000..de9ef00f9 --- /dev/null +++ b/scripts/aws s3 event triggering/README.md @@ -0,0 +1 @@ +[](./sample.png) diff --git a/scripts/aws s3 event triggering/aws_s3_event_trigger.sh b/scripts/aws s3 event triggering/aws_s3_event_trigger.sh new file mode 100644 index 000000000..1e6f275c5 --- /dev/null +++ b/scripts/aws s3 event triggering/aws_s3_event_trigger.sh @@ -0,0 +1,122 @@ +#!/bin/bash + +# always put up the detail of scripts . version, author, what it does, what event triggers and all .. + +### +# Author: Adarsh Rawat +# Version: 1.0.0 +# Objective: Automate Notification for a object uploaded or created in s3 bucket. +### + +# debug what is happening +set -x + +# all these cmds are aws cli commands | abhishek veermalla day 4-5 devops + +# store aws account id in a variable +aws_account_id=$(aws sts get-caller-identity --query 'Account' --output text) + +# print the account id from the variable +echo "aws account id: $aws_account_id" + +# set aws region, bucket name and other variables +aws_region="us-east-1" +aws_bucket="s3-lambda-event-trigger-bucket" +aws_lambda="s3-lambda-function-1" +aws_role="s3-lambda-sns" +email_address="adarshrawat8304@gmail.com" + +# create iam role for the project +role_response=$(aws iam create-role --role-name s3-lambda-sns --assume-role-policy-document '{ + "Version": "2012-10-17", + "Statement": [{ + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": [ + "lambda.amazonaws.com", + "s3.amazonaws.com", + "sns.amazonaws.com" + ] + } + }] +}') + +# jq is json parser here parse the role we created + +# extract the role arn from json resposne and store in variable +role_arn=$(echo "$role_response" | jq -r '.Role.Arn') + +# print the role arn +echo "Role ARN: $role_arn" + +# attach permissions to the role +aws iam attach-role-policy --role-name $aws_role --policy-arn arn:aws:iam::aws:policy/AWSLambda_FullAccess +aws iam attach-role-policy --role-name $aws_role --policy-arn arn:aws:iam::aws:policy/AmazonSNSFullAccess + +# create s3 bucket and get the output in a variable +bucket_output=$(aws s3api create-bucket --bucket "$aws_bucket" --region "$aws_region") + +# print the output from the variable +echo "bucket output: $bucket_output" + +# upload a file to the bucket +aws s3 cp ./sample.png s3://"$aws_bucket"/sample.png + +# create a zip file to upload lambda function +zip -r s3-lambda.zip ./s3-lambda + +sleep 5 + +# create a lambda function +aws lambda create-function \ + --region $aws_region \ + --function $aws_lambda \ + --runtime "python3.8" \ + --handler "s3-lambda/s3-lambda.lambda_handler" \ + --memory-size 128 \ + --timeout 30 \ + --role "arn:aws:iam::$aws_account_id:role/$aws_role" \ + --zip-file "fileb://./s3-lambda.zip" + +# add permissions to s3 bucket to invoke lambda +LambdaFunctionArn="arn:aws:lambda:us-east-1:$aws_account_id:function:s3-lambda" +aws s3api put-bucket-notification-configuration \ + --region "$aws_region" \ + --bucket "$aws_bucket" \ + --notification-configuration '{ + "LambdaFunctionConfigurations": [{ + "LambdaFunctionArn": "'"$LambdaFunctionArn"'", + "Events": ["s3:ObjectCreated:*"] + }] +}' + +aws s3api put-bucket-notification-configuration \ + --region "$aws_region" \ + --bucket "$aws_bucket" \ + --notification-configuration '{ + "LambdaFunctionConfigurations": [{ + "LambdaFunctionArn": "'"$LambdaFunctionArn"'", + "Events": ["s3:ObjectCreated:*"] + }] +}' + +# create an sns topic and save the topic arn to a variable +topic_arn=$(aws sns create-topic --name s3-lambda-sns --output json | jq -r '.TopicArn') + +# print the topic arn +echo "SNS Topic ARN: $topic_arn" + +# Trigger SNS topic using lambda function + +# Add sns topic using lambda function +aws sns subscribe \ + --topic-arn "$topic_arn" \ + --protocol email \ + --notification-endpoint "$email_address" + +# publish sns +aws sns publish \ + --topic-arn "$topic_arn" \ + --subject "A new object created in s3 bucket" \ + --message "Hey, a new data object just got delievered into the s3 bucket $aws_bucket" diff --git a/scripts/aws s3 event triggering/s3-lambda/requirements.txt b/scripts/aws s3 event triggering/s3-lambda/requirements.txt new file mode 100644 index 000000000..58bd758fb --- /dev/null +++ b/scripts/aws s3 event triggering/s3-lambda/requirements.txt @@ -0,0 +1 @@ +boto3==1.17.95 \ No newline at end of file diff --git a/scripts/aws s3 event triggering/s3-lambda/s3-lambda.py b/scripts/aws s3 event triggering/s3-lambda/s3-lambda.py new file mode 100644 index 000000000..0fab7aa84 --- /dev/null +++ b/scripts/aws s3 event triggering/s3-lambda/s3-lambda.py @@ -0,0 +1,38 @@ +import boto3 +import json + +def lambda_handler(event, context): + + # i want to know that event thing + print(event) + + # extract relevant information from the s3 event trigger + bucket_name=event['Records'][0]['s3']['bucket']['name'] + object_key=event['Records'][0]['s3']['object']['key'] + + # perform desired operations with the upload file + print(f"File '{object_key}' was uploaded to bucket '{bucket_name}'") + + # example: send a notification via sns + sns_client=boto3.client('sns') + topic_arn='arn:aws:sns:us-east-1::s3-lambda-sns' + sns_client.publish( + TopicArn=topic_arn, + Subject='s3 object created !!', + Message=f"File '{object_key}' was uploaded to bucket '{bucket_name}" + ) + + # Example: Trigger another Lambda function + # lambda_client = boto3.client('lambda') + # target_function_name = 'my-another-lambda-function' + # lambda_client.invoke( + # FunctionName=target_function_name, + # InvocationType='Event', + # Payload=json.dumps({'bucket_name': bucket_name, 'object_key': object_key}) + # ) + # in case of queuing and other objective similar to the netflix flow of triggering + + return { + 'statusCode': 200, + 'body': json.dumps("Lambda function executed successfully !!") + } diff --git a/scripts/aws s3 event triggering/sample.png b/scripts/aws s3 event triggering/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..c260ba505edc89598711126b18bd317021cbe070 GIT binary patch literal 80667 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 t$(oM*S~r;ge|7YUS~Hse Date: Wed, 12 Jun 2024 14:48:01 +0530 Subject: [PATCH 5/9] topics/linux/README.md is modified (#10256) * topics/linux/README.md is modified * topics/linux/README.md is modified --- topics/linux/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/topics/linux/README.md b/topics/linux/README.md index 92e3cac74..cb27b83c3 100644 --- a/topics/linux/README.md +++ b/topics/linux/README.md @@ -360,6 +360,7 @@ It contains useful information about the processes that are currently running, i

What makes /proc different from other filesystems?
+/proc is a special virtual filesystem in Unix-like operating systems, including Linux, that provides information about processes and system resources.
\ No newline at end of file From 4863152cef6abef11b9c4ee53f2cb7b9925fb046 Mon Sep 17 00:00:00 2001 From: Emanuel Baptista Haine <42074564+emanuelhaine@users.noreply.github.com> Date: Sat, 31 Aug 2024 05:14:13 -0300 Subject: [PATCH 7/9] Adjusting URL for AWS Cloud Practitioner exam (#10324) Co-authored-by: Emanuel Baptista Haine --- certificates/aws-cloud-practitioner.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/certificates/aws-cloud-practitioner.md b/certificates/aws-cloud-practitioner.md index 7e72b631e..80f70ecb5 100644 --- a/certificates/aws-cloud-practitioner.md +++ b/certificates/aws-cloud-practitioner.md @@ -1,6 +1,6 @@ ## AWS - Cloud Practitioner -A summary of what you need to know for the exam can be found [here](https://codingshell.com/aws-cloud-practitioner) +A summary of what you need to know for the exam can be found [here](https://aws.amazon.com/certification/certified-cloud-practitioner/) #### Cloud 101 From 193c4302d6b76c99c9c15f7ecef616ba600eb51a Mon Sep 17 00:00:00 2001 From: Chris Schindlbeck Date: Sat, 31 Aug 2024 10:14:29 +0200 Subject: [PATCH 8/9] Updated Terraform: Missing answer, clarified some questions, removed duplicate, fixed typos (#10323) --- topics/terraform/README.md | 92 +++++++++++-------- .../exercises/s3_bucket_rename/exercise.md | 4 +- .../exercises/s3_bucket_rename/solution.md | 22 ++++- 3 files changed, 74 insertions(+), 44 deletions(-) diff --git a/topics/terraform/README.md b/topics/terraform/README.md index 1f01fd5bd..c656baa77 100644 --- a/topics/terraform/README.md +++ b/topics/terraform/README.md @@ -1,4 +1,4 @@ -# Terraform +# Terraform - [Terraform](#terraform) - [Exercises](#exercises) @@ -71,7 +71,7 @@ - Full automation: In the past, resource creation, modification and removal were handled manually or by using a set of tooling. With Terraform or other IaC technologies, you manage the full lifecycle in an automated fashion.
- Modular and Reusable: Code that you write for certain purposes can be used and assembled in different ways. You can write code to create resources on a public cloud and it can be shared with other teams who can also use it in their account on the same (or different) cloud>
- Improved testing: Concepts like CI can be easily applied on IaC based projects and code snippets. This allow you to test and verify operations beforehand -- +-
@@ -433,6 +434,10 @@ Its a bit that only allows the owner or the root user to delete or modify the fi
What is sudo? How do you set it up?
+sudo is a command-line utility in Unix-like operating systems that allows users to run programs with the privileges of another user, usually the superuser (root). It stands for "superuser do. + +The sudo program is installed by default in almost all Linux distributions. If you need to install sudo in Debian/Ubuntu, use the command apt-get install sudo +
From 4efd1339f0544673747c9b6fa210aa620e11faed Mon Sep 17 00:00:00 2001 From: Reuben D'Souza <46090211+reubenjds@users.noreply.github.com> Date: Sat, 31 Aug 2024 04:14:00 -0400 Subject: [PATCH 6/9] add horizontal scaling and vertical scaling (#10468) * add horizontal scaling and vertical scaling * fix: keep original formatting * fix: keep original formatting * fix block --- topics/cloud/README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/topics/cloud/README.md b/topics/cloud/README.md index c56cca66c..af139ce0b 100644 --- a/topics/cloud/README.md +++ b/topics/cloud/README.md @@ -91,6 +91,16 @@ AWS definition: "AWS Auto Scaling monitors your applications and automatically a Read more about auto scaling [here](https://aws.amazon.com/autoscaling)
+
+What is the difference between horizontal scaling and vertical scaling?
+ +[AWS Docs](https://wa.aws.amazon.com/wellarchitected/2020-07-02T19-33-23/wat.concept.horizontal-scaling.en.html): + +A "horizontally scalable" system is one that can increase capacity by adding more computers to the system. This is in contrast to a "vertically scalable" system, which is constrained to running its processes on only one computer; in such systems the only way to increase performance is to add more resources into one computer in the form of faster (or more) CPUs, memory or storage. + +Horizontally scalable systems are oftentimes able to outperform vertically scalable systems by enabling parallel execution of workloads and distributing those across many different computers. +
+
True or False? Auto Scaling is about adding resources (such as instances) and not about removing resource
@@ -105,4 +115,4 @@ False. Auto scaling adjusts capacity and this can mean removing some resources b * Instance should have minimal permissions needed. You don't want an instance-level incident to become an account-level incident * Instances should be accessed through load balancers or bastion hosts. In other words, they should be off the internet (in a private subnet behind a NAT). * Using latest OS images with your instances (or at least apply latest patches) -
+
@@ -80,7 +80,7 @@ - Declarative: Terraform uses the declarative approach (rather than the procedural one) in order to define end-status of the resources - No agents: as opposed to other technologies (e.g. Puppet) where you use a model of agent and server, with Terraform you use the different APIs (of clouds, services, etc.) to perform the operations - Community: Terraform has strong community who constantly publishes modules and fixes when needed. This ensures there is good modules maintenance and users can get support quite quickly at any point -- +-
@@ -186,7 +186,7 @@ Run `terraform apply`. That will apply the changes described in your .tf files. A user should be careful with this command because there is no way to revert it. Sure, you can always run again "apply" but that can take time, generates completely new resources, etc.
-### Dependencies +### Dependencies
Sometimes you need to reference some resources in the same or separate .tf file. Why and how it's done?
@@ -201,7 +201,7 @@ In your AWS instance it would like that: ``` resource "aws_instance" "some-instance" { - + ami = "some-ami" instance_type = "t2.micro" vpc_security_group_ids = [aws_security_group.instance.id] @@ -215,7 +215,7 @@ resource "aws_instance" "some-instance" { Yes, when there is a dependency between different Terraform resources, you want the resources to be created in the right order and this is exactly what Terraform does. -To make it ever more clear, if you have a resource X that references the ID of resource Y, it doesn't makes sense to create first resource X because it won't have any ID to get from a resource that wasn't created yet. +To make it ever more clear, if you have a resource X that references the ID of resource Y, it doesn't makes sense to create first resource X because it won't have any ID to get from a resource that wasn't created yet.
@@ -237,7 +237,7 @@ The output is in DOT - A graph description language.
Where can you find publicly available providers?
-In the [Terraform Registry](https://registry.terraform.io/browse/providers) +In the [Terraform Registry](https://registry.terraform.io/browse/providers)
@@ -419,10 +419,10 @@ True - The file `terraform.tfvars` - Environment variable - Using `-var` or `-var-file` - + According to variable precedence, which source will be used first?
-The order is: +Terraform loads variables in the following order, with later sources taking precedence over earlier ones: - Environment variable - The file `terraform.tfvars` @@ -487,9 +487,9 @@ You have multiple hardcoded values that repeat themselves in different sections, ``` variable "app_id" { - type = string + type = string description = "The id of application" - default = "some_value" + default = "some_value" } ``` @@ -638,7 +638,7 @@ data "aws_vpc" "default { } ``` -You can retrieve the ID attribute this way: `data.aws_vpc.default.id` +You can retrieve the ID attribute this way: `data.aws_vpc.default.id`
@@ -716,6 +716,9 @@ Since a provisioner can run a variety of actions, it's not always feasible to pl
What is local-exec and remote-exec in the context of provisioners?
+ +local-exec provisioners run commands on the machine where Terraform is executed, while remote-exec provisioners run commands on the remote resource. +
@@ -747,11 +750,6 @@ There are quite a few cases you might need to use them: Output variables are named values that are sourced from the attributes of a module. They are stored in terraform state, and can be used by other modules through remote_state
-
-Explain remote-exec and local-exec
-
- -
Explain "Remote State". When would you use it and how?
Terraform generates a `terraform.tfstate` json file that describes components/service provisioned on the specified provider. Remote @@ -833,7 +831,7 @@ There is more than one answer to this question. It's very much depends on whethe - tfstate contains credentials in plain text. You don't want to put it in publicly shared location - tfstate shouldn't be modified concurrently so putting it in a shared location available for everyone with "write" permissions might lead to issues. (Terraform remote state doesn't has this problem). - tfstate is an important file. As such, it might be better to put it in a location that has regular backups and good security. - + As such, tfstate shouldn't be stored in git repositories. secured storage such as secured buckets, is a better option.
@@ -855,7 +853,7 @@ In general, storing state file on your computer isn't a problem. It starts to be - Don't edit it manually. tfstate was designed to be manipulated by terraform and not by users directly. - Store it in secured location (since it can include credentials and sensitive data in general) - - Backup it regularly so you can roll-back easily when needed + - Backup it regularly so you can roll-back easily when needed - Store it in remote shared storage. This is especially needed when working in a team and the state can be updated by any of the team members - Enabled versioning if the storage where you store the state file, supports it. Versioning is great for backups and roll-backs in case of an issue. @@ -902,7 +900,7 @@ Let's say we chose use Amazon s3 as a remote Terraform backend where we can stor 4. Block public access 5. Handle locking. One way is to add DB for it 6. Add the point you'll want to run init and apply commands to avoid an issue where you at the same time create the resources for remote backend and also switch to a remote backend -7. Once resources were created, add Terraform backend code +7. Once resources were created, add Terraform backend code ``` terraform { @@ -911,7 +909,7 @@ terraform { } } ``` -7. Run `teraform init` as it will configure the backend +7. Run `terraform init` as it will configure the backend
@@ -1044,14 +1042,25 @@ resource "some_resource" "some_name" {
-You have a list variable called "users". How to access the second item in that list and attribute called "name"?
+You have a list variable called "users" with an object containing a name attribute like this:
+ +``` +variable "users" { + type = list(object({ + name = string + age = number + })) +} +``` + +How to access the name attribute of the second item in that list?

`users[1].name`
-You have a list variable called "users". How to access attribute "name" of all items?
+Given the same list, how to access attribute "name" of all items?
`users[*].name` @@ -1139,7 +1148,7 @@ resource "aws_iam_user" "user" { ``` resource “google_compute_instance” “instances” { - + for_each = var.names_map name = each.value } @@ -1147,11 +1156,11 @@ resource “google_compute_instance” “instances” {
-The following resource tries to use for_each loop on a list of string but it fails, why? +The following resource tries to use for_each loop on a list of strings but it fails, why? ``` resource “google_compute_instance” “instances” { - + for_each = var.names name = each.value } @@ -1261,11 +1270,11 @@ output "name_and_age" {
-You have a map variable, called "users", with the keys "name" (string) and "age" (float). Define an output map variable with the key being name in uppercase and value being age in the closest whole number
+You have a map variable, called "users", with the keys "name" (string) and "age" (number). Define an output map variable with the key being name in uppercase and value being age in the closest whole number
``` output "name_and_age" { - value = {for name, age in var.users : upper(name) => floor(age) + value = {for name, age in var.users : upper(name) => floor(age) } ``` @@ -1357,7 +1366,7 @@ Renders a template file and returns the result as string.
You are trying to use templatefile as part of a module and you use a relative path to load a file but sometimes it fails, especially when others try to reuse the module. How can you deal with that?
-Switch relative paths with what is known as path references. These are fixes paths like module root path, module expression file path, etc. +Switch relative paths with what is known as path references. These are fixes: paths like module root path, module expression file path, etc.
@@ -1387,7 +1396,7 @@ False. terraform console is ready-only.
Explain what depends_on used for and given an example
-`depends_on` used to create a dependency between resources in Terraform. For example, there is an application you would like to deploy in a cluster. If the cluster isn't ready (and also managed by Terraform of course) then you can't deploy the app. In this case, you will define "depends_on" in the app configuration and its value will be the cluster resource. +`depends_on` used to create an explicit dependency between resources in Terraform. For example, there is an application you would like to deploy in a cluster. If the cluster isn't ready (and also managed by Terraform of course) then you can't deploy the app. In this case, you will define "depends_on" in the app configuration and its value will be the cluster resource.
@@ -1490,7 +1499,7 @@ module "amazing_module" {
What should be done every time you modify the source parameter of a module?
-`terraform init` should be executed as it takes care of downloading and installing the module from the new path. +`terraform get -update` should be executed as it takes care of downloading and installing the module from the new path.
@@ -1550,9 +1559,11 @@ It's does NOT create the definitions/configuration for creating such infrastruct You have a Git repository with Terraform files but no .gitignore. What would you add to a .gitignore file in Terraform repository?
``` -.terraform +**/.terraform/* *.tfstate -*.tfstate.backup +*.tfstate.* +*.tfvars +*.tfvars.json ``` You don't want to store state file nor any downloaded providers in .terraform directory. It also doesn't makes sense to share/store the state backup files. @@ -1562,17 +1573,18 @@ You don't want to store state file nor any downloaded providers in .terraform di ### AWS
-What happens if you update user_data in the following case apply the changes? +What happens if you update user_data in the following case and apply the changes? ``` resource "aws_instance" "example" { ami = "..." instance_type = "t2.micro" -user_data = <<-EOF - #!/bin/bash - echo "Hello, World" > index.xhtml - EOF + user_data = <<-EOF + #!/bin/bash + echo "Hello, World" > index.xhtml + EOF +} ```
@@ -1703,7 +1715,7 @@ provider "aws" { ```

-It's not secure! you should never store credentials in plain text this way. +It's not secure! you should never store credentials in plain text this way.
@@ -1787,7 +1799,7 @@ terraform_project/ Each environment has its own backend (as you don't want to use the same authentication and access controls for all environments) -Going further, under each environment you'll separate between comoponents, applications and services +Going further, under each environment you'll separate between components, applications and services ``` diff --git a/topics/terraform/exercises/s3_bucket_rename/exercise.md b/topics/terraform/exercises/s3_bucket_rename/exercise.md index b3a8a4bb0..f2d92dd6f 100644 --- a/topics/terraform/exercises/s3_bucket_rename/exercise.md +++ b/topics/terraform/exercises/s3_bucket_rename/exercise.md @@ -11,10 +11,12 @@ resource "aws_s3_bucket" "some_bucket" { } ``` +Attention: Since S3 buckets are globally unique, you will likely have to rename the bucket as someone else might have named it that way already. + ## Objectives 1. Rename an existing S3 bucket and make sure it's still tracked by Terraform ## Solution -Click [here to view the solution](solution.md) \ No newline at end of file +Click [here to view the solution](solution.md) diff --git a/topics/terraform/exercises/s3_bucket_rename/solution.md b/topics/terraform/exercises/s3_bucket_rename/solution.md index c7ecaf437..622328be0 100644 --- a/topics/terraform/exercises/s3_bucket_rename/solution.md +++ b/topics/terraform/exercises/s3_bucket_rename/solution.md @@ -11,6 +11,8 @@ resource "aws_s3_bucket" "some_bucket" { } ``` +Attention: Since S3 buckets are globally unique, you will likely have to rename the bucket as someone else might have named it that way already. + ## Objectives 1. Rename an existing S3 bucket and make sure it's still tracked by Terraform @@ -24,10 +26,12 @@ aws s3 mb s3://some-new-bucket-123 # Sync old bucket to new bucket aws s3 sync s3://some-old-bucket s3://some-new-bucket-123 -# Remove the old bucket from Terraform's state +# Option 1 (remove and import) + +## Remove the old bucket from Terraform's state terraform state rm aws_s3_bucket.some_bucket -# Import new bucket to Terraform's state +## Import new bucket to Terraform's state terraform import aws_s3_bucket.some_bucket some-new-bucket-123 : ' @@ -38,6 +42,18 @@ The resources that were imported are shown above. These resources are now in your Terraform state and will henceforth be managed by Terraform. ' +# Option 2 (move) + +## Move the old bucket from Terraform's state to the new one +terraform state mv aws_s3_bucket.some_bucket some-new-bucket-123 + +: ' +Move "aws_s3_bucket.some_bucket" to "aws_s3_bucket.some-new-bucket-123" +Successfully moved 1 object(s). +' + +# Modify Terraform file + # Modify the Terraform definition to include the new name # resource "aws_s3_bucket" "some_bucket" { # bucket = "some-new-bucket-123" @@ -46,4 +62,4 @@ your Terraform state and will henceforth be managed by Terraform. # Remove old bucket aws s3 rm s3://some-old-bucket --recursive aws s3 rb s3://some-old-bucket -``` \ No newline at end of file +``` From a70d8aab6ac7490da2640461be148462778cfcda Mon Sep 17 00:00:00 2001 From: Raza Rafaideen Date: Sat, 31 Aug 2024 09:15:03 +0100 Subject: [PATCH 9/9] Answer Linux (#10311) Answer : You executed a script and while still running, it got accidentally removed. Is it possible to restore the script while it's still running? --- topics/linux/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/topics/linux/README.md b/topics/linux/README.md index cb27b83c3..800d61e2c 100644 --- a/topics/linux/README.md +++ b/topics/linux/README.md @@ -2143,6 +2143,20 @@ This is a good article about the topic: https://ops.tips/blog/how-linux-creates-
You executed a script and while still running, it got accidentally removed. Is it possible to restore the script while it's still running?
+It is possible to restore a script while it's still running if it has been accidentally removed. The running script process still has the code in memory. You can use the /proc filesystem to retrieve the content of the running script. +1.Find the Process ID by running +``` +ps aux | grep yourscriptname.sh +``` +Replace yourscriptname.sh with your script name. +2.Once you have the PID, you can access the script's memory through the /proc filesystem. The script will be available at /proc//fd/, where is the process ID of the running script. Typically, the script's file descriptor is 0 or 1. + +You can copy the script content to a new file using the cp command: +``` +cp /proc//fd/0 /path_to_restore_your_file/yourscriptname.sh +``` +Replace with the actual PID of the script and /path_to_restore_your_file/yourscriptname.sh with the path where you want to restore the script. +