Ansible基础
1、ansible架构
Ansible:Ansible核心程序。
HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
ConnectionPlugins:连接插件,Ansible和Host通信使用
2、ansible任务执行模式
Ansible系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook:
·ad-hoc模式使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令, 而且不需要保存起来的命令。就相当于bash中的一句话shell。
·playbook模式是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作作的配置文件。
3、Ansible命令执行过程
1、 加载自己的配置文件 默认/etc/ansible/ansible.cfg
2、 查找对应的主机配置文件, 找到要执行的主机或者组
3、 加载自己对应的模块文件, 如command
4、 通过ansible将模块或命令生成对应的临时py文件, 并将该文件传
输至远程服务器的
5、 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件
6、 给文件+x执行
7、 执行并返回结果
8、 删除临时py文件, sleep 0退出
简单理解就是Ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取Inventory中的管理主机列表(/etc/ansible/hosts),并行的在这些主机中执行配置的任务,最后等待执行返回的结果。
4、ansible配置文件的查找顺序
(1)检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg)
(2)检查当前目录下的ansible.cfg配置文件
(3)~/.ansible.cfg,家目录下的隐藏文件
(4)/etc/ansible.cfg 检查etc目录的配置文件
5、ansible主机清单设置
那我们也来定义一个组
Vim hosts
将要添加的IP地址添加进去
6、Ansible配置公私钥
首先先在管理机上生成秘钥
生成完应该在根下的.ssh目录下,有一个公钥一个私钥
然后我们将私钥发送到那两台需要批量管理的主机上
另一台也一样: ssh-copy-id [email protected]
发完之后我们就可以无密码使用ssh登陆那两台机器了。
Ansible常用模块
1、主机测试:
查看主机(组):
连通性测试:
#ansible all -m ping
(可以在后面加 -v -vv -vvv查看详细内容)
2、 command模块
在远程主机执行命令(不支持|管道命令)
分别列出家目录下的列表:
命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。它不会通过shell进行处理,比如$HOME和操作如”小于”<“,”>”, “|”, “;”,”&”‘ 工作(需要使用(shell)模块实现这些功能)。
command的一些参数功能:
先切换目录,再执行命令:
creates条件判断:
3、shell模块
在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等
4、copy模块
复制文件到远程主机,可以改权限等
(1) 复制文件
-a “src= dest= ”
可以去后端机器上看一下,确实复制过去了:
(2) 给定内容生成文件
-a "content= dest= "
然后我们再来运行一次,测试一下backup备份功能,显示内容没变,没有操作(提示是绿色的)
如果将内容修改一下,显示内容改变了(而且提示是×××的):
然后我们去查看一下文件:
5、file模块
设置文件属性
创建目录:-a “path=XXX state=directory”
创建成功
创建软链接文件:-a “path=XXX src=XXX state=link”
连接成功
删除文件:-a “path=XXX state=absent”
删除成功
6、fetch模块
从远程某主机获取文件到本地:
dest:用来存放文件的目录,例如存放目录为backup,源文件目录名称为/etc/profile,在主机pythonserver中,那么保存下来的路径为/backup/pythonserver/etc/profile
Src:在远程拉取的文件,并且必须是一个file,不能是目录
它会自动根据主机名创建文件夹,分开保存
7、cron模块
管理cron计划任务
设置一个计划任务(如果是每天下午3点,就写成hour=15):
可以使用command或者shell模块查看一下:
设置成功
(如果已经有这个计划任务了就不会再加一次,会自动判断的;如果name一样但是内容不一样,会覆盖之前的。)
删除计划任务:
查看一下,删除成功:
8、yum模块
安装软件
安装:
卸载:
9、service模块
服务程序管理
我们再把vsftpd安装上,然后使用service模块启动它:
去后端看一下:
确实启动起来了
10、user模块
用户模块,管理用户帐号action: user
创建用户:
去后端看一下,创建成功:
11、group模块
用户组模块,添加或删除组
12、script模块
在指定节点运行服务端的脚本
我们在控制端创建个脚本
加个执行权限,然后运行
去后端机器上看一下,创建成功
13、setup模块
可以查看CPU相关:
这个变量就叫做ansible_processor_vcpus
Ansible playbook
1、playbook简介
执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用playbook。
就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式。
使用playbook你可以方便的重用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook。可以把常见的应用都编写成playbook,之后管理服务器会变得十分简单。
2、playbook格式
文件的第一行应该以 ”—” (三个连字符)开始,表明YMAL文件的开始。
在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。就像这样
- apple - banana - orange等价于JSON的这种格式
[ “apple”, “banana”, “orange” ]
同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。
play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以”:”分隔表示,”:”后面还要增加一个空格。
house:
family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 12345 }
3、playbook内容
vim nginx.yml 编辑一个playbook
文件一共有3部分:
hosts部分:使用hosts指示使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hosts,hosts也可以使用通配符格式。主机或主机组在inventory清单中指定,可以使用系统默认的/etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i选项,指定清单的位置即可。在运行清单文件的时候,–list-hosts选项会显示那些主机将会参与执行task的过程中。
remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行task的用户,可以任意指定,也可以使用sudo,但是用户必须要有执行相应task的权限。
tasks:指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块,前面已经提到模块的用法。tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必须的,同时也要给予模块相应的参数。
如果要执行的话,直接使用ansible-playbook nginx.yml即可。
4、Playbook的核心元素
Hosts:主机
Tasks:任务列表
Variables: 变量
Templates:包含了模板语法的文本文件;
Handlers:由特定条件触发的任务;
·Playbooks配置文件的基础组件
Hosts:运行指定任务的目标主机;
remoute_user: 在远程主机上执行任务的用户;
sudo_user:
tasks:任务列表
模块,模块参数;
格式:
(1) action: module arguments
(2) module: arguments
注意:shell和command模块后面直接跟命令,而非key=value类的参数列表;
·tag与handlers
(1) tag
任务可以通过“tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;
然后使用ansible-playbook nginx.yml -t startngx命令,就可以只执行启动服务的这段代码了
(2) handlers
某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;
我们配置一个handlers:
我们给copy nginx.conf加了个标签并且添加了一个任务,如果需要修改配置文件的话,就修改好之后只运行copyconf标签那部分,然后它在把配置文件推送过去之后就会触发这个restart nginx的任务,于是就执行下面的重启任务,就完成了一次配置文件的替换。
·变量
设置变量有四种方法
(1) facts:可直接调用;
注意:可使用setup模块直接获取目标主机的facters;
(2) 用户自定义变量:
(a) ansible-playbook命令的命令行中的
-e VARS, --extra-vars=VARS
(b) 在playbook中定义变量的方法:
vars:
- var1: value1
- var2: value2
(3) 通过roles传递变量;
(4) Host Inventory
(a) 用户自定义变量
(i) 向不同的主机传递不同的变量;
IP/HOSTNAME varaiable=value var2=value2
(ii) 向组中的主机传递相同的变量;
[groupname:vars]
variable=value
[web]
172.17.251.188
172.17.250.209
[web:vars]
rpmname=samba
我们修改刚才的playbook,将所有的nginx都换成变量rpmname
然后我们运行的时候使用ansible-playbook nginx.yml -e rpmname=nginx命令,这样运行的结果就跟之前一样了。
这样设置了变量的话,我们想装哪个包就可以装哪个了
我们也可以将变量的值写到playbook中:
这样就设置成功了,直接使用ansible-playbook nginx.yml运行即可。