一、概述
Ansible是一种开源的自动化工具,用于自动化任务的执行、配置管理和应用部署。它采用基于Python编写的简单、轻量级的语法,可以通过SSH协议远程管理和配置多台计算机。
Ansible的主要特点包括:
1、简单易用:设计简单,语法清晰,无需特殊培训即可上手使用。
2、基于模块化的架构:使用各种内置和第三方的插件和模块,可以轻松地扩展功能。
3、配置管理:可以管理各种操作系统、网络设备和云平台等的配置。
4、任务自动化:可以自动执行各种任务,如软件安装、服务启停等。
5、基于剧本(Playbook)的自动化:可以编写剧本来定义一系列任务和配置,实现复杂的自动化流程。
6、可扩展性:可以与其他工具和平台集成,如监控系统、版本控制工具等。
二、工作原理
Ansible的工作原理基于以下几个核心概念:
1、控制节点(Control Node):控制节点是指安装了Ansible的机器,可以是任何一台可以访问到被管理节点的计算机。在控制节点上,管理员可以编写Ansible的配置文件和剧本,然后使用Ansible命令行工具来执行这些任务。
2、主机清单(Inventory):主机清单是一个文本文件,用于定义被管理节点的主机列表和相关的配置信息。其中可以包含主机名、IP地址、SSH连接信息等。管理员可以根据需要在主机清单中组织和分类主机。
3、模块(Modules):模块是Ansible的核心组成部分,用于执行特定的任务。Ansible自带了众多内置模块,如文件操作、软件包管理、服务管理等。管理员可以通过在剧本中使用模块来指定需要执行的任务,并传递参数。
4、剧本(Playbook):剧本是一个定义了一系列任务和配置的YAML格式文件。通过剧本,管理员可以描述需要在被管理节点上执行的操作。剧本由一个或多个Play组成,每个Play包含了一组任务和要操作的主机列表。
5、执行流程:管理员在控制节点上编写好剧本,然后使用Ansible命令行工具执行剧本。当执行命令时,Ansible会首先与被管理节点建立SSH连接,然后将剧本分发到被管理节点上,并在每个节点上按照剧本定义的任务进行执行。执行完成后,Ansible会将执行结果返回到控制节点。
三、ansible的应用
Ansible没有客户端,也不需要在被管理主机添加任何代理程序,通过SSH完成底层通信,而SSH在Linux的发型版本中默认已经安装并启用,而在Windows系统下则依赖于PowerShell,Ansible要求管理端必须是Linux系统,在管理节点通过应用模块将指令发送到被管理主机上,并在执行完毕后自动删除产生的临时文件,根据Ansible使用过程中不同角色,可将其分为三个部分。
1、使用者如何使用Ansible实现自动化运维?
2、Ansible的工具集,Ansible可以实现的功能?
3、作用对象,Ansible可以影响哪些主机?
四、ansible的使用者
1、CMDB:CMDB系统存储和管理着企业IT架构中的各种配置信息,是构建ITL项目核心工具,运维人员可以组合CMDB和Ansible,通过CMDB直接下发指令调用Ansible工具完成操作者所希望达到的目标。
2、PUBLIC/PRIVATE方式,Ansible除了丰富的内置模块外,同时提供丰富的API语言接口,如PHP,Pythone,PERL等多种流行语言,基于PUBLIC/PRIVATE,Ansible以API调用的方式运行。
3、Ad-Hoc命令集,Users直接通过Ad-Hoc命令集调用Ansible工具来完成工作。
4、Playbooks:Users预先编写好Ansible Playbooks,通过执行Playbooks中预先编排好的任务集按序执行命令。
五、ansible的工具集合
Ansible工具集合了inventory,Moudles,Plugins和API。其中,inventory用来管理设备列表,可以通过分组(不同的业务)实现,对组的调用直接影响组内所有的主机;Moudles是各种执行模块,几乎所有的管理任务都是通过模块来执行的;Plugins提供了各种附加功能;API为编程人员提供了一个调用接口,可以做Ansible的二次开发具体表现如下:
1、Ansible Playbook:任务脚本,编排定义Ansible任务集的配置文件,由Ansible按序依次执行,通常是JSON格式的YML/YAML文件;
2、inventory:Ansible管理主机清单
3、Moudle:Ansible执行命令功能模块,多数为内置的核心模块也可以用户自定义;
4、Plugins:模块功能的补充,如连接类型插件,循环插件,变量插件,过滤插件等,该功能不常用。
5、API:提供第三方程序调用的应用程序编程接口;
六、作用对象
Ansible的作用对象不仅仅是Linux和非Linux操作系统的主机,也可以作用于各类PUBLIC/PRIVATE,商业和非商业设备的网络设施。
使用者使用Ansible或Ansible-playbooks时,在服务器终端输入Ansible的Ad-Hoc命令集或playbooks后,Ansible会遵循预先定义安排的规则将Playbooks逐步拆解为Play,再将Play组织成Ansible可以识别的任务,随后调用任务涉及的所有模板和插件,根据inventory中自定义的主机列表通过SSH将任务集以临时文件或命令的形式传输给远程客户端执行并返回执行结果,如果是临时文件则执行完毕后自动删除。
七、准备工作
1、准备三台或多台服务器
2、三台主机关闭防火墙
3、三台主机互相通联
4、三台主机互相配置ssh免密登录
八、安装部署
三台主机都按照ansible
yum -y install ansible
修改主机的配置文件
vim /etc/ansible/hosts
到最后一行插入
[syh] 组名
192.168.77.111 成员ip
192.168.77.115 成员ip
ok这样ansible就配置完成了
九、ansible的使用
ansible命令格式:ansible 要执行命令的组 -m 要使用的模块 -[选项] 指定模块参数
在ansible中有3000多个模块,ansible通过模块来控制组中的成员执行命令,修改文件内容,安装软件等这里只写几个常用的模块
配置完成后测试
ansible -i /etc/ansible/hosts syh -m ping
这里-i选项表示inventory 默认为/etc/ansible/hosts
-m表示指定模块
ping是一个模块用来测试
1、command模块
command模块在远程主机执行命令,但是不支持管道,重定向等shell的特征,常用参数如下(不支持管道,不建议使用)。
-
chdir:在远程主机上运行命令前要提前进入的目录
-
creates:在命令运行时创建一个文件,如果文件已经存在,则不会创建任务
-
removes:在命令运行时移除一个文件,如果文件不存在,则不会执行移除任务
-
executable:指明运行命令的shell程序
远程查看组中成员家目录的内容
ansible syh -m command -a "chdir=/root ls -l"
查看组成员的的时间和平均负载
ansible syh -m command -a "uptime"
2、shell模块
shell模块在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令,和command模块的区别是它支持shell特征,如管道,重定向等。
重定向
ansible syh -m shell -a "echo 111 > 1.txt"
测试管道符
ansible syh -m shell -a 'ifconfig ens33 | awk 'NR==2' "
3.raw模块
最原始的方式运行命令(不依赖python,仅通过ssh实现)
清除yum缓存
ansible syh -m raw -a "yum clean all"
4、copy模块
copy模块用于复制指定主机文件到远程主机的指定位置,常见参数如下
-
dest:指出复制文件的目标目录位置,使用绝对路径。如果源是目录,指目标也要是目录,如果目标文件已经存在会覆盖原有内容。
-
src:指出源文件的路径,可以使用相对路径或绝对路径,支持直接指定目录,如果源是目录则目标也要是目录
-
mode:指出复制时,目标文件的权限 可选
-
owner:指出复制时,目标文件的属主 可选
-
group:指出复制时,目标文件的属组 可选
-
content:指出复制到目标主机上的内容,不能与src一起使用,相当于复制content指明的数据到目标文件中
特别提示:
参数:backup=yes===>意思是,如果目标路径下,有与我同名但不同内容的文件时,在覆盖前,对目标文件先进行备份。
所有被管理端节点必须安装libselinux-python包
将syh组中主机的/etc/hosts文件拷贝到/tmp下 指定权限为777 更改属主为syh更改属组为root
ansible syh -m copy -a "src=/etc/hosts dest=/tmp mode=777 owner=Rich group=root"
查看
5、yum模块
Yum模块基于yum机制,对远程主机管理程序包,常用参数如下。
-
name:程序包的名称,可以带上版本号,如不指定版本号默认安装为最新版本
-
state=present | latest | absent:指明对程序包执行的操作,present表示安装程序包,latest表示安装最新版本的程序包,absent表示卸载程序包
-
disablerepo:在用yum安装时禁用某个仓库的ID
-
enablerepo:在用yum安装时启用某个参考的ID
-
conf_file:yum运行时的配置文件而不是使用默认的配置文件
-
diable_gpg_check=yes | no:是否启用完整性校验功能
在组成员中安装dns服务
ansible syh -m yum -a "name=bind state=present"
查看
7.service模块
Service模块为用来管理远程主机上的服务的模块,常见参数如下:
-
name:被管理的服务名称
-
state=started | stopped | restarted:动作包含启动关机或重启
-
enabled=yes | no:表示是否设置该服务开机自启动
-
runlevel:如果设定了enabled开机自启动,则要定义在哪些运行目标下自启动
启动组成员中http服务,并设置为开机自启
ansible syh -m service -a "name=httpd state=started enabled=yes"
查看
8、user模块
User模块用于管理远程主机上的用户账户,常见参数如下:
-
name:必选参数 账号名称
-
state=present | absent:创建账号或者删除账号,present表示创建,absent表示删除
-
system=yes | no:是否为系统账号
-
uid:用户UID
-
group:用户的基本组
-
groups:用户的附加组
-
shell:默认使用的shell
-
home:用户的家目录
-
move_home=yes | no:如果设置的家目录已经存在,是否将已经存在的家目录进行移动
-
password:用户的密码,建议使用加密后的字符串
-
comment:用户的注释信息
-
remove=yes | no:当state=absent时,是否删除用户的家目录
创建一个程序用户
ansible syh -m user -a 'name=user1 system=yes uid=502 group=root groups=sshd shell=/sbin/nologin home=/home/user1 password=user1 comment="test user"'
9、script模块
script模块能够实现远程服务器批量运行本地的shell脚本
vim /opt/file.sh 在opt目录下创建一个创建20个测试文件的脚本
#!/bin/bashtouch /tmp/file{1..20}.txt
查看
十、playkook(剧本)的使用
playbook格式:ansible-playbook -[选项] 编写的yml文件路径
Playbook配置文件使用YAML语法,具有简洁明了,结构清晰等特点。Playbook配置文件类似于shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表,前面介绍的ansible命令虽然可以完成各种任务,但是当配置一系列任务时,逐条输入命令就显得效率非常低下,更有效的方式在playbook配置中配置所有的任务代码,利用ansible-playbook命令执行该文件,可以实现自动化运维,YAML文件的扩展名通常为.yaml或.yml。
YAML语法和其他高级语言类似,其结构通过缩进来展示,通过“-“来表达选项,通过冒号“:”来分隔键和值。整个文件以“---”开始并以“…”结束。
1、playbook选项
--syntax-check:检测yaml文件的语法
-C(--check):测试,不会改变主机的任何配置
--list-hosts:列出yaml文件影响的主机列表
--list-tasks:列出yaml文件的任务列表
--list-tags:列出yaml文件中的标签
-t TAGS(--tags=TAGS):表示只执行指定标签的任务
--skip-tags=SKIP_TAGSS:表示除了指定标签任务,执行其他任务
--start-at-task=START_AT:从指定任务开始往下运行
2、修改配置文件(方便测试)
vim /etc/ansible/hosts
[test1]
192.168.77.112[test2]
192.168.77.115
3、编写playbook
所有的“-”和“:”后面均有空格,而且要注意缩进和对齐
Playbook的核心元素包含:
-
hosts:任务的目标主机,多个主机用冒号分隔,一般调用/etc/ansible/hosts中的分组信息
-
remote_user:远程主机上,运行此任务的默认为root运行
-
tasks:任务,即定义的具体任务,由模块定义的操作列表
-
handlers:触发器,类似tasks,只是在特定的条件下才会触发任务。某任务的状态在运行后changed时,可通过“notify”通知给相应的handlers进行触发执行。
-
roles:角色,将hosts剥离出去,由tasks,handlers等所组成的一种特定的结构集合。
vim /etc/ansible/test1.yml--- #开头格式(可忽略)
- hosts: test1 #表示对test01(192.168.77.112)的操作remote_user: root #远端执行用户身份roottasks: #任务列表- name: adduser #任务名称user: name=user2 state=present #执行user模块创建用户tags: #创建tag标签- testa #tag标签为testa- name: addgroup #任务名称group: name=tests system=yes #执行group模块创建一个组账号tags: #创建tag标签- testb #tag标签为testb
- hosts: test2 #表示对test02(192.168.77.115)的操作remote_user: root #远端执行用户身份roottasks: #任务列表- name: cf #任务名称copy: src=/etc/passwd dest=/home #执行copy模块复制文件tags: #创建tag标签- testc #tag标签为testsc
... #结尾格式(可忽略)
测试palybook
ansible-playbook -C /etc/ansible/test.yml
没有报错就可以执行了(有些特殊情况就算没有报错也会执行失败)
执行
十一、触发器
需要触发才能执行的任务,当之前定义在tasks中的任务执行完成后,若希望在基础上触发其他的任务,这时就需要定义handlers。例如,当通过ansible的模块对目标主机的配置文件进行修改之后,如果任务执行成功,可以触发一个触发器,在触发器中定义目标主机的服务重启操作,以使配置文件生效,handlers触发器具有以下优点。
-
handlers是Ansible提供的条件机制之一,handlers和task很类似,但是他在被task通知的时候才会触发执行
-
handlers只会在所有任务执行完成后执行,而且即使被通知了多次,它也只会执行一次,handlers按照定义的顺序依次执行
--- //固定开头格式
- hosts: test1 //指定运行主机为test01组remote_user: root //指定对端运行用户的身份tasks: //任务列表- name: change port //定义任务名称command: sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.conf//模块为command:使用sed命令替换监听端口为8080notify: //完成任务后调用restart httpd server触发器- restart httpd server handlers: //配置触发器- name: restart httpd server //指定触发器名字service: name=httpd state=restarted //指定触发条件为重启httpd服务
测试playbook (没有报错)
执行playbook(成功)
十二、变量
vim /etc/ansible/test_vars.yml 编写自定义变量
---
- hosts: allvars: #定义变量- names: "cloud" #第一个name变量age: "3" #第二个age变量tasks:- name: "{{ names }}" #{{}}两对大括号引用变量,变量名两头空格shell: echo "myname {{ names }},myage {{ age }}"register: var_result- debug: var=var_result
...
图中红色的就是刚才定义的变量
十三、playbook中的角色
将多种不同的tasks的文件集中存储在某个目录下,则该目录就是角色,角色一般存放在/etc/ansible/roles/目录中,可通过ansible的配置文件来调整默认的角色目录。/etc/ansible/roles目录下有很多的子目录,其中每一个子目录对应一个角色。每个角色也有自己的目录结构。
/etc/ansible/roles/为角色集合,该目录下有自定义的各个子目录
-
mariadb:mysql角色
-
apache:httpd角色
-
nginx:nginx角色
每个角色的定义,以特定的层级目录结构进行组织,以Mariadb(mysql角色) 为例
-
files:存放copy或script等模块调用的文件
-
templates:存放template模块查找所需要的模板文件的目录,如mysql配置文件等模板
-
tasks:任务存放目录
-
handlers:存放相关触发执行器的目录
-
vars:变量存放的目录
-
meta:用于存放此角色元数据
-
default:默认变量存放目录,文件中定义了此角色使用的默认变量
上述目录中tasks,handlers,vars,meta,default至少应该包含一个main.yml,该目录下也可以有其他的yml文件,但是需要在main.yml文件中用include指定将其他.yml文件包含进来。
十三、用ansible-playbook给成员安装mariadb
创建数据库角色
mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
vim /etc/ansible/mariadb.yml 创建mariadb角色
---
- hosts: test1:test2 需要执行的主机remote_user: root 执行的用户roles: - mariadb 角色
...
cd /etc/ansible/roles/mariadb/tasks 进入任务存放目录
vim main.yml 编写任务
--- //固定开头格式
- name: install mariadb //指定任务名称安装mariadb数据库yum: name=mariadb-server state=present //执行yum模块安装mariadb
- name: move config file //指定任务名称移除原有配置文件shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak" //判断有就移除
- name: provide a new config file //创建一个新的配置文件copy: src=my.cnf dest=/etc/my.cnf //src源会自动到files文件去找my.cnf文件
- name: reload mariadb //指定任务名称为重启mariadbshell: systemctl restart mariadb //shell模块重启
- name: create database testdb //按要求添加执行如下sql语句shell: mysql -u root -e "create database testdb;grant all privileges on testdb.* to test@192.168.77.% identified by 'test123';flush privileges;"notify: //配置触发器- restart mariadb //为重启mariadb
...
cd ../handlers/ 进入触发器文件
vim main.yml 编写触发器
---
- name: restart mariadb //引用上面配置的触发器service: name=mariadb state=restarted //触发后重启mariadb
...
cd ../files/
cp /etc/my.cnf /etc/ansible/roles/mariadb/files/
ls
my.cnf //准备my.cnf文件
cd /etc/ansible/
tree
测试(成功)
执行成功
以上就是ansible的基本使用
如有错误欢迎各位大佬批评指正,我们共同进步