1.Ansible介绍
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。
官网
2.Ansible可以实现以下功能
自动化配置管理:可以使用Ansible在多台服务器上自动配置软件、修改配置文件、安装更新等操作,提高效率和准确性。
应用程序部署:可以使用Ansible在多台服务器上自动部署应用程序,例如Web应用程序、数据库等。
云部署:可以使用Ansible在多个云平台上自动部署和管理应用程序,例如AWS、Azure、Google Cloud等。
系统管理:可以使用Ansible管理多台服务器,例如执行命令、查看系统信息、监控服务器等
3.Ansible具有以下优点
简单易用:Ansible使用YAML语言进行配置和编写任务,易于学习和使用。
跨平台支持:Ansible可以在不同的操作系统上运行,例如Linux、Windows等。
扩展性强:Ansible可以使用插件扩展功能,例如支持不同的云平台、数据库等。
安全性高:Ansible使用SSH协议进行通信和执行命令,可以保证数据传输的安全性
4.Ansible特点
部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
默认使用SSH协议对设备进行管理;
有大量常规运维操作模块,可实现日常绝大部分操作;
配置简单、功能强大、扩展性强;
支持API及自定义模块,可通过Python轻松扩展;
通过Playbooks来定制强大的配置、状态管理;
轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台
5.Ansible架构
Ansible通过主控端(左侧)来控制其他主机(右侧),大致可以分为三个层次:用户、主控端和被控端。其中:
核心:Ansible
核心模块(core modeles):ansible自带的模块,Ansible模块资源分发到远程节点使其执行特定任务或者匹配一个特定状态
扩展模块(custom modules):如果用户有自己的特殊需求,可以自己添加模块,属于扩展模块
插件(plugins):完成模块的补充功能,借助于插件完成记录日志,邮件等功能
剧本(playbook):ansible的任务配文件,将多个任务定义在剧本中,由ansible自动执行。
连接插件(connection plugins):ansible基于连接插件连接到各个主机,虽然ansible是使用ssh连接到主机的,但是他还有其他连接方法(比如ZeroMQ),所以需要连接插件。
主机列表(host inventory):定义Ansible管理的主机策略,默认是在Ansible hosts配置文件中定义被管节点,同志也支持自定义动态主机清单和指定配置文件的位置
6.Ansible命令介绍
-a:模块的参数,如果执行默认COMMAND的模块
-k:密码认证,默认使用秘钥认证
-K:提示密码使用sudo,sudo表示提权操作
-B:后台运行超时时间
-C:模拟执行测试,但不会真的执行
-f:并行任务数。NUM被指定为一个整数,默认是5
-h:打开帮助文档API
-i:指定库存主机文件的路径,默认为/etc/ansible/hosts
-l:进一步限制所选主机/组模式 –limit=192.168.91.135 只对这个ip执行
-m:执行模块的名字,默认使用command模块
-M:要执行的模块的路径,默认为/usr/share/ansible/
-T:指定SSH默认超时时间, 默认是10S
-u:远程用户,默认是root用户
-v:显示详细信息 用于排错
–version:输出ansible的版本
ansible-doc
-h:示命令参数API文档
-M:查询模块,–module-path=MODULE_PATH 指定模块的路径
-l:显示已存在的所有模块列表
-s:显示playbook制定模块的用法
7.Ansible安装配置
安装
[root@ansible ~]$ yum install -y ansible
查看ansible的版本
[root@ansible ~]$ ansible –version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg #配置文件的位置
configured module search path = [u’/root/.ansible/plugins/modules’, u’/usr/share/ansible/plugins/modules’]
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Apr 2 2020, 13:16:51) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
配置文件
Ansible的配置文件可以存放在任何位置,但配置文件有读取顺序,先Ansible配置做一个基本了解。
ansible的配置文件有查找顺序:
最先查找$ANSIBLE_CONFIG变量
其次查找当前目录下ansible.cfg
然后查找用户家目录下的.ansible.cfg
最后查找/etc/ansible/ansible.cfg(默认)
[root@ansible ~]$cat /etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码
#ask_pass = True #每次执行是否询问ssh密码
#remote_port = 22 #远程主机端口 ssh端口号
host_key_checking = False #跳过检查主机指纹
log_path = /var/log/ansible.log #ansible日志
[privilege_escalation] #如果是普通用户则需要配置提权
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
[root@ansible ~]$ egrep -v ‘#|^$’ /etc/ansible/ansible.cfg
[defaults]
host_key_checking = False
log_path = /var/log/ansible.log
[inventory]
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]
8.Ansible Inventory
ansible的inventory是一种对ansible管理的主机条目进行组织的文件列表,你可以把它当作一个Excel表格,表格中单元格的内容就是你要管理的主机,一般来说是IP地址,你还可以使用group的概念对单元格内容进行分组。
hosts是inventory的基本单元,一般以IP地址的形式展现。 group是inventory的组,可以把hosts进行归类,从而方便进行管理。 inventory的文件位置: 默认情况下,inventory的位置位于/etc/ansible/hosts,但你也可以自己定义一个位置。修改/etc/ansible/cfg的配置文件中的inventory=inventory_file_path,即可自定义inventory的位置。
格式
inventory有两种格式,一种是yaml格式,一种是ini格式。 inventory的主机所有主机都归于all的默认分组里面,并且一个主机要么位于某个你定义的组中,要么属于Ungrouped的状态,也就是无家可归的状态,类似于你属于某个公司,或者你属于自由职业者的意思,但是不管自由职业者,还是非自由职业者,都归于all这个全人类大家庭。
yaml是一种文件格式,yaml是yet another xml的简写,类似于xml或者json的样子用于对条目进行分组管理。如果采用yaml的方式,并不是随便写就可以,而是要遵守以下规定,基本单元必须用hosts来包围,也就是说,ip地址的前面无论如何也得有个hosts打头,然后如果你的分组下面不是直接是hosts的话,那就得写个children,然后children下面再写你的分组名,这种规定感觉有点麻烦,但是规定就是规定。以下是实例,可以看到任何一个http://example.com域下的主机前面都有个Hosts,然后组中有组的话,记得写children
ini格式的格式就比较简单,直接一个方括号,里面写组名即可,组下面如果有组的话,就得这样写[组的组名:组名],比较绕口
基于密码连接
方式一
[root@ansible ~]$ tail -3 /etc/ansible/hosts
172.16.1.45 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=’1′
172.16.1.145 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=’1′
测试
[root@ansible ~]$ ansible web -a ‘hostname’
172.16.1.45 | CHANGED | rc=0 >>
web01
172.16.1.145 | CHANGED | rc=0 >>
web02
方式二
[root@ansible ~]$ tail -3 /etc/ansible/hosts
[webserver]
web[1:2].linux.com ansible_ssh_pass=’1′
测试
[root@ansible ~]$ ansible webserver -a ‘hostname’
web2.linux.com | CHANGED | rc=0 >>
web02
web1.linux.com | CHANGED | rc=0 >>
web01
方式三
[webservers]
web[1:2].linux.com
[webservers:vars] #给webservers 主机组 设置共用 变量
ansible_ssh_pass=’1′
基于密钥连接,需要先创建公钥和私钥,并下发公钥至被控端
创建密钥
[root@ansible ~]$ ssh-keygen
发送密钥
[root@ansible ~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.45
[root@ansible ~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.145
[root@ansible ~]$ ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.163
配置文件
[root@ansible ~]$ cat hosts
[web]
172.16.1.45
172.16.1.145
[lb]
172.16.1.163
[root@ansible ~]$ ansible all -i hosts -a ‘hostname’
172.16.1.145 | CHANGED | rc=0 >>
web02
172.16.1.45 | CHANGED | rc=0 >>
web01
172.16.1.163 | CHANGED | rc=0 >>
lb01
主机组使用
[root@ansible ~]$ cat hosts
[web]
172.16.1.45
172.16.1.145
[lb]
172.16.1.163
[server:children]
lb
web
[root@ansible ~]$ ansible server -i hosts -a ‘hostname’
172.16.1.145 | CHANGED | rc=0 >>
web02
172.16.1.163 | CHANGED | rc=0 >>
lb01
172.16.1.45 | CHANGED | rc=0 >>
web01
列出每个主机组下面的主机情况
[root@ansible ~]$ ansible all -i hosts –list-hosts
hosts (3):
172.16.1.163
172.16.1.45
172.16.1.145