运维面试题库之Ansible
本文是ansible相关的面试题,有些题目事例摘抄自互联网。
基础知识
Q: Ansible 是什么?它的核心组件是什么?
A: Ansible 是一种自动化工具,用于配置和管理计算机系统。其核心组件包括 Ansible 控制节点(主控端)和 Ansible 远程节点(被控端)。
Q: Playbook 和 Role 之间有什么区别?
A: Playbook 是 Ansible 的配置文件,用于描述任务和配置的集合。而 Role 是一种组织和复用 Playbook 的方式,包含了任务和变量的结构化目录。
Q: Ansible 的工作原理是什么?它如何与远程主机进行通信?
A: Ansible 使用 SSH 协议与远程主机进行通信。它在控制节点上执行任务,并通过 SSH 连接到远程主机,通过执行命令或复制文件来管理和配置远程主机。
Q: 简述Handlers与Notify关系作用
A:很多时候当我们某一个配置发生改变,我们需要重启服务,(比如httpd配置文件文件发生改变了)这时候就可以用到handlers
和notify
了;
(当发生改动时)notify actions
会在playbook
的每一个task结束时被触发,而且即使有多个不同task通知改动的发生,notify actions
知会被触发一次;比如多个resources
指出因为一个配置文件被改动,所以apache
需要重启,但是重新启动的操作知会被执行一次
[root@XXX ~]# cat XXX.yml
#用于安装httpd并配置启动
---
- hosts: XXX
remote_user: XXX
tasks:
- name: install httpd
yum: name=httpd state=installed
- name: config httpd
template: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd
service: name=httpd state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted
#这里只要对httpd.conf配置文件作出了修改,修改后需要重启生效,在tasks中定义了restart httpd这个action,然后在handlers中引用上面tasks中定义的notify。
Q: Playbook核心元素
A:
- Hosts 执行的远程主机列表
- Tasks 任务集
- Varniables 内置变量或自定义变量在playbook中调用
- Templates 模板,即使用模板语法的文件,比如配置文件等
- Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
- tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码。
Q: ansible-playbook常用选项
A:
--check or -C #只检测可能会发生的改变,但不真正执行操作
--list-hosts #列出运行任务的主机
--list-tags #列出playbook文件中定义所有的tags
--list-tasks #列出playbook文件中定义的所以任务集
--limit #主机列表 只针对主机列表中的某个主机或者某个组执行
-f #指定并发数,默认为5个
-t #指定tags运行,运行某一个或者多个tags。(前提playbook中有定义tags)
-v #显示过程 -vv -vvv更详细
模块和任务
Q: 什么是 Ansible 模块?可以举例说明几个常用的模块吗?
A: Ansible 模块是 Ansible 提供的可用于执行特定任务的代码单元。一些常用的模块包括:command
(执行命令)、shell
(执行 Shell 命令)、apt
(管理 APT 软件包)等。
Q: 如何在 Ansible Playbook 中定义任务?
A: 在 Playbook 中,任务通过使用 task
关键字来定义。例如:
- name: Install Apache
apt:
name: apache2
state: present
Q: Ansible 提供了哪些用于条件判断的控制结构?
A: Ansible 提供了多个条件判断的控制结构,包括 when
、failed_when
、changed_when
等。这些结构可用于根据条件决定任务是否执行、失败与否的判断以及变更是否发生等。
Ansible 变量和模板
Q: 什么是 Ansible 变量?有哪些不同的变量类型?
A: Ansible 变量是用于存储数据和配置信息的容器。不同的变量类型包括:全局变量、主机变量、组变量、Playbook 变量、角色变量等。
Q: 如何在 Ansible Playbook 中定义和使用变量?
A: 在 Playbook 中,可以使用 vars
关键字定义变量。变量可以通过 {
{ 变量名 }}
的方式在任务中引用。例如:
vars:
my_var: "Hello, World!"
tasks:
- name: Print variable
debug:
msg: "{
{ my_var }}"
Q: Ansible 如何使用模板文件来生成配置文件?
A: Ansible 使用 template
模块来处理模板文件。可以在 Playbook 中使用 template
模块,并指定模板文件和生成的目标文件路径。在模板文件中,可以使用 Jinja2 模板语言来插入变量和执行逻辑操作。例如:
- name: Generate configuration file
template:
src: templates/myconfig.j2
dest: /etc/myapp/myconfig.conf
在 myconfig.j2
模板文件中,您可以使用变量和控制结构来生成配置文件的内容,如:
jinja2Copy code
# Configuration file
{
{ my_variable }}
{% if is_production %}
mode = production
{% else %}
mode = development
{% endif %}
Ansible 角色和剧本组织
Q: 什么是 Ansible 角色?它有什么优点?
A: Ansible 角色是一种组织和复用 Playbook 的结构化方式。它包含了任务、变量和文件等的目录结构。使用角色可以提高代码的可维护性、重用性和可读性,并简化 Playbook 的编写过程。
Q: Ansible 角色的目录结构是怎样的?
A: Ansible 角色包含以下目录和文件:
roles/
myrole/
tasks/
main.yml
handlers/
main.yml
templates/
files/
vars/
main.yml
defaults/
main.yml
meta/
main.yml
Q: 如何在 Ansible Playbook 中使用角色?
A: 在 Playbook 中,可以使用 roles
关键字指定要使用的角色。例如:
- name: Use myrole
hosts: servers
roles:
- myrole
这将使用名为 myrole
的角色来执行 Playbook。