Ansible经典面试题有哪些(问题和答案解析)

前提
Ansible 是 Red Hat 的产品,它们具有多种功能。当我们提到 Ansible 时,我们将主要谈论 Ansible Core。所以,Ansible 是一个 IT 自动化工具。它有助于管理配置、为持续部署运行剧本、基本上简化部署以及编排不同的环境。首先设置它可能有点棘手,但我们在文档中提供了大量帮助。
基本的Ansible面试题和答案合集1.什么是CI/CD?
持续集成是用于简化开发和部署过程的东西。这些导致了内聚软件的更快开发。 
另一方面,持续交付是一个过程,你的代码在推送到远程存储库后可以随时投入生产。
在上图中,我们的集成测试和单元测试是在没有任何人工干预的情况下执行的,在 UAT 之后,我们只需要批准将我们测试的功能交付到生产中,并制作这样的过程,我们需要 CI/CD。
2. Ansible经典面试题有哪些:什么是配置管理?
Ansible面试题解析:这是我们应该遵循的一种做法,以便跟踪一段时间内进入系统的所有更新。这也有助于在由于一些新更改而将主要错误引入系统的情况下,我们需要在最短的停机时间内修复它。我们可以回滚新的更改(导致此错误),而不是修复错误,因为我们一直在跟踪这些更改。
3. Ansible 是如何工作的?
Ansible 是多个部分的组合,共同成为一个自动化工具。这些主要是模块、剧本和插件。

  • 模块是将被执行的小代码。有多个内置模块可作为构建任务的起点。
  • 剧本包含剧本,这是一组任务。这是定义工作流程或完成流程所需步骤的地方
  • 插件是在主控机器上运行的特殊类型的模块,用于记录目的。还有其他类型的插件。
这些剧本通过 Ansible 自动化引擎运行。这些剧本包含的模块基本上是在主机中运行的操作。这里遵循的机制是推送机制,因此ansible将小程序推送到这些主机,这些主机被编写为系统所需状态的资源模型。
4. Ansible 有哪些特点?
它具有以下特点:
  • 无代理——与 puppet 或 Chef 不同,没有管理节点的软件或代理。
  • Python  - 建立在Python之上,它非常容易学习和编写脚本,并且是一种强大的编程语言。
  • SSH  – 无密码网络身份验证,使其更加安全且易于设置。
  • 推送架构——核心概念是将多个小代码推送到客户端节点上配置和运行操作。
  • 设置- 这很容易设置,学习曲线非常低,并且是任何开源软件,因此任何人都可以动手操作。
  • 管理库存– 机器的地址以简单的文本格式存储,我们可以添加不同的真实来源以使用 Openstack、Rackspace 等插件来提取列表。
5. 解释基础设施即代码?
基础设施即代码或 IaC 是 DevOps 团队应该遵循的一个过程,以便以更有条理的方式管理基础设施。不是一些一次性脚本或手动配置任何云组件,应该有一个代码存储库,所有这些都将位于其中,并且配置中的任何更改都应该通过它来完成。将其置于源代码控制之下也是明智之举。这提高了速度、一致性和问责制。
6. 什么是 Ansible Galaxy?
Galaxy 是 Ansible 角色的存储库,可以在用户之间共享,也可以直接放入剧本中执行。它还用于分发包含角色、插件和模块的包,也称为集合。ansible-galaxy-collection 命令实现类似于 ansible-galaxy 命令的 init、build、install 等。
7.详细解释Ansible模块?
Ansible 模块就像函数或独立脚本,它们以幂等方式运行特定任务。这些的返回值是标准输出中的 JSON 字符串,输入取决于模块的类型。这些由 Ansible 剧本使用。
Ansible 中有两种类型的模块:
  • 核心模块
Ansible 核心团队负责维护这些模块,因此这些模块随 Ansible 本身一起提供。报告的问题优先于“额外”回购中的问题。
  • 附加模块
Ansible 社区维护这些模块,因此,目前,这些模块随 Ansible 一起提供,但将来可能会停止使用。这些可以使用,但如果有任何功能请求或问题,它们将以低优先级进行更新。
现在流行的额外模块可能随时进入核心模块。你可能会发现这些模块的这些单独存储库分别为 ansible-modules-core 和 ansible-modules-extra。
8. 什么是 YAML 文件,我们如何在 Ansible 中使用它?
YAML 或文件就像任何带有几组规则的格式化文本文件,就像 JSON 或 XML。Ansible 将此语法用于剧本,因为它比其他格式更具可读性。
JSON 与 YAML 的示例是:
{ "object": { "key": "value", "array": [ { "null_value": null }, { "boolean": true }, { "integer": 1 }, { "alias": "aliases are like variables" } ] } }

--- object: key: value array: - null_value: - boolean: true - integer: 1 - alias: aliases are like variables

9. 什么是 Ansible 任务?
任务是 Ansible 的一个单元动作。它有助于将配置策略分解为更小的文件或代码块。这些块可用于自动化流程。例如,安装软件包或更新软件
【Ansible经典面试题有哪些(问题和答案解析)】Install < package_name> , update < software_name>
10. JAVA、Python等高级编程语言如何使用YAML文件?
大多数编程语言都支持 YAML,并且可以轻松地与用户程序集成。
在 JAVA 中,我们可以使用 Jackson 模块,它也可以解析 XML 和 JSON。例如
// We need to declare Topic class with necessary attributes such as name, total_score, user_score, sub_topics List< Topic> topics = new ArrayList< Topic>(); topics.add(new Topic("String Manipulation", 10, 6)); topics.add(new Topic("Knapsack", 5, 5)); topics.add(new Topic("Sorting", 20, 13)); // We want to save this Topic in a YAML file Topic topic = new Topic("DS & Algo", 35, 24, topics); // ObjectMapper is instantiated just like before ObjectMapper om = new ObjectMapper(new YAMLFactory()); // We write the `topic` into `topic.yaml` om.writeValue(new File("/src/main/resources/topics.yaml"), topic);

--- name: "DS & Algo" total_score: 35 user_score: 24 sub_topics: - name: "String Manipulation" total_score: 10 user_score: 6 - name: "Knapsack" total_score: 5 user_score: 5 - name: "Sorting" total_score: 20 user_score: 13

同样,我们也可以从 YAML 中读取:
// Loading the YAML file from the /resources folder ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); File file = new File(classLoader.getResource("topic.yaml").getFile()); // Instantiating a new ObjectMapper as a YAMLFactory ObjectMapper om = new ObjectMapper(new YAMLFactory()); // Mapping the employee from the YAML file to the Employee class Topic topic = om.readValue(file, Topic.class);

同样在python中,我们可以使用pyyaml库,以YAML格式轻松读写。
中级Ansible面试题和答案合集11、如何设置跳转主机访问没有直接访问权限的服务器?
首先,我们需要在 ansible_ssh_common_args 库存变量中设置一个 ProxyCommand,因为在连接到相关主机时,此变量中指定的任何参数都会添加到 sftp/scp/ssh 命令行中。例如
[ gatewayed] staging1 ansible_host=10.0.2.1 staging2 ansible_host=10.0.2.2

要为这些创建跳转主机,我们需要在 ansible_ssh_common_args 中添加一个命令
ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q user@gateway.example.com"'

这样,每当我们尝试连接到网关组中的任何主机时,ansible 都会将这些参数附加到命令行。
12.Ansible经典面试题有哪些:如何使用加密文件在playbook中自动输入密码?
为了自动输入密码,我们可以有一个密码文件,用于保存加密文件的所有密码,并且 ansible 可以在需要时调用以获取这些密码。
ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q user@gateway.example.com"'

这也可以通过使用单独的脚本来指定密码来实现。但在这种情况下,我们需要将密码打印到 stdout 才能正常工作而不会出现烦人的错误。
ansible-playbook launch.yml --vault-password-file ~/ .vault_pass.py

13. Ansible 中的回调插件是什么?
Ansible面试题解析:回调插件基本上控制了我们在运行 cmd 程序时看到的大部分输出。但它也可用于添加额外的输出。例如 log_plays 回调用于将 playbook 事件记录到日志文件,而 mail 回调用于在 playbook 失败时发送电子邮件。我们还可以添加自定义回调插件,方法是将它们放入与 play 相邻的 callback_plugins 目录、角色内部,或者将其放入 ansible.cfg 中配置的回调目录源之一。
14. 什么是 Ansible Inventory 及其类型?
在 Ansible 中,有两种类型的清单文件:静态和动态。
  • 静态清单文件是在主机组下使用纯文本文件中的主机名或 IP 地址声明的托管主机列表。托管主机条目列在每行的组名下方。例如
[ gatewayed] staging1 ansible_host=10.0.2.1 staging2 ansible_host=10.0.2.2

  • 动态清单由用 Python 或任何其他编程语言编写的脚本或使用插件(最好)生成。在云设置中,静态清单文件配置将失败,因为一旦虚拟服务器停止并再次启动,IP 地址就会发生变化。我们为配置创建一个 demo_aws_ec2.yaml 文件,例如
plugin: aws_ec2 regions: ap-south-1 filters: tag:tagtype: testing

现在我们可以使用这个命令获取
ansible-inventory -i demo_aws_ec2.yaml -graph

15. 什么是 Ansible Vault?
Ansible Vault 用于保存密码等敏感数据,而不是将其作为明文放置在剧本或角色中。Ansible 可以加密任何结构化数据文件或 YAML 文件中的任何单个值。 
加密文件
ansible-vault encrypt foo.yml bar.yml baz.yml

与解密类似
ansible-vault decrypt foo.yml bar.yml baz.yml

16. 如何在模板内的组中的主机列表上进行循环?
这可以通过访问模板中的“$groups”字典来完成,如下所示:
{% for host in groups[ 'db_servers'] %} {{ host }} {% endfor %}

如果我们还需要访问事实,我们需要确保事实已经被填充。例如,一个与 db_servers 对话的剧本:
- hosts: db_servers tasks: - debug: msg="Something to debug"

现在,这可以在模板中使用,如下所示:
{% for host in groups[ 'db_servers'] %} {{ hostvars[ host][ 'ansible_eth0'][ 'ipv4'][ 'address'] }} {% endfor %}.

17. Ansible 中的 ad-hoc 命令是什么?
临时命令就像单行剧本,仅用于执行特定任务。ad-hoc 命令的语法是
ansible [ pattern] -m [ module] -a "[ module options]"

例如,我们需要重新启动暂存组中的所有服务器
ansible atlanta -a "/sbin/reboot"-u username --become [ --ask-become-pass]

18. 使用 Ansible playbook 安装 Nginx?
剧本文件将是:
- hosts: stagingwebservers gather_facts: False vars: - server_port: 8080 tasks: - name: install nginx apt: pkg=nginx state=installed update_cache=true - name: serve nginx config template: src=https://www.lsbin.com/files/flask.conf dest=/etc/nginx/conf.d/ notify: - restart nginx handlers: - name: restart nginx service: name=nginx state=restarted - name: restart flask app service: name=flask-demo state=restarted ...

在上面的剧本中,我们正在获取 stagingwebservers 组的所有主机以执行这些任务。第一个任务是安装 Nginx,然后对其进行配置。我们也拿了一个flask server作为参考。最后,我们还定义了处理程序,以便在状态发生变化时重新启动 Nginx。执行上述 playbook 后,我们可以验证是否安装了 Nginx。
ps waux | grep nginx

19. 如何以编程方式访问变量名?
可以通过将字符串相加来构建变量名。例如,如果我们需要获取任意接口的ipv4地址,其中要使用的接口可以通过角色参数或其他输入提供,我们可以通过这种方式来实现。
{{ hostvars[ inventory_hostname][ 'ansible_' + which_interface][ 'ipv4'][ 'address'] }}

20. Ansible 和 Puppet 有什么区别?
管理和调度:    在 Ansible 中,服务器将配置推送到节点,另一方面,在 puppet 中,客户端从服务器拉取配置。同样用于调度,puppet 有一个代理,每 30 分钟(默认设置)轮询一次,以确保所有节点都处于理想状态。Ansible 在免费版本中没有该功能。
可用性:  Ansible 有备份从节点,puppet 有多个主节点。所以两者都试图实现高可用性。
设置:  Puppet 被认为比 ansible 更难设置,因为它具有客户端-服务器架构,并且还有一种称为 Puppet DSL 的特定语言,它是它自己的声明性语言。
21. Ansible Tower 是什么,有什么特点?
Ansible Tower 是 RedHat 的企业级解决方案。它提供基于 Web 的控制台和 REST API 来管理组织中跨团队的 Ansible。有很多功能,例如
  • 工作流编辑器 - 我们可以在 playbook 之间设置不同的依赖关系,或者同时运行由不同团队维护的多个 playbook
  • 实时分析 - 可以轻松监控任何播放或任务的状态,我们可以检查接下来要运行的内容
  • 审计跟踪 - 跟踪日志非常重要,这样我们就可以在发生不好的事情时快速恢复到功能状态。
  • 远程执行命令 - 我们可以使用塔向我们库存中的一个主机或一组主机运行任何命令。
还有其他功能,例如作业调度、通知集成、CLI 等。
22. 解释如何将文件递归复制到目标主机上?
有一个复制模块,其中有一个递归参数,但有一种叫做同步的东西,它对大量文件更有效。 
例如:
- synchronize: src: /first/absolute/path dest: /second/absolute/path delegate_to: "{{ inventory_hostname }}"

23. 使内容可重用/可再分发的最佳方法是什么?
Ansible面试题解析:为了使内容可重用和可重新分发,可以使用 Ansible 角色。Ansible 角色基本上是组织剧本的抽象级别。例如,如果我们需要在 5 个系统上执行 10 个任务,将它们全部写入 playbook 可能会导致错误和混乱。相反,我们创建了 10 个角色并在剧本中调用它们。
24. 什么是处理程序?
处理程序就像特殊任务,只有在任务包含“通知”指令时才会运行。 
tasks: - name: install nginx apt: pkg=nginx state=installed update_cache=true notify: - start nginx handlers: - name: start nginx service: name=nginx state=started

在上面的例子中,安装 NGINX 后,我们使用 `start nginx` 处理程序启动服务器。
25. 如何为用户模块生成加密密码?
Ansible 为此提供了一个非常简单的临时命令
ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}"

我们也可以使用 Python 的 Passlib 库,例如
python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"

最重要的是,我们还应该避免将原始密码存储在 playbook 或 host_vars 中,相反,我们应该使用集成方法来生成密码的哈希版本。
26.变量的点表示法和数组表示法有什么不同?
点表示法工作正常,除非我们遇到一些特殊情况,例如
  • 如果变量包含点(.)、冒号(:)、以下划线或任何已知的公共属性开头或结尾。
  • 如果python字典的方法和属性之间存在冲突。
  • 数组符号还允许动态变量组合。
高级Ansible面试题和答案合集27. Ansible 同步模块是如何工作的?
Ansible 同步是一个类似于 Linux 机器中的 rsync 的模块,我们可以在剧本中使用它。功能与 rsync 类似,例如存档、压缩、删除等,但也有一些限制,例如
  • Rsync 必须同时安装在源系统和目标系统上
  • 需要指定 delegate_to 将源从 localhost 更改为其他端口
  • 需要处理用户权限,因为每个远程用户都可以访问文件。
  • 我们应该始终提供目标主机位置的完整路径,以防我们使用 sudo 否则文件将被复制到远程用户主目录。
  • 与硬链接相关的 Linux rsync 限制也适用于此。
  • 它强制 -delay-updates 避免在连接失败的情况下断开状态
同步模块的一个例子是
--- - hosts: host-remote tasks: - name: sync from sync_folder synchronize: src: /var/tmp/sync_folder dest: /var/tmp/

这里我们将 /var/tmp/sync_folder 文件夹的文件传输到远程机器的 /var/tmp 文件夹
28. Ansible经典面试题有哪些:Ansible firewalld 模块是如何工作的?
Ansible firewalld 用于管理主机上的防火墙规则。这就像 Linux firewalld 守护进程一样,用于允许/阻止来自端口的服务。它分为两个主要概念
  • 区域:这是我们可以控制哪些服务公开的位置或本地网络接口连接到的位置。
  • 服务:这些通常是你的主机可能正在侦听的一系列端口/协议组合(套接字),然后可以将其放置在一个或多个区域中
设置 firewalld 的几个例子是
- name: permit traffic in default zone for https service ansible.posix.firewalld: service: https permanent: yes state: enabled- name: do not permit traffic in default zone on port 8081/tcp ansible.posix.firewalld: port: 8081/tcp permanent: yes state: disabled

29. Ansible set_fact 模块与 vars、vars_file 或 include_var 有何不同?
  在 Ansible 中,set_fact 用于在逐个主机的基础上设置新的变量值,这就像由 setup 模块发现的 ansible 事实一样。这些变量可用于剧本中的后续播放。在 vars、vars_file 或 include_var 的情况下,我们事先知道值,而在使用 set_fact 时,我们可以在使用某些任务(例如使用过滤器或获取另一个变量的子部分)即时准备后存储值。我们还可以在它上面设置一个事实缓存。
set_fact 变量赋值是通过使用键对值来完成的,其中键是变量名,值是对它的赋值。一个简单的例子如下
- set_fact: one_fact: value1 second_fact: value2

30. 什么时候从变量批量设置任务参数是不安全的?
任务的所有参数都可以是字典类型的变量,这在某些动态执行场景中也很有用。但是,Ansible 会发出警告,因为它引入了安全风险。
vars: usermod_args: name: testuser state: present update_password: always tasks: - user: '{{ usermod_args }}'

在上面的示例中,传递给变量 usermod_args 的值可能会被受感染目标机器上的主机事实中的一些其他恶意值覆盖。为避免这种情况
  • 批量变量优先级应大于宿主事实。
  • 需要禁用 INJECT_FACTS_AS_VARS 配置以避免事实值与变量发生冲突。
31.解释Ansible寄存器。
Ansible面试题解析:Ansible 寄存器用于将任务执行的输出存储在变量中。当我们从每个远程主机有不同的输出时,这很有用。寄存器值在整个剧本执行过程中都是有效的,因此我们可以使用 set_fact 来操作数据并相应地为其他任务提供输入。
- hosts: all tasks: name: find all txt files in /home shell: "find /home -name *.txt" register: find_txt_files debug: var: find_txt_files

在上面的示例中,我们在远程主机的主文件夹中搜索所有 .txt 文件,然后在 find_txt_files 中捕获它并显示该变量。
32.Ansible经典面试题有哪些:我们如何在 Ansible 中委派任务?
任务委托是 Ansible 的一个重要特性,因为可能存在我们希望在一个主机上参照其他主机执行任务的用例。我们可以使用 delegate_to 关键字来做到这一点。 
例如,如果我们想管理负载均衡器池中的节点,我们可以这样做:
- hosts: webservers serial: 5 tasks: - name: Take machine out of ELB pool ansible.builtin.command: /usr/bin/take_out_of_pool {{ inventory_hostname }} delegate_to: 127.0.0.1- name: Actual steps would go here ansible.builtin.yum: name: acme-web-stack state: latest- name: Add machine back to ELB pool ansible.builtin.command: /usr/bin/add_back_to_pool {{ inventory_hostname }} delegate_to: 127.0.0.1

我们还定义了串行来控制一次执行的主机数量。还有另一种称为 local_action 的速记语法,可以用来代替 delegate_to。 
... tasks: - name: Take machine out of ELB pool local_action: ansible.builtin.command /usr/bin/take_out_of_pool {{ inventory_hostname }} ...

但也有少数例外,例如不能委派的 include、add_host 和 debug 任务。
Ansible面试题和答案合集结论33. 结论
Ansible 是自动化 IT 任务的绝佳工具,它在行业中被广泛使用,因此每个软件开发人员或 DevOps 团队中的任何人都应该了解基础知识。此外,设置非常容易,因此我们可以立即开始。这些问题涵盖了与 Ansible 相关的最重要的概念,这将有助于面试和深入理解 Ansible。
参考:
入门 — Ansible 文档 Ansible
入门 |  初学者教程@RisingStack
Ansible 白皮书 Ansible

    推荐阅读