1. 简述什么是 Ansible?
正确回答通过率:76.0%
详情 \] 推荐指数: ★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> Ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。 Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是Ansible所运行的模块,Ansible只是提供一种框架。主要包括: (1) 连接插件connection plugins:负责和被监控端实现通信; (2) host inventory:指定操作的主机,是一个配置文件里面定义监控的主机; (3) 各种模块核心模块、command模块、自定义模块; (4) 借助于插件完成记录日志邮件等功能; (5) playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。 ### 2. 简述Ansible 的工作原理和模式 ? 正确回答通过率:86.0% \[ 详情 \] 推荐指数: ★★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> (1)Ansible没有客户端,因此底层通信依赖于系统软件,Linux系统下基于OpenSSH通信,Windows系统下基于PowerShell,管理端必须是Linux系统,使用者认证通过后在管理节点通过Ansible工具调用各应用模块将指令推送至被管理端执行,并在执行完毕后自动删除产生的临时文件 (2)Ansible 由节点和控制机器组成。 (3)Ansible 将安装在控制机器上,节点通过 SSH 在该控制机器内进行管理,无需任何停机。节点位置是通过通过其库存控制机器来指定的。 (4)Ansible 使用 SSH 协议将模块部署到节点,这些模块仅临时存储在远程节点中,它们通过标准输出上的 JSON 连接与 Ansible 机器进行通信。 ### 3. 简述如何安装Ansible ? 正确回答通过率:81.0% \[ 详情 \] 推荐指数: ★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> Ansible的安装源被收录在了EPEL源中,所以需要先安装EPEL源 #yum --y install epel-release 然后直接安装Ansible即可 #yum --y install ansible 验证安装是否成功 ansible --version ### 4. 简述Ansible的目录结构 ? 正确回答通过率:92.0% \[ 详情 \] 推荐指数: ★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 配置文件目录:/etc/ansible 执行文件目录:/usr/bin lib库依赖目录:/usr/lib/python2.7/site-packages/ansible help文档目录: /usr/share/doc/ansible-2.4.2.0/ ### 5. 详细阐述Ansible的系统架构和组成 ? 正确回答通过率:70.0% \[ 详情 \] 推荐指数: ★★★★★ 试题难度: 中级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 核心:ansible 核心模块(Core Modules):这些都是ansible自带的模块 扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块 插件(Plugins):完成模块功能的补充 剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行 连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件 主机群(Host Inventory):定义ansible管理的主机 ### 6. 如何保护 Ansible 中的密码? 正确回答通过率:78.0% \[ 详情 \] 推荐指数: ★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> Ansible 有一个称为 Vault 的功能,它允许您将敏感数据(例如密码或密钥)保存在加密文件中,而不是作为剧本或角色中的明文。它有一个名为 ansible-vault 的命令行工具,用于编辑文件。此命令行工具使用的常见标志是 --ask-vault-pass或--vault-password-file。 要运行包含 Vault 加密数据文件的 playbook,您必须传递两个标志之一。 ### 7. 简述什么是 Ansible Inventory? 正确回答通过率:61.0% \[ 详情 \] 推荐指数: ★★★★ 试题难度: 中级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> Ansible 在/etc/ansible/hosts上有一个默认文件,其中包含目标系统的 IP 地址或主机名。您可以使用命令行上的-i 选项 指定不同的清单文件。Ansible 从这个文件中选择一部分主机来处理。文件格式可以是 INI 或 YAML,默认类似于 INI。在 INI 格式中,括号中的标题是组名,用于对系统进行分类并决定您在什么时间和出于什么目的控制哪些系统。例如 \[db-servers
192.168.10.4
192.168.10.5
应用服务器
10.1.5.4 10.1.5.5
主机和组变量可以在清单文件中定义。将变量分配给稍后将在剧本中使用的主机很容易,例如
web-servers:vars
ntp_server=ntp.server.com
8. 简述Ansible配置文件和配置项目 ?
正确回答通过率:83.0%
详情 \] 推荐指数: ★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 配置文件目录/etc/ansible,主要功能是: Inventory主机信息配置 Ansible工具功能配置等 Inventory用于定义Ansible的主机列表配置,Ansible自身的配置文件只有一个,即ansible.cfg,ansible配置文件可以存在于多处,Ansible读取配置文件的顺序是: 当前命令执行目录➡用户的家目录下的.ansible.cfg➡/etc/ansible/ansible.cfg先找到哪个就先用哪个! ansible.cfg配置中的所有内容都可以在命令行通过参数的方式传递或者定义在Playbooks中 ### 9. 解释什么是 Ansible 剧本(Ansible Playbook)? 正确回答通过率:93.0% \[ 详情 \] 推荐指数: ★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> Ansible Playbook 是 Ansible 所有用例的构建块。不同的 YAML 标签分为四种类型,即声明、变量、任务和处理程序。 Playbooks 是一组可以执行多个任务的命令,它们以 YAML 文件格式编写 ### 10. 检查为主机定义的库存变量的方法是什么? 正确回答通过率:86.0% \[ 详情 \] 推荐指数: ★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 使用以下命令检查库存: $ ansible -m debug -a "var=hostvars\['hostname'\]" localhost ### 11. 简述什么是 Ansible Galaxy? 正确回答通过率:75.0% \[ 详情 \] 推荐指数: ★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> Ansible 的 Galaxy 工具,类似程序员使用的 github,docker 镜像仓库,yum仓库和deb仓库等。可以将自己编写的 Role 通过 Galaxy 这个平台进行分享。同样,我们也可以通过 Galaxy 这个平台去获取一些我们想要的 Role Galaxy 官网:https://galaxy.ansible.com ansible-galaxy 则是一个使用 Galaxy 命令行的工具。 ### 12. 简述描述 Ansible playbook 模块的类型 ? 正确回答通过率:70.0% \[ 详情 \] 推荐指数: ★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 根据官方的分类,将模块按功能分类为:云模块、命令模块、数据库模块、文件模块、资产模块、消息模块、监控模块、网络模块、通知模块、包管理模块、源码控制模块、系统模块、单元模块、web设施模块、windows模块 ### 13. 请列举 Ansible playbook 模块的作用 ? 一、ping模块 测试主机是否是通的,用法很简单,不涉及参数: \[root@Server playbooks\]#ansible test -m ping 192.168.10.101 \| SUCCESS =\> { "changed": false, "ping": "pong" } 可以ping通的话,结果返回pong 二、setup模块 setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数是filter参数,具体使用示例如下: ansible 10.212.52.252 -m setup -a 'filter=ansible_\*_mb' //查看主机内存信息 ansible 10.212.52.252 -m setup -a 'filter=ansible_eth\[0-2\]' //查看地接口为eth0-2的网卡信息 ansible all -m setup --tree /tmp/facts //将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名) 如果不加-a 指定参数的话,setup模块会返回客户端的全部信息。 三、file模块 file模块主要用于远程主机上的文件操作,file模块包含如下选项: force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes\|no group:定义文件/目录的属组 mode:定义文件/目录的权限 owner:定义文件/目录的属主 path:必选项,定义文件/目录的路径 recurse:递归的设置文件的属性,只对目录有效 src:要被链接的源文件的路径,只应用于state=link的情况 dest:被链接到的路径,只应用于state=link的情况 state: directory:如果目录不存在,创建目录 file:即使文件不存在,也不会被创建 link:创建软链接 hard:创建硬链接 touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间 absent:删除目录、文件或者取消链接文件 使用示例: ansible test -m file -a "src=/etc/fstab dest=/tmp/fstab state=link" ansible test -m file -a "path=/tmp/fstab state=absent" ansible test -m file -a "path=/tmp/test state=touch" 四、copy模块 复制文件到远程主机,copy模块包含如下选项: backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes\|no content:用于替代"src",可以直接设定指定文件的值 dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录 directory_mode:递归的设定目录的权限,默认为系统默认权限 force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes others:所有的file模块里的选项都可以在这里使用 src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾, 则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。 示例如下: ansible test -m copy -a "src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644" ansible test -m copy -a "src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes" ansible test -m copy -a "src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s'" 五、service模块 用于管理服务,该模块包含如下选项: arguments:给命令行提供一些选项 enabled:是否开机启动 yes\|no name:必选项,服务名称 pattern:定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行 runlevel:运行级别 sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟 state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded) 使用示例: ansible test -m service -a "name=httpd state=started enabled=yes" asnible test -m service -a "name=foo pattern=/usr/bin/foo state=started" ansible test -m service -a "name=network state=restarted args=eth0" 六、cron模块 用于管理计划任务包含如下选项: backup:对远程主机上的原任务计划内容修改之前做备份 cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划 day:日(1-31,*,* /2,......) hour:小时(0-23,*,* /2,......) minute:分钟(0-59,*,* /2,......) month:月(1-12,*,* /2,......) weekday:周(0-7,\*,......) job:要执行的任务,依赖于state=present name:该任务的描述 special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly state:确认该任务计划是创建还是删除 user:以哪个用户的身份执行 使用示例: ansible test -m cron -a 'name="a job for reboot" special_time=reboot job="/some/job.sh"' ansible test -m cron -a 'name="yum autoupdate" weekday="2" minute=0 hour=12 user="root ansible test -m cron -a 'backup="True" name="test" minute="0" hour="5,2" job="ls -alh \> /dev/null"' ansilbe test -m cron -a 'cron_file=ansible_yum-autoupdate state=absent' 七、yum模块 使用yum包管理器来管理软件包,其选项有: config_file:yum的配置文件 disable_gpg_check:关闭gpg_check disablerepo:不启用某个源 enablerepo:启用某个源 name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径 state:状态(present,absent,latest) 使用示例 ansible test -m yum -a 'name=httpd state=latest' ansible test -m yum -a 'name="@Development tools" state=present' ansible test -m yum -a 'name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present' 八、user模块与group模块 user模块是请求的是useradd, userdel, usermod三个指令,goup模块请求的是groupadd, groupdel, groupmod 三个指令。 1、user模块 home:指定用户的家目录,需要与createhome配合使用 groups:指定用户的属组 uid:指定用的uid password:指定用户的密码 name:指定用户名 createhome:是否创建家目录 yes\|no system:是否为系统用户 remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r state:是创建还是删除 shell:指定用户的shell环境 注:指定password参数时,不能使用明文密码,因为后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符串放到password中即可。 echo "123456" \| openssl passwd -1 -salt $(\< /dev/urandom tr -dc '\[:alnum:\]' \| head -c 32) -stdin $1 4 P 4 P l F u E 4P4PlFuE 4P4PlFuEur9ObJiT5iHNrb9QnjaIB0 #使用上面的密码创建用户 ansible all -m user -a 'name=foo password="$1 4 P 4 P l F u E 4P4PlFuE 4P4PlFuEur9ObJiT5iHNrb9QnjaIB0"' 不同的发行版默认使用的加密方式可能会有区别,具体可以查看/etc/login.defs文件确认,centos 6.5版本使用的是SHA512加密算法 使用示例: user: name=johnd comment="John Doe" uid=1040 group=admin user: name=james shell=/bin/bash groups=admins,developers append=yes user: name=johnd state=absent remove=yes user: name=james18 shell=/bin/zsh groups=developers expires=1422403387 user: name=test generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa #生成密钥时,只会生成公钥文件和私钥文件,和直接使用ssh-keygen指令效果相同,不会生成authorized_keys文件。 九、synchronize模块 使用rsync同步文件,其参数如下: archive: 归档,相当于同时开启recursive(递归)、links、perms、times、owner、group、-D选项都为yes ,默认该项为开启 checksum: 跳过检测sum值,默认关闭 compress:是否开启压缩 copy_links:复制链接文件,默认为no ,注意后面还有一个links参数 delete: 删除不存在的文件,默认no dest:目录路径 dest_port:默认目录主机上的端口 ,默认是22,走的ssh协议 dirs:传速目录不进行递归,默认为no,即进行目录递归 rsync_opts:rsync参数部分 set_remote_user:主要用于/etc/ansible/hosts中定义或默认使用的用户与rsync使用的用户不同的情况 mode: push或pull 模块,push模的话,一般用于从本机向远程主机上传文件,pull 模式用于从远程主机上取文件 使用示例: src=some/relative/path dest=/some/absolute/path rsync_path="sudo rsync" src=some/relative/path dest=/some/absolute/path archive=no links=yes src=some/relative/path dest=/some/absolute/path checksum=yes times=no src=/tmp/helloworld dest=/var/www/helloword rsync_opts=--no-motd,--exclude=.git mode=pull 十、filesystem模块 在块设备上创建文件系统 选项: dev:目标块设备 force:在一个已有文件系统 的设备上强制创建 fstype:文件系统的类型 opts:传递给mkfs命令的选项 使用示例: ansible test -m filesystem -a 'fstype=ext2 dev=/dev/sdb1 force=yes' ansible test -m filesystem -a 'fstype=ext4 dev=/dev/sdb1 opts="-cc"' 十一、mount模块 配置挂载点 选项: dump fstype:必选项,挂载文件的类型 name:必选项,挂载点 opts:传递给mount命令的参数 src:必选项,要挂载的文件 state:必选项 present:只处理fstab中的配置 absent:删除挂载点 mounted:自动创建挂载点并挂载之 umounted:卸载 使用示例: name=/mnt/dvd src=/dev/sr0 fstype=iso9660 opts=ro state=present name=/srv/disk src='LABEL=SOME_LABEL' state=present name=/home src='UUID=b3e48f45-f933-4c8e-a700-22a159ec9077' opts=noatime state=present ansible test -a 'dd if=/dev/zero of=/disk.img bs=4k count=1024' ansible test -a 'losetup /dev/loop0 /disk.img' ansible test -m filesystem 'fstype=ext4 force=yes opts=-F dev=/dev/loop0' ansible test -m mount 'name=/mnt src=/dev/loop0 fstype=ext4 state=mounted opts=rw' 十二、get_url 模块 该模块主要用于从http、ftp、https服务器上下载文件(类似于wget),主要有如下选项: sha256sum:下载完成后进行sha256 check; timeout:下载超时时间,默认10s url:下载的URL url_password、url_username:主要用于需要用户名密码进行验证的情况 use_proxy:是事使用代理,代理需事先在环境变更中定义 使用示例: get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf mode=0440 get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf sha256sum=b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c 十三、unarchive模块 用于解压文件,模块包含如下选项: copy:在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。 creates:指定一个文件名,当该文件存在时,则解压指令不执行 dest:远程主机上的一个路径,即文件解压的路径 grop:解压后的目录或文件的属组 list_files:如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项 mode:解决后文件的权限 src:如果copy为yes,则需要指定压缩文件的源路径 owner:解压后文件或目录的属主 使用示例: unarchive: src=foo.tgz dest=/var/lib/foo unarchive: src=/tmp/foo.zip dest=/usr/local/bin copy=no unarchive: src=https://example.com/example.zip dest=/usr/local/bin copy=no ### 14. 简述Ad-Hoc Commands 是什么? 正确回答通过率:94.0% \[ 详情 \] 推荐指数: ★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> Ad hoc 这个单字是来自拉丁文常用短语中的一个短语,通常用来形容为一个特定的问题或任务而专门设定的解决方案 1。Ad-Hoc Commands 可以翻译为简短地指令,在这里冻仁会用指令操作模式来形容它,以常见的 ping 和 echo 操作为例。 ping. $ ansible all -m ping server1 \| SUCCESS =\> { "changed": false, "ping": "pong" } echo. $ ansible all -m command -a "echo Hello World" server1 \| SUCCESS \| rc=0 \>\> Hello World 从以上的例子中可以看到 Ad-Hoc commands 一次只能处理一件事情,这即是它与 Playbooks 最大的差异。 ### 15. 解释Jupyter 是什么? 正确回答通过率:81.0% \[ 详情 \] 推荐指数: ★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> Jupyter 的全名为 Jupyter Notebook,是从 2014 年的 iPython 专案演变而来的。它是个可以透过网页来撰写可互动式的文件系统,除了支援 Markdown, Python 和 (几乎) 所有的程式语言外,还可以在上面执行 Shell 指令! ### 16. 解释怎么用 Jupyter 操控 Ansible? 正确回答通过率:76.0% \[ 详情 \] 推荐指数: ★★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 在终端机 (Terminal) 里启动 Jupyter 的容器,请依个人喜好选择 image,其 latest 标签 (tag) 是对应到 alpine-3.4。 #alpine-3.4 $ docker run -p 8888:8888 -d chusiang/ansible-jupyter:alpine-3.4 #ubuntu-14.04 $ docker run -p 8888:8888 -d chusiang/ansible-jupyter:ubuntu-14.04 查看容器状态,并确认刚刚启动的 Jupyter 容器是有否绑定 Port 到 8888 上。 $ docker ps 4c5e92f73db8 chusiang/ansible-jupyter:ubuntu-14.04 "docker-entrypoint.sh" 44 hours ago Up 3 seconds 0.0.0.0:8888-\>8888/tcp naughty_elion 于浏览器输入 http://localhost:8888/ 进入 Jupyter 网站。 开启 ansible_on_jupyter.ipynb 档案。 试著在 Jupyter 上操控 Ansible 吧! 在 Jupyter 上要执行 Shell 指令时,记得要在开头加上 ! 的前缀字元。 在 Code Block 输入完指令后,点击选单列的 ▶▏或使用 + 的快捷键即可执行。 练习完,记得下载这本 notebook (透过左上角的 File 选单里有 Download as 的项目进行下载),不然一旦等容器被移除该笔记就没了! 現在的環境其實只有 Control Machine 一台,所以 inventory 的設定只有 localhost 有作用! ### 17. Ansible如何在远程机器上执行 Linux 命令? 正确回答通过率:78.0% \[ 详情 \] 推荐指数: ★★★★★ 试题难度: 中级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> nsible常用批量操作方式基本可以有 shell、copy 和 script 三个 module 完成。 1. 批量执行 比如查看 GROUP1 主机组机器的 ssh 进程 #ansible GROUP1 -m shell -a 'ps -ef \|grep ssh' -k shell 模块是使用最频繁的,file、yum、user、service 这四个 module 的功能 shell 都可以完成 #ansible GROUP1 -m shell -a 'mkdir -p /root/test/' -k #file-module,新建目录 #ansible GROUP1 -m shell -a 'yum install vim -y' -k #yum-module,安装软件 #ansible GROUP1 -m shell -a 'useradd -d /mnt/kwang kwang' -k #file-module,添加用户 #ansible GROUP1 -m shell -a 'service status iptables' -k #service-module,查看服务状态 2. 批量拷贝文件 将 /root/ 目录下的 ansible-test.jar 批量拷贝到指定主机组机器上 #ansible GROUP1 -m copy -a 'src=/root/ansible-test.jar dest=/root/' -k 3. 批量执行shell脚本 在指定主机组机器上执行本机上的 /root/test.sh 脚本 #ansible GROUP1 -m script -a '/root/test.sh' -k 批量执行shell脚本脚本,ip.txt里包含100个ip地址 #ansible -i ip.txt all -m script -a "fal.sh" 4. 批量替换相同文件的指定内容 将主机组机器上的 /root/ansible.txt 文本中的 'ansible script test' 内容替换成 'be replaced',其实批量替换操作是 shell 模块的操作 #ansible GROUP1 -m shell -a "sed -i 's/ansible script test/be replaced/g' /root/ansible.txt" -k ### 18. Ansible如何访问Linux Shell 环境变量? 正确回答通过率:78.0% \[ 详情 \] 推荐指数: ★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 通过使用"env"查找插件来访问控制机器中的现有变量。 例如: 在管理机器上访问 Home 环境变量的值: local_home:"{{lookup('env','HOME')}}" ### 19. 解释Ansible配置文件 ? 正确回答通过率:80.0% \[ 详情 \] 推荐指数: ★★★★★ 试题难度: 中级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 配置文件默认位于/etc/ansible/ansible.cfg,不填写时,大部分参数有缺省值,常用的配置项如下(持续根据需要和使用情况添加): \[default
#主机列表配置文件
#inventory = /etc/ansible/hosts
#库文件存放目录
#library = /usr/share/my_modules/
#临时py文件存放在远程主机目录
#remote_tmp = ~/.ansible/tmp
#本机的临时执行目录
#local_tmp = ~/.ansible/tmp
#默认并发数
#forks = 5
#默认sudo用户
#sudo_user = root
#每次执行是否询问sudo的ssh密码
#ask_sudo_pass = True
#每次执行是否询问ssh密码
#ask_pass = True
#远程主机端口
#remote_port = 22
#设置是否检查SSH主机的密钥,关闭后第一次连接不会提示配置实例
host_key_checking = False
#ansible日志目录
log_path = /var/log/ansible.log
#指定通信机制
transport = smart
#角色配置路径
roles_path = /etc/ansible/roles
#ssh连接超时
timeout = 10
#指定ansible命令执行的用户,默认使用当前用户
remote_user = root
#ansible命令默认执行模块
module_name = command
#普通用户提权操作
privilege_escalation
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
20. 简述Ansible 配置host文件清单 ?
正确回答通过率:73.0%
详情 \] 推荐指数: ★★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 在位于/etc/ansible/hosts文件中,配置Ansible需要管理的主机及群组清单,主要使用方法如下: #使用主机名需要配置DNS域名解析 #方式一: ip+端口+用户+密码(不使用默认配置) \[webs
10.0.0.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
10.0.0.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
#方式二:主机名+密码
webs
web0[1:2] ansible_ssh_pass='123456'
#方式三:主机名 + 变量配置
webs
web0[1:2]
webs:vars
ansible_ssh_pass='123456'
21. 请详细介绍ansible命令以及常规使用方法 ?
正确回答通过率:56.0%
详情 \] 推荐指数: ★★★★ 试题难度: 中级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> ansible是最常用的命令,也是Ansible主框架最核心的命令, 可以通过ansible --help查看命令的相关帮助,常用的一些参数如下: #anisble命令语法: ansible\[-i 主机文件\]\[-f 批次\]\[组名\]\[-m 模块名称\]\[-a 模块参数
ansible详细参数:
-v,-verbose #详细模式,如果命令执行成功,输出详细的结果 (-vv --vvv -vvvv)
-i PATH, -inventory=PATH #指定host文件的路径,默认是在 /etc/ansible/hosts
-f NUM,-forks=NUM #NUM是指定一个整数,默认是5,指定fork开启同步进程的个数。
-m NAME,-module-name=NAME #指定使用的module名称,默认使用command模块
-a,MODULE_ARGS #指定module模块的参数
-k,-ask-pass #提示输入ssh的密码,而不是使用基于 ssh 的密钥认证
-sudo #指定使用sudo获得root权限
-K,-ask-sudo-pass #提示输入sudo密码,与sudo一起使用
-u USERNAME,-user=USERNAME #指定移动端的执行用户
-C,-check #测试此命令执行会改变什么内容,不会真正的去执行
上面已经通过配置host清单并且配置ssh登陆,并且配置ansible.cfg文件,完成基本的配置项,现在我们通过ansible命令的ping模块测试一下是否能连通两台服务器:
$ ansible -m ping tencent
42.194.184.177 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
}
,
"changed": false,
"ping": "pong"
}
159.75.83.204 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
}
,
"changed": false,
"ping": "pong"
}
22. 请详细介绍ansible-doc命令以及常规使用方法 ?
正确回答通过率:72.0%
详情 \] 推荐指数: ★★★★ 试题难度: 中级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> ansible-doc 命令常用于获取模块信息及其使用帮助,一般用法如下: #获取全部模块的信息 ansible-doc -l #获取指定模块的使用帮助 ansible-doc -s \[模块名称
比如我们想看一下与mysql相关的模块,可以看到mysql相关的模块和简单的介绍:
$ ansible-doc -l | grep mysql
azure.azcollection.azure_rm_mysqlconfiguration Manage Configur...
azure.azcollection.azure_rm_mysqlconfiguration_info Get Azure MySQL Confi...
azure.azcollection.azure_rm_mysqldatabase Manage MySQL Dat...
azure.azcollection.azure_rm_mysqldatabase_info Get Azure MySQL ...
azure.azcollection.azure_rm_mysqlfirewallrule
...
23. 请详细介绍ansible-playbook命令以及常规使用方法 ?
正确回答通过率:69.0%
详情 \] 推荐指数: ★★★★ 试题难度: 中级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> Ansible-playbook是日常应用中使用频率最高的命令,类似于Linux中的sh或source命令,用来执行系列任务。其工作机制:通过读取预先编写好的playbook文件实现集中处理任务。Ansible-playbook命令后跟yml格式的playbook文件,playbook文件存放了要执行的任务代码,命令使用方式如下: Ansible-playbook playbook.yml 面是一个简单的ansible-user示例,可以了解其构成: #cat user.yml * name: create user hosts: all remote_user: root gather_facts: false vars: user:"test" tasks: * name: create user user: name="{{ user }}" 配置项说明: name:对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值 hosts:指定对哪些被管理机进行操作; remote_user:指定在远程被管理机上执行操作时使用什么用户,如不指定,则使用ansible.cfg中配置的remote_user gather_facts:指定在执行任务之前,是否先执行setup模块获取主机相关信息,如未用到,可不指定 vars:定义后续任务中会使用到的变量,如未用到,可不指定 tasks:定义具体需要执行的任务name:对任务的描述,在执行过程中会打印出来。 user:指定调用user模块; name:user模块里的一个参数,用于指定创建的用户名称 同样,如果想实现把这个新增的用户删除,只需将该playbook文件的最后一行替换为如下行再执行相应的playbook即可: user: name="{{ user }}" state=absent remove=yes ### 24. 简述使用 ansible-playbook 执行 Playbook ? 正确回答通过率:67.0% \[ 详情 \] 推荐指数: ★★★ 试题难度: 中级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> ansible-playbook 的命令行选项: -T --timeout:建立 ssh 连接的超时时间 --key-file --private-key:建立 ssh 连接的私钥文件 -i --inventory-file:指定 Inventory 文件,默认是 /etc/ansible/hosts -f --forks:并发执行的进程数,默认为 5 --list-hosts:匹配的服务器列表 --list-tasks:列出任务列表 --step:每执行一个任务后停止,等待用户确认 --syntax-check:检查 Playbook 的语法 -C --check:预测 Playbook 的执行结果 ### 25. 简述Ansible role 的定义与使用 ? 正确回答通过率:64.0% \[ 详情 \] 推荐指数: ★★★★★ 试题难度: 中级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> role 是一种将复杂的 Playbook 分割成多个文件的机制,简化了 Playbook 的编写,使 Playbook 的复用变得简单。每个 role 都会有一个名字,比如 mongodb,与 mongodb role 相关的文件都存放在 /etc/ansible/roles/mongodb 目录中: $ tree mongodb mongodb \|-----defaults \| └----main.yml \|-----files \|-----handlers \| └----main.yml \|-----meta \| └----main.yml \|-----README.md \|-----tasks \| └----main.yml \|-----templates └-----vars └----main.yml defaults/main.yml:可以被覆盖的默认变量 files:目录,保存了需要同步到远程服务器的文件 handlers/main.yml:与 Playbook 中的 handlers 选项类似,包含了所有 handler meta/main.yml:role 的依赖信息 README.md:role 的说明文件 tasks/main.yml:包含了任务列表 templates:目录,保存了 jinja2 模板文件 vars/main.yml:不应该被覆盖的变量,与 Playbook 中的 vars 或 vars_file 类似 注意:这里的文件都是可选的。templates 和 files 目录中的文件都是相对引用,不需要写路径 ### 26. 叙述如何使用 ansible-galaxy 管理 role ? 正确回答通过率:69.0% \[ 详情 \] 推荐指数: ★★★★ 试题难度: 中级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> ### ansible-galaxy 的用法: ① 初始化一个 roles 的目录结构: ansible-galaxy init /etc/ansible/roles/role_name ② 安装别人写好的 role: ansible-galaxy install -p /etc/ansible/roles role_name #安装到指定目录 ansible-galaxy -p ./roles install role_name Ansible 中,默认将 role 下载到 /etc/ansible/roles 目录,也可以在 ansible.cfg 中配置 role_path。 ③ 列出已安装的 roles: ansible-galaxy list ④ 查看已安装的 role 的信息: ansible-galaxy info role_name ⑤ 卸载 role ansible-galaxy remove role_name (3)使用 role 在使用 role 之前需要编写一个 Playbook,例如: * hosts: webservers become: yes become_method: sudo roles: * role: role_name 执行时使用以下格式: ansible-playbook -i hosts role_name.yml ### 27. 请列举 Ansible playbook 模块-ping 作用 ? 正确回答通过率:91.0% \[ 详情 \] 推荐指数: ★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> ping 模块用来测试现有的 ssh 参数是否能够顺利连通远程服务器。 ansible test -m ping ### 28. 请列举 Ansible playbook 模块-command 作用 ? 正确回答通过率:93.0% \[ 详情 \] 推荐指数: ★★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> command 是默认模块,可以不指定模块名称直接运行 linux 命令。command 模块的重要选项有: chdir:在执行指令之前,先切换到指定的目录 executable:切换 shell 来执行命令 command 模块在执行 linux 命令时不能使用管道。 ansible test -a 'hostname' ansible test -m command -a 'hostname' 如果执行的命令需要使用管道,可以使用 raw 模块,raw 模块相当于使用 ssh 直接执行 linux 命令,不会进入到 Ansible 的模块子系统中。也可以使用 shell 模块,shell 模块还可以执行远程服务器上的 shell 脚本文件,脚本文件需要使用绝对路径。 ansible test -m raw -a 'cat /etc/passwd \| wc -l' ansible test -m shell -a 'cat /etc/passwd \| wc -l' ansible test -m shell -a '/home/abc/test.sh' script 模块可以在远程服务器上执行主控节点中的脚本文件。 ansible test -m script -a 'test.sh' ### 29. 请列举 Ansible playbook 模块-file 作用 ? 正确回答通过率:86.0% \[ 详情 \] 推荐指数: ★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> file 模块主要用于对远程服务器上的文件(包括链接和目录)进行操作,包括修改文件的权限、修改文件的所有者、创建文件、删除文件等。 重要选项有: path:指定文件/目录的路径 recurse:递归设置文件属性,只对目录有效 group:定义文件/目录的组 mode:定义文件/目录的权限 owner:定义文件/目录的所有者 src:被链接的源文件路径,只应用于 state 为 link 的情况 dest:被链接到的路径,只应用于 state 为 link 的情况 force:在两种情况下会强制创建软链接,一种是源文件不存在但之后会建立的情况;另一种是目标软链接已存在,需要先取消之前的软链接,然后创建新的软链接,默认取值为 no state:有多种取值。 directory 如果目录不存在,创建目录 file 即使文件不存在也不会被创建,存在则返回文件的信息 link 创建软链接 hard 创建硬链接 touch 如果文件不存在,创建一个新的文件,如果文件或目录已存在,更新其最后访问时间和修改时间 absent 删除目录、文件或链接 #创建一个目录 ansible test -m file -a 'path=/tmp/aaa state=directory mode=0755' #修改文件的权限 ansible test -m file -a 'path=/tmp/aaa state=touch mode="u=rw,g=r,o=r"' #创建软链接 ansible test -m file -a 'src=/tmp/aaa dest=/tmp/bbb owner=abc group=abc state=link' #修改文件的所有者 ansible test -m file -a 'path=/tmp/aaa owner=root group=root mode=0644' -become ### 30. 请列举 Ansible playbook 模块-copy 作用 ? 正确回答通过率:88.0% \[ 详情 \] 推荐指数: ★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 将主控节点的文件或目录拷贝到远程服务器上,同时也可以设置文件在远程服务器的权限和所有者。 src:要复制到远程服务器的文件地址,可以是绝对路径或相对路径,如果路径是目录,将递归复制。如果路径以 "/" 结尾,只复制目录里的内容,否则复制包含目录在内的整个内容。 dest:文件复制的目的地,必须是绝对路径,如果源文件是一个目录,dest 指向也必须是一个目录。 force:默认值为 yes,表示目标服务器包含该文件,但内容不同时会强制覆盖。如果该选项设置为 no,则只有当目标服务器的目标位置不存在于该文件时,才会进行复制。 backup:默认值为 no,如果配置为 yes,在覆盖之前将原文件进行备份。 directory_mode:递归设定目录权限,默认为系统默认权限。 所有 file 模块的选项都可以在这里使用 #拷贝文件到远程服务器 ansible test -m copy -a "src=test.sh dest=/tmp/test.sh" #拷贝文件到远程服务器,如果文件已经存在,备份该文件 ansible test -m copy -a "src=test.sh dest=/tmp/test.sh backup=yes force=yes" #拷贝文件到远程服务器,并且修改文件的所有者和权限 ansible test -m copy -a "src=test.sh dest=/tmp/test.sh owner=root group=root mode=644 force=yes" -become ### 31. 请列举 Ansible playbook 模块-user 和 group作用 ? 正确回答通过率:84.0% \[ 详情 \] 推荐指数: ★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> user 模块请求的是 useradd、userdel、usermod 三个指令,group 模块请求的是 groupadd、groupdel、groupmod 三个指令。 name:需要操作的用户名(或组名) comment:用户的详细描述 createhome:创建用户时,是否创建家目录,默认为 yes home:指定用户的家目录,需要与 createhome 选项配合使用 groups:指定用户的属组 uid:设置用户的 uid gid:设置组的 gid password:设置用户的密码 update_password:假如设置的密码不同于原密码,会更新密码 state:是创建用户(组)还是删除用户(组),取值包括 present 和 absent expires:用户的过期时间 shell:指定用户的 shell 环境 generate_ssh_key:设置为yes将会为用户生成密钥,这不会覆盖原来的密钥 ssh_key_type:指定用户的密钥类型,默认rsa,具体类型取决于被管理节点 remove:当与state=absent一起使用时,删除一个用户及关联的目录,比如家目录, 邮箱目录,yes\|no #创建一个用户 ansible test -m user -a 'name=abc comment="test" uid=1234 group=root' -become #删除一个用户 ansible test -m user -a 'name=abc state=absent' -become #创建一个用户,并产生一对秘钥 ansible test -m user -a 'name=abc comment="test" generate_ssh_key=yes ssh_key_bits=2048' -become #创建组 ansible test -m group -a "name=ansible state=present gid=1234" -become #删除组 ansible test -m group -a "name=ansible state=absent" -become ### 32. 请列举 Ansible playbook 模块-apt 作用 ? 正确回答通过率:77.0% \[ 详情 \] 推荐指数: ★★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 在 Debian/Ubuntu 系统中安装、删除软件 name:软件包的名称 state:软件包的状态,可以取值为 latest、absent、present、build-dep,默认为 present autoremove:默认值为 no,如果值为 yes,移除不需要的软件包 force:强制安装或删除软件包 update_cache:相当于 apt-get update deb:deb 文件的路径 #安装软件包 ansible test -m apt -a "name=git state=present" -become #卸载软件包 ansible test -m apt -a "name=git state=absent" -become #更新源 ansible test -m apt -a "update_cache=yes" -become ### 33. 请列举 Ansible playbook 模块-yum 作用 ? 正确回答通过率:70.0% \[ 详情 \] 推荐指数: ★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 在 Redhat 或 centOS 系统中安装、删除软件 name:软件包名 state:软件包的状态,可以取值为 present、installed、latest、absent 和 removed disable_gpg_check:禁用 rpm 包的公钥 gpg 验证 enable_repo:指定安装软件包时临时启用的yum源 disable_repo:指定安装软件包时临时禁用的yum源 #安装软件包 ansible test -m yum -a "name=git state=present" -become #卸载软件包 ansible test -m yum -a "name=git state=absent" -become ### 34. 请列举 Ansible playbook 模块-get_url 作用 ? 正确回答通过率:77.0% \[ 详情 \] 推荐指数: ★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 从互联网下载数据到本地,可以控制下载后的数据所有者、权限以及检查下载数据的 checksum 等 url:文件的下载地址 dest:文件保存的绝对路径 mode:文件的权限 checksum:文件的校验码 headers:传递给下载服务器的 HTTP Headers backup:如果本地已经存在同名文件,则备份文件 timeout:下载的超时时间 所有 file 模块的选项都可以在这里使用 ### 35. 请列举 Ansible playbook 模块-unarchive 作用 ? 正确回答通过率:93.0% \[ 详情 \] 推荐指数: ★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 用于解压文件,将控制节点的压缩包拷贝到远程服务器 remote_src:yes 表示解压的文件存在远程服务器中,no 表示解压的文件存在控制节点所在的服务器中,默认值为 no,表示解压之前先把文件拷贝到远程主机中。 src:制定压缩文件的路径,所在服务器取决于 remote_src 的取值。 dest:远程服务器上的绝对路径,表示压缩文件解压的路径。 list_files:默认 no。取 yes 时,在解压的之后的返回值中列出压缩包里的文件。 exclude:解压文件时排除的文件或目录 keep_newer:默认 False。如果为 True,当目标地址中存在同名的文件且文件比压缩包中的文件更新时,不进行覆盖。 owner:解压后的所有者 group:解压后的所属的组 mode:解压后的权限 #解压本地文件 ansible test -m unarchive -a "src=data.tar.gz dest=/tmp/data list_files=yes" #解压远程的文件 ansible test -m unarchive -a "src=/tmp/data.tar.bz2 dest=/tmp remote_src=yes" ⑩ git 模块 在远程服务器执行 git 相关的操作 repo:远程 git 库的地址,可以是一个 git 协议、ssh 协议或 http 协议 的 git 库地址 dest:git 库 clone 到本地服务器后保存的绝对路径 version:git 库的版本,可以取 HEAD、分支的名称、tag 的名称,也可以是一个 commit 的 hash 值 force:默认 no。如果 yes,如果本地 git 库有修改,会抛弃本地的修改 accept_hostkey:如果 git 库的服务器不在 know_hosts 中,则添加到 know_hosts 中,key_file 指定克隆远程 git 库地址时使用的私钥 ansible test -m git -a "repo=https://github.com/kennethreitz/requests.git dest=/tmp/requests version=HEAD" ### 36. 请列举 Ansible playbook 模块-stat 作用 ? 正确回答通过率:81.0% \[ 详情 \] 推荐指数: ★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 用于获取远程服务器上的文件信息,可以获取 atime、ctime、mtime、checksum、size、uid、gid 等信息 ansible test -m stat -a "path=/etc/passwd" ### 37. 请列举 Ansible playbook 模块-cron 作用 ? 正确回答通过率:74.0% \[ 详情 \] 推荐指数: ★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 管理计划任务 backup:默认 no,表示修改之前先备份 state:present 或 absent,表示创建还是删除该计划任务 name:计划任务的描述 job:添加或删除任务,取决于 state 的取值 user:指定 crontab 所属用户 cron_file:如果指定该选项,用该文件替换远程服务器上的 cron.d 目录下的用户任务计划 month weekday day minute hour:指定 crontab 的时间参数 ansible test -m cron -a 'backup=yes name="test cron" minute=*/2 hour=* job="ls /tmp \> /dev/null"' ### 38. 请列举 Ansible playbook 模块-service 作用 ? 正确回答通过率:86.0% \[ 详情 \] 推荐指数: ★★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 相当于 service 命令,用来启动、停止、重启服务 name:服务的名称 state:可以取值为 started、stopped、restarted 和 reloaded。started 和 stopped 是幂等的。如果服务已经启动了,执行 started 不会执行任何操作。 sleep:重启的过程中,先停止服务然后 sleep 几秒再启动 pattern:定义一个模式,Ansible 首先通过 status 命令查看服务的状态,判断服务是否在运行。如果通过 status 查看服务状态时没有响应,Ansible 会尝试匹配 ps 命令的输出,当匹配到相应的模式时,认为服务已经启动,否则认为没有启动。 enabled:设置服务是否开机启动 #停止 Apache ansible test -m service -a "name=apache2 state=stopped" #重启 Apache ansible test -m service -a "name=apache2 state=restarted" ### 39. 请列举 Ansible playbook 模块-syncronize 作用 ? 正确回答通过率:78.0% \[ 详情 \] 推荐指数: ★★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 对 rsync 的封装 src:需要同步的文件或目录 dest:远程服务器保存数据的路径 archive:默认值为 yes,相当于同时开启 recursive、links、perms、times、owner、group、-D 等选项 compress:在同步过程中是否启用压缩 delete:默认为 no,取值为 yes 时,表示删除 dest 中存在而 src 中不存在的文件 ansible test -m syncronize -a "src=test dest=/tmp" ### 40. 请列举 Ansible playbook 模块-mount 作用 ? 正确回答通过率:85.0% \[ 详情 \] 推荐指数: ★★★ 试题难度: 初级 试题类型: 八股文原理 ▸ 写笔记 试题回答参考思路: \>\> 在远程服务器上挂载磁盘,如果挂载点指定的路径不存在,将创建该路径 name:挂载点的路径 state:可取值为 present、absent、mounted、unmounted,其中,mounted 和 unmounted 用来处理磁盘的挂载和卸载,且正确配置 fstab 文件,present 和 absent 只会设置 fstab 文件,不会操作磁盘 fstype:指定文件系统类型,当 state 取值为 present 或 mounted 时,此为必选项 src:挂载的设备 ansible test -m mount -a "name=/mnt/data src=/dev/vda fstype=ext4 state=mounted"