##一、1ansible概述和运行机制
ansible概述
Ansible是款为类Unix系统开发的自由开源的配和自动化工具.它用Python写成,类似于saltstack和Puppet,但是有一个不同和优点是我们不需在节点中安装任何客户端。它使用SSH来和节点进行通信。Ansible 基于Python paramiko开发,分布式,无需客户端,轻量级,配置语法使用YMAL及Jinja2 模板语言,有更强的远程命令执行操作
##二、Anibale具有如下特点:
1.部署简单,只需在主控端部署ansibale环境,被控端无需要做任何操作;
2.默认使用SSH协议对设备进行管理;
3.主从集中化管理;
4、配置简单、功能强大、扩展性强;
5.支持API及自定义模块,可通过Python轻松扩展;
6、通过Playbooks来定制强大的配置状态管理;
7、对云计算平台、大数据都有很好的支持;
三、工作机制
由上面的图可以看到ansible组成有5个部分组成:
Ansiblis ansible核心
Modules:包括Ansible自带的核心模块以及自动以模块
Plugins:完成模块功能的补充,包括连接插件、邮件的插件等
Playbookds:剧本,定义ansible多任务配置文件,由Ansible自动执行
INventory:定义Ansible 配置主机的清单,还可以调用模块
使用者使用Ansible或Ansible-playbook(会额外读取Playbook文件)时,在服务器终端输入Ansible的Ad-Hoc命令集或Playbook后,Ansible会遵循预先编排好的规则将Playbooks逐条拆解为Play,再将Play组织成可识别的任务(Task),随后调用任务涉及的所有模块(Module)和插件(Plugin),根据Inventory中定义的主机列表通过SSH(Linux默认)将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果是临时文件则执行完成后自动删除。
Ansible执行命令时,通过其底层传输连接模块,将一个或数个文件,或者定义一个Play或Command命令传输到远程服务器/tmp目录的临时文件,并在远程执行这些Play/Command命令,然后删除这些临时文件,同时回传整体命令执行结果。这一系列操作在未来的Ansible版本会越来越简单、直接,同时快速、稳定、安全。通过了解其工作机制及其一直以来秉承的去中心化思想,我们可以总结,Ansible是非C/S架构,自身没有Client端。
#####简述 Ansible角色?
数据中心有各种不同类型的主机。如web服务器、数据库服务器,基于开发环境的
服务器。随着时间的推移,具有处理所有这些情况的任务和人员的Ansible playbook将变得
庞大而复杂。
●角 色允许将复杂的剧本组织成独立的、更小的剧本和文件。
●角色提供了一.种从外部文件加载任务、处理程序和变量的方法。
●角 色也可关联和引用静态的文件和模板。
●角 色可以编写成满足普通用途需求,并且能被重复利用。
●定 义角色的文件具有特定的名称,并以严格的目录结构进行组织。
#####总结
Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老
牌运维工具的优点,Pubbet 和saltstack能实现的功能,Ansible基本上都可以实现。
Ansible能批量配置、部署、管理上千台主机。比如以前需要切换到每个主机上执行的一- 或多个操作,使用Ansibl
e只需在固定的一台Ansible控制节点上去完成所有主机的操作。
Ansible是基于模块工作的,它只是提供了一种运行框架,它本身没有完成任务的能力,真正执行操作的是Ansibl
e的模块,比 如copy模块用于拷贝文件到远程主机上,service模块用 于管理服务的启动、停止、重启等。
Ansible其中一个比较鲜明的特性是Agentless,即无Agent的存在,它就像普通命令-一样,并非C/S软件,也只需
在某个作为控制节点的主机上安装一次Ansible即可, 通常它基于ssh连接来控制远程主机,远程主机.上不需要安
装Ansible或其它额外的服务。
使用者在使用时,在服务器终端输入命令或者playbooks,会通过预定好的规则将playbook拆解为play,.再组织成
ansible可以识别的任务,调用模块和插件,根据主机清单通过sSH将临时文件发给远程的客户端执行并返回结果
,执行结束后自动删除
Ansible的另- -个比较鲜明的特性是它的绝大多数模块都具备幂等性(idempotence)。所谓幂等性,指的是多次操
作或多次执行对系统资源的影响是一- 致的。比如执行systemct1 stop xx
命令来停止服务,当发现要停止的目标服务已经处于停止状态,
它什么也不会做,所以多次停止的结果仍然是停止,不会改变结果,它是幂等的,而systemctl restart xxx
是非幂等的。
Ansible的很多模块在执行时都会先判断目标节点是否要执行任务,所以,可以放心大胆地让Ansible去执行任务
,重复执行某个任务绝大多数时候不会产生任何副作用。
##三、安装
被管理端: 192. 168.13.14
被管理端:192.168.13.15
//管理端安装ansible
yum install -y epel-release
//先安装epel 源
yum install -y ansible
//ansible 目录结构
/etc/ansible/
ansible.cfg //ansible的配置文件,一 般无需修改
hosts //ansible的主机清单,用于存储需要管理的远程主机的相关信息
roles //公共角色目录
//配置主机清单
cd /etc/ansible .
vim hosts
[webservers ] 配置组名
192.168.13.14
组里包含的被管理的主机IP地址或主机名(主机名需要先修改/etc/hosts文件)
[dbservers ]
192.168.13.15
//配置密钥对验证
ssh- keygen -t rsa //一路回车,使用免密登录
sshpass -P ’ abc1234’ ssh-copy-id root@192.168.13.14
sshpass -P ‘abc1234’ ssh-copy-id root@192.168.13.15
#####ansible命令行模块
命令格式: ansible <组名> -m <模块> -a <参数列表>
ansible-doc -1
列出所有已安装的模块,按q退出
ansible-doc -S command
-S列出指定模块的描述信息和操作动作
ansible 192. 168.13.14 -m command -a ‘date’
指定ip. 执行date
ansible webservers -m command -a 'date ’
指定组执行date
ansible dbservers -m command -a 'date ’
ansible all -m command -a 'date ,
all代表所有hosts 主机
ansible all -a ‘ls /’
如省略-m模块,则默认运行command 模块
//常用的参数:
chdir:在远程主机上运行命令前提前进入目录
creates:判断指定文件是否存在,如果存在,不执行后面的操作
removes:判断指定文件是否存在,如果存在,执行后面的操作
ansible all -m command -a "chdir- /home
2. shell 模块.
//在远程主机执行命令,相当于调用远程主机的shel1进程,然后在该shell下打开-一个子shel1运行命令(支持管
道符号等功能)
ansible-doc -s shell
ansible dbservers -m shell -a 'echo 123456 | passwd --stdin test,
过滤IP
ansible dbservers -m shell -a ‘echo $ (ifconfig ens33 1 awk “NR–2 {print $2}”)1 cut -d””-f2’
ansible dbservers -m shell -a 'echo $(ifconfig ens33 I awk “NR–2 {print $2}”) ’
//常用的参数:
minute/hour/day/month/weekday:分/时/日/月 /周
job:任务计划要执行的命令
name:任务计划的名称
ansible webservers -m cron -a ‘minute-“*/1” job-“/bin/echo helloworld” name= “test crontab”’
ansible webservers -a 'crontab -1 ’
ansible. webservers -m. cron. -a. ’ name= “test crontab” state = absent ’
移除计划任务,假如该计划任务没有取名字,name-None即可
//常用的参数:
name:用户名,必选参数
state-present labsent:创建账号或者删除账号,present 表示创建,absent 表示删除
system-yesIno:是否为系统账号
uid:用户uid
group:用户基本组
shell:默认使用的shell
move_ home-yse I no:
如果设置的家目录已经存在,是否将已经存在的家目录进行移动
password:用户的密码,建议使用加密后的字符串
comment:用户的注释信息
remove-yesIno:当state- absent时,是否删除用户的家目录
ansible dbservers -m user -a ‘name- “test01”’ //创建用户test01
ansible dbservers -m command -a 'tail /etc/passwd ’
ansible dbservers -m user -a 'name= “test01” state=absent ’ //删除用户test01
创建mysql组
ansible dbservers -a 'tail /etc/group ’
ansible dbservers -m user_ -a 'name-test01 uid=306 system-yes group-mysq1 ’
将test01用户添加到mysql组中
ansible dbservers -a ‘tail /etc/passwd’
ansible dbservers -a ’ id test01 ’
将hellowor1d写入/opt/hello. txt文件中
ansible dbservers -a ‘cat /opt/he1lo. txt’
修改文件的属主属组权限等
ansible dbservers -m file -a ‘path=/opt/fstab.link src=/opt/fstab.bak state=link’
设置/opt/fstab. link为/opt/fstab. bak的链接文件
ansible dbservers -m file -a “path-/opt/abc.txt state- touch”
创建一个文件
ansible dbservers -m file -a “path-/opt/abc. txt state-absent”
删除一个文件
hostname 模块
//用于管理远程主机上的主机名
ansible dbservers -m hostname -a “name =mysq101”
ping模块
//检测远程主机的连通性
ansible all -m ping
yum模块
//在远程主机.上安装与卸载软件包.
ansible-doc -s yum
ansible webservers -m yum -a ’ name=httpd’ /安装服务
ansible webservers -m yum -a ’ name=httpd state-absent ’ //卸载服务
ansible webservers -m service -a 'enabled-true name= httpd state-started !
//启动httpd服务
vim test.sh
/#! /bin/bash
echo “hello ansible from script” > /opt/script.txt I
chmod +x test.sh
ansible webservers -m script -a ’ test. sh’
ansible webservers -a 'cat /opt/script. txt
获取mysq1组主机的facts信息
ansible dbservers -m setup -a ‘filter=* ipv4’
使用filter可以筛选指定的facts信息.
######inventory.主机清单---------
//Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何- -个或多个主机组内
//如果是名称类似的主机,可以使用列表的方式标识各个主机。
vim /etc/ansible/hosts
[webservers ]
192.168.13.14:2222
冒号后定义远程连接端口,默认是ssh的22端口
192.168.13.1[2:5]
[dbservers]
db- [a:f] .example.org //支持匹配a~f
改端口要在被控制端修改,并且重新启动服务,然后在主控端修改hosts文件端口然后连接操作
//inventory中的变量
Inveitory变量名
含义
ansible_ host
ansible连接节点时的IP地址
ansible_ port
连接对方的端口号,ssh连接时默认为22
ansible_ user
连接对方主机时使用的主机名。不指定时,将使用执行ansible或ansible-playbook命令的用户
ansible_ password
连接时的用户的ssh密码,仅在未使用密钥对验证的情况下有效
ansible_ ssh_ private_ key_ file指 定密钥认证ssh连接时的私钥文件
ansible_ ssh_ common_ args
提供给ssh、_ sftp、 scp命令的额外参数
ansible_ become
允许进行权限提升
ansible_ become_ method
指定提升权限的方式,例如可使用sudo/su/ runas等方式
ansible_ become_ user
提升为哪个用户的权限,默认提升为root
ansible_ become_ password
提升为指定用户权限时的密码
(1)主机变量
[webservers ]
192.168.13.14 ansible_ port=22 ansible_ user=root ansible_ _password=abc1234
(2)组变量
[webservers:vars] //表示为webservers 组内所有主机定义变量
ansible_ user= root
ansible_ password=abc1234
[all :vars] /表示为所有组内的所有主机定义变量
ansible_ port-22
(3)组嵌套
[nginx]
192.168.13.13
192.168.13.14
192.168.13.15
[ apache ]
192.168.13.3[0:3]
[webs :children]
表示为webs主机组中包含了nginx 组和apache 组内的所有主机
nginx
apache
######Ansible的脚本— playbook剧本
playbooks本身由以下各部分组成
(1) Tasks: 任务,即通过task调用ansible 的模板将多个操作组织在- -个playbook 中运行
(2) Variables:变量
(3) Templates: 模板
(4) Handlers: 处理器,当changed状态 条件满足时,( notify)触发执行的操作
(5) Roles: 角色
//示例:
vim test1. yaml .
yaml文件以—开头,以表明这是一个yaml文件,可省略
name: first play
定义一个play的名称,可省略
gather_ facts: false
设置不进行facts信息收集,这可以加快执行速度,可省略
hosts: webservers
指定要执行任务的被管理主机组,如多个主机组用冒号分隔
remote_ _user: root
指定被管理主机上执行任务的用户
tasks:
定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机.上执行
自定义任务名称
ping:
使用module: [options] 格式来定义- -个任务
name: disable sel inux
command: ’ /sbin/setenforce 0’
command模块和shel1模块无需使用key=value格式
ignore_ errors: True
如执行命令的返回值不为0,就会报错,tasks停止, 可使用ignore_ errors忽略 失败的任务
name: disable firewalld
service: name- firewalld state-stopped
使用module: options
格式来定义任务,option使 用key=value格式
name: install httpd
yum: name=httpd state=latest
name: install configuration file for httpd
copy: src= /opt/httpd . conf dest=/etc/httpd/ conf/httpd. conf
这里需要一个事先准备好的/opt /httpd. conf文件
notify: “restart httpd”
如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
/- name: start httpd service
service: enabled=true name=httpd state=started .
handlers:
handlers中定义的就是任务,此处handlers中的任务使用的是service模块
/- name: restart httpd
notify和handlers中任务的名称必须- -致
service: name-httpd state= restarted
Ansible在执行完某个任务之后并不会立即去执行对应的handler, 而是在当前play中所有普通任务都执行完后
再去执行handler,这样的好处是可以多次触发notify,但最后只执行一- 次对应的handler,从而避免多次重启。
//运行playbook
ansible-playbook test1 . yaml
//补充参数:
-k (-ask-pass) :用来交互输入ssh密码
-K (-ask-become-pass) :用来交互输入sudo密码
-u: 指定用户
ansible-playbook test1. yaml – syntax-check
检查yaml文件的语法是否正确
ansible-playbook test1.yaml --list-task
检查tasks任务
ansible-playbook test1.yaml – list-hosts
检查生效的主机
ansible-playbook test1.yaml --start-at-task=’ install httpd’
指定从某个task开始运行
最后浏览器访问。
nsible在执行完某个任务之后并不会立即去执行对应的handler, 而是在当前play中所有普通任务都执行完后
再去执行handler,这样的好处是可以多次触发notify,但最后只执行一- 次对应的handler,从而避免多次重启。
//运行playbook
ansible-playbook test1 . yaml
//补充参数:
-k (-ask-pass) :用来交互输入ssh密码
-K (-ask-become-pass) :用来交互输入sudo密码
-u: 指定用户
ansible-playbook test1. yaml – syntax-check
检查yaml文件的语法是否正确
ansible-playbook test1.yaml --list-task
检查tasks任务
ansible-playbook test1.yaml – list-hosts
检查生效的主机
ansible-playbook test1.yaml --start-at-task=’ install httpd’
指定从某个task开始运行
最后浏览器访问。