1.Ansible简介 版本2.7.25
Ansible是一种自动化运维工具,基于Python开发,分布式,无需客户端,轻量级,Ansible主要提供一种批量部署的框架,系统由控制主机和被管理主机组成。它通过SSH和丰富的模块,实现了批量系统配置、批量程序部署、批量运行命令等功能。<br />Ansible特性<br />1)、no agents:不需要在被管控主机上安装任何客户端,更新时,只需在操作机上进行一次更新即可(不用安装客户端。分布式的)<br />2)、no server:无服务器端,使用时直接运行命令即可<br />3)、modules in any languages:基于模块工作,可使用任意语言开发模块<br />4)、yaml,not code:使用yaml语言定制剧本playbook<br />5)、ssh by default:**基于SSH工作**<br />6)、strong multi-tier solution:可实现多级指挥
1.1Ansible使用:
Ansible配置文件:
1.主配置文件:
/etc/ansible/ansible.cfg #主要设置一些ansible初始化的信息,比如日志存放路径、模块、等配置信息
2.主机清单文件:
默认位置/etc/ansible/hosts #存放被控节点的主机信息
配置实例:
若采用密钥连接配置主机清单前需要传输公钥到所有被控节点,这里推荐使用编写脚本一键传送。传送后配置主机清单。注意在实际生产环境ssh端口为了安全可能已经更改并且root已经被设置无法远程登录
实例1:
[web]
web1
web2
web3
web4
实例2:上面的分组方式也可以写为下面的形式
[web]
web[1:4]
实例3: 指定远端主机的用户和端口号
[web]
web1 ansible_user=tom ansible_port=2022
web2 ansible_user=tom ansible_port=2022
2.Ansible常用模块以及特点:
ansible命令行操作语法:
语法:ansible
pattern—主机清单里定义的主机组名,主机名,IP,别名等,all表示所有的主机,支持通配符,正则
-m module_name: 模块名称,默认为command
-a arguments: 传递给模块的参数
-o 单行显示
其他命令:
ansible-doc -l 列出ansible支持的模块.
ansible-doc -s yum 列出yum模块的详细信息.
2.1 ping模块
定义:检查指定主机清单节点机器是否还能连通
举例1:ansible all -m ping # all:主机清单的所有服务器.
举例2:ansible ansible-web1 -m ping # 测试ansible-web1服务器与被控主机连通性。
2.2 command模块
举例1:ansible dkaiyun -m command -a “hostname” # 查看dkaiyun服务器的主机名。
举例2: ansible dkaiyun -m command -a “chdir=/data ls -l” # 长格式查看dkaiyun服务器/data目录下的内容。
举例3:ansible dkaiyun -m command -a “touch /data/lol.txt creates=/data/lol.txt” # 判断dkaiyun服务器/data/lol.txt文件是否存在,若不存在,执行touch /data/lol.txt。
举例4:ansible dkaiyun -m command -a “rm -f /data/lol.txt removes=/data/lol.txt” # 判断dkaiyun服务器/data/lol.txt文件是否存在,若存在,执行rm -f /data/lol.txt。
2.3 shell模块
定义:它几乎与command模块完全相同,但通过远程节点上的 shell 来运行命令。可以使用”<”,”>”,”|”,”;”,”&”等符号特殊符。
举例:ansible dkaiyun -m shell -a “ps -ef |grep /[s]sh” #查看包含ssh的进程的详细信息。
2.4 script模块
定义:在远程主机上执行ansible主机上的脚本,且不需要将脚本复制到被执行的远程主机上。
举例:ansible all -m script -a ‘chdir=/opt /opt/test.sh’ # 先进入/opt目录下,再执行test.sh脚本
2.5 file模块
定义:实现创建/删除文件信息 对数据权限进行修改。
举例1: ansible ansible-demo3 -m file -a “path=/testdir/testfile1 state=touch”
#在 ansible-demo3 主机上创建一个名为 testfile1 的文件,如果 testfile1 文件已经存在,则会更新文件的时间戳,与 touch 命令的作用相同。
举例2:ansible ansible-demo3 -m file -a “path=/testdir/testdir state=directory”
# ansible-demo3 主机上创建一个名为 /testdir/testdir 的目录,如果 /testdir/testdir 目录已经存在,则不进行任何操作。
举例3:ansible ansible-demo3 -m file -a “path=/testdir/abbstate=directory group=ding” #在ansible-demo3主机上创建目录的时候指定属组。
举例4:ansible ansible-demo3 -m file -a “path=/testdir/abb mode=0644” #在ansible-demo3主机上修改远程主机上的文件的权限。
举例5:ansible ansible-demo3 -m file -a “path=/testdir/linkfile1 state=link src=/testdir/testfile1 # 在 ansible-demo3 上为 testfile1 文件创建软链接文件,软链接名为 linkfile1,执行下面命令的时候,testfile1 已经存在。
举例6: ansible ansible-demo3 -m file -a “path=/testdir/hardfile2 state=hard src=/testdir/testfile2” #在 ansible-demo3 上为 testfile2 文件创建硬链接文件,硬链接名为 hardfile2,执行下面命令的时候,testfile2 已经存在。
2.6 yum模块

定义:使用yum软件包管理器安装,升级,降级,删除和列出软件包和组。
举例1:ansible dr_exp1 -m yum -a ‘state=present name=tree’ # 在dr_exp1主机上安装tree(目录树)
举例2:ansible kub-k8s-master -m yum -a ‘name=git-1.8.3.1-23.el7_8.x86_64 state=present’ #在kub-k8s-master节点上安装指定版本git。
举例3:ansible dr_exp1 -m yum -a ‘state=remove name=tree’ # 在dr_exp1主机上卸载tree(目录树)
2.7 copy模块
定义:主要用于将管理主机上的文件传送给多台主机。
举例1: ansible web01 -m copy -a “src=/opt/a.txt dest=/data” # 从控制节点复制a.txt到web01主机上的/data目录下(如果有,会直接覆盖)。
举例2: ansible web01 -m copy -a “src=/opt/a.txt dest=/data backup=yes” # 从控制节点复制a.txt到web01主机上的/data目录下(如果有,会备份)。
举例3:ansible test -m copy -a “src=test.sh dest=/root dest=/tmp owner=liuhao group=liuhao mode=0644” # 从控制节点复制文件并设置属主属组和权限。
2.8 service 和systemd模块
定义:用于管理Linux的系统服务.ansible的systemd模块也可以管理远程主机的服务,用法和service模块基本相同。
举例1:ansible web01 -m service -a “name=vsftpd state=started enabled=yes” #将vsftpd服务启动并设为开机自启
举例2:ansible web -m systemd -a “name=httpd state=stopped” #将httpd服务停止
2.9 fetch模块
定义:抓取文件到控制节点。
举例1:ansible web01 -m fetch -a “src=/root/lol.txt dest=/root” # 获取远程主机web01上的lol.txt文件保存到控制节点的/root目录下。
2.10 unarchive 压缩解压模块
功能:解压缩,这个模块有两种用法:
1、将ansible主机上的压缩包在本地解压缩后传到远程主机上,这种情况下,copy=yes. 本地解压缩后传到远程主机
2、将远程主机上的某个压缩包解压缩到指定路径下。这种情况下,需要设置copy=no ,远程主机上面的操作,不涉及ansible服务端
参数:
copy:默认为yes,当copy=yes,那么拷贝的文件是从ansible主机复制到远程主机上的,如果设置为copy=no,那么会在远程主机上寻找src源文件
src:源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压缩后的文件权限
命令演示:
举例1: ansible kub-k8s-master -m unarchive -a ‘src=/root/apache-tomcat-8.5.46.tar.gz dest=/opt mode=0755’ # 将控制节点的/root目录下tomcat压缩包远程解压到kub-k8s-master的/opt目录下,并设置文件权限0755.
举例2: ansible kub-k8s-master -m unarchive -a ‘src=/root/apache-tomcat-8.5.46.tar.gz dest=/opt copy=no mode=0755’ # 将kub-k8s-master的/root目录下tomcat压缩包解压到kub-k8s-master的/opt目录下,并设置文件权限0755.
2.11 其他模块
1.user模块:管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作。
2.setup模块:setup模块被剧本自动调用,以收集有关可用于剧本的远程主机的有用变量,采集远程主机的基础信息,如操作系统版本、内存、
磁盘、主机名、CPU等内核信息。
3.group模块:用来进行用户组的管理,添加、管理或者删除组。
4.stat模块:获取远程文件状态信息,包括atime、ctime、mtime、md5、uid、gid等
3.面试题精选
1.你工作中使用ansible吗,使用它来做些什么?
我经常使用ansible,它是一种轻量级的自动化运维工具,我主要用它来进行批量系统配置,命令执行,或者程序安装,简单的说就是基础环境部署吧,也结合它做jenkins的持续集成持续发布,都非常方便。
2.用ansible写过playbook吗?
写过zabbix的agent端批量部署,tomcat部署,nginx部署,docker部署。有时候也用role角色部署,个人感觉Roles角色更加灵活它是对piaybook的结构模块化,代码易读,可重用,层次清晰。
3.你经常使用哪些ansible模块?若实现**,怎么用命令行实现?
4.playbook的剧本编写流程,变量引用与定义
playbook是由一个或多个”play”组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。
playbook的基础组件:
name: 定义playbook或者task的名称(描述信息),每一个play都可以完成一个任务。
hosts: hosts用于指定要执行指定任务的主机.
user: remote_user则用于指定远程主机上的执行任务的用户
tasks: 任务列表play的主体部分是task list. task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。
vars: 定义变量(如果不使用内部变量需要提前定义)
vars_files: 调用定义变量文件
notify: 任务执行结果如果是发生更改了的则触发定义在handler的任务执行
handlers: 用于当前关注的资源发生变化时采取一定指定的操作
语法:1. ansible-playbook —syntax-check test.yml 对语法进行检测
2. ansible-playbook test.yml 运行剧本
参数解析:
-syntax-check:检测yaml文件的语法。
-C:预测试,不会改变目标主机的任何设置。
–list-tasks:列出yaml文件的任务列表。
–list-hosts:列出yaml文件影响的主机列表。
–list-tags:列出yaml文件中的标签。
-t TAGS:表示只执行指定标签的任务。
–skip-tags=SKIP_TAGS:表示出了指定标签的任务,执行其他任务。
–start-at-task=START_AT:从指定任务开始往下运行。

