Ansible 自动化运维

一、介绍

1、定义:

ansible是自动化运维工具,基于Python开发,具有批量系统配置、批量程序部署、批量运行命令等功能。

ansible是基于 paramiko(框架) 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块。ansible基于ssh来和远程主机通讯,不需要在远程主机上安装client/agents。

2、ansible 特点:

① 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作,没有agent。

② 默认使用SSH协议对设备进行管理。

③ 有大量常规运维操作模块,可实现日常绝大部分操作。

④ 通过Playbooks(剧本)来定制强大的配置、状态管理。

3、ansible 任务执行模式:

Ansible系统由控制主机对被管节点的操作方式可分为两类,即ad-hoc和playbook:

① ad-hoc(点对点)模式:使用单个模块,支持批量执行单条命令。 ad-hoc 命令是一种可以快速输入的命令,相当于bash中的一句shell。

② playbook(剧本)模式:是Ansible主要管理方式,playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作作的配置文件。

二、ansible 指令

1、安装ansible:

使用yum 安装

yum install epel-release -y

yum install ansible --y

2、ansible配置文件:

列出配置文件:rpm -qc ansible

vim /etc/ansible/ansible.cfg

① sudo_user:设置默认执行命令的用户,sudo_user = root。

② remote_port:这是指定连接的管理端口,默认是22 (SSH端口),remote_port = 22。

③ host_key_checking:设置是否检查SSH主机的密钥。可以设置为True或False,host_key_checking = False。

④ timeout:设置SSH连接的超时间隔,单位是秒,timeout = 60。

⑤ log_path:设置log_path把Ansible系统的输出记录到日志文件中,log_path = /var/log/ansible.log。

3、ansible 命令格式:

ansible <host-pattern> [-f forks] [-m module_name] [-a args]

● <host-pattern> 指定要执行操作的目标主机或主机集合。它可以是一个IP地址,也可以是一个库存文件中定义的主机分组名称。

● [-f forks] 用于设置并发执行任务的最大进程数。

● [-m module_name] 用于指定要使用的Ansible模块,Ansible模块是执行特定任务的独立单元。

● [-a args] 用于传递给指定模块的参数。

4、ansible 秘钥验证:

① 生成秘钥:

ssh-keygen -t rsa

② 向管理的主机发送秘钥:

ssh-copy-id root@IP

三、ad-hoc(点对点)模块的使用

1、设置 hosts 远程被控制主机:

vim /etc/ansible/hosts

定义hosts 有3类:

① Ex 1:未分组的主机,在任何组头之前指定。

② Ex 2:分组的主机。

③ Ex 3:和数据库有关的服务器集合。

ping模块测试连通性:ansible all -m ping

对库存文件中定义的所有主机执行操作,使用的模块是 ping。

2、command 模块:

(1) 介绍:

-m command:指定了使用的模块是 command,command 模块用于在远程主机上执行命令。

选项:

chdir:在执行命令之前,先切换到该目录。

creates=文件名,当这个文件存在,则传递给command模块的命令不执行。

removes=文件名,当这个文件不存在,则传递给command模块的命令不执行。

(2) 实例:

① ansible web -m command -a 'chdir=/app ls'

在web组中的主机执行 ls 命令,执行前先切换到 /app 目录下。

② ansible web -m command -a 'creates=/app/f1 touch /app/f2'

在web组中的主机执行 touch /app/f2 命令,当 /app/f1 文件存在时则不执行。

③ ansible web -m command -a 'removes=/app/f1 touch /app/f2'

在web组中的主机执行 touch /app/f2 命令,当 /app/f1 文件不存在时则不执行。

3、shell 模块:

shell模块用于在远程主机上调用shell解释器运行命令,shell模块可以利用shell的功能,如管道(|)、重定向、变量扩展等。

ansible web -m shell -a 'cat /etc/passwd |grep root'

4、copy 模块:

(1) 介绍:

copy 模块可用于复制文件到远程主机。

用法:

复制文件:-a "src= dest= "

给定内容生成文件:-a "content= dest= "

(2) 实例:

① ansible web -m copy -a "src=/root/app/f3 dest=/app"

把控制端的 /root/app/f3 文件,copy 到被控制端的 /app 下。

② ansible web -m copy -a "content='hello' dest=/app/f3 mode=222 backup=yes"

将被控制端的 /app/f3 文件写入 hello,修改权限为 222,并执行备份操作。

5、file 模块:

(1) 介绍:

Ansible的file模块用于管理和操作远程主机上的文件系统对象,可以方便地创建、删除、修改文件和目录属性,以及管理符号链接。

创建目录:-a "path= state=directory"

创建链接文件:-a "path= src= state=link"

删除文件:-a "path= state=absent"

● state=:

directory:创建目录。

link:创建软链接。

hard:创建硬链接。

touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间。

absent:删除目录、文件或者取消链接文件。

(2) 实例:

① ansible web -m file -a "path=/app/f4 state=directory"

在被控制端,创建f4目录。

② ansible web -m file -a "path=/app/f11 src=/app/f1 state=link"

被控制端的 /app/f1 创建一个软链接 f11。

6、fetch 模块:

从远程某主机获取文件到本地。

dest:用来存放文件的目录。

src:在远程拉取的文件,必须是一个file,不能是目录。

ansible web -m fetch -a "src=/app/f1 dest=/app/"

从远程获取到本地的文件,会保存到以远程主机的IP 为名的目录中,并且保持原文件的目录结构:

7、cron 模块:

(1) 介绍:

cron模块是一个专门用于管理远程主机上定时任务的模块。

常见参数:

name:为Cron任务指定一个唯一名称,用于标识和管理该任务。若定义的名字没有修改,会把前一次定义的计划任务覆盖。

job:指定要运行的命令或脚本是什么。

state:指定状态,present表示添加定时任务,是默认设置;absent表示删除定时任务。

minute, hour, day, month, weekday:指定Cron任务执行的时间单位。

user:指定Cron任务所属的用户,默认是root。

backup:设置为yes时,在修改Cron条目前备份原始Cron配置文件。

(2) 实例:

① ansible web -m cron -a "name='Clear the iptable' minute=*/5 job='/sbin/iptables -F'"

在远程主机上执行定时任务,每5分钟清空一次防火墙。

② ansible web -m cron -a "name='Clear the iptable' minute=*/5 job='/sbin/iptables -F' state=absent"

删除定时任务。

8、yum 模块:

(1) 介绍:

yum 模块用于管理远程主机上的软件包。

常用参数:

name:所安装的包的名称

state:present安装, latest安装最新的, absent 卸载软件。

disable_gpg_check:是否禁止GPG checking,只用于`present' or `latest'。

(2) 实例:

① ansible web -m yum -a "name=dstat state=present disable_gpg_check=yes"

安装dstat 包,忽略gpg_check。

卸载 dstat 包:ansible web -m yum -a "name=dstat state=absent"

② 可以结合copy模块,将安装包发送到远程主机,再安装:

ansible web -m copy -a "src=/root/zabbix-release-3.4-2.el7.noarch.rpm dest=/app"

ansible web -m yum -a "name=/app/zabbix-release-3.4-2.el7.noarch.rpm state=present disable_gpg_check=yes"

9、service 模块:

(1) 介绍:

Ansible的service模块是一个专门用于管理远程主机上系统服务的模块。它提供了对服务进行启动、停止、重启、重新加载、查询状态以及设置开机自启动等操作。

常用参数:

name:服务名称。

state:started启动服务,stopped停止服务,restarted重启服务,reloaded重载配置

enabled #设置开机启动。

(2) 实例:

① 在远程主机安装nginx:

ansible web -m yum -a "name=nginx state=present disable_gpg_check=yes"

② 开启远程主机的nginx 服务:

ansible web -m service -a "name=nginx state=started"

③ 查询远程主机的 80 端口:

ansible web -m shell -a "ss -nutlp |grep 80"

10、user 模块:

(1) 介绍:

常用参数:

name:指定用户名

comment:用户的描述信息

group:指定基本组

groups:指定附加组,如果指定为(groups=)表示删除所有组

home:指定用户家目录

shell:指定默认shell

state:设置帐号状态,不指定为创建,指定值为absent表示删除

uid:指定用户的uid

(2) 实例:

ansible web -m user -a 'name=Bean1 uid=1111 group=bean shell=/bin/bash home=/app/Bean'

删除用户:

ansible web -m user -a "name=Bean1 state=absent"

11、group 模块:

常用参数:

gid:设置组的GID号

name:管理组的名称

state:指定组状态,默认为创建,设置值为absent为删除

ansible web -m group -a 'name=tom state=present'

12、script 模块:

在远程主机上执行服务器端的脚本文件。

实例:

① 在服务器端编写一个脚本:

vim /app/test.sh

#!/bin/bash

date >> /app/disk_total.log

df -lh >> /app/disk_total.log

② 在远程主机上执行该脚本:

ansible web -m script -a '/app/test.sh'

查看文件是否生成:

ansible web -m command -a "chdir=/app ls"

查看文件内容:

ansible web -m shell -a "cat /app/disk_total.log"

13、setup 模块:

facts 组件是 Ansible 用于采集远程机器设备信息的一个功能,可以使用setup 模块查机器的所有facts信息。setup模块下经常使用的一个参数是filter 参数,用于对facts信息进行匹配筛选。

实例:查询10.1.1.60主机的全部信息

ansible 10.1.1.60 -m setup

筛选内存信息:

ansible 10.1.1.60 -m setup -a "filter='*mem*'"

四、Ansible playbook 的使用

1、介绍:

playbook由YMAL语言编写,是ansible用于配置,部署和管理被控节点的剧本。通过 playbook 的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态。

执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是需要大量的操作时候,最好使用playbook。

playbook 方便的重用代码,移植到不同的机器上。

2、语法:

① 文件的第一行应该以 "---" (三个连字符)开始,表明YMAL文件的开始。

② 在同一行中,#之后的内容表示注释。

③ YMAL中的列表元素以"-"开头然后紧跟着一个空格,后面为元素内容。

例如 - apple - banana - orange。

④ 同一个列表中的元素应该保持相同的缩进,否则会被当做错误处理。

⑤ play中hosts,variables,roles,tasks等对象的表示方法都是键值,中间以":"分隔,":"后面还要增加一个空格。

3、Playbooks 配置文件的基础组件:

① hosts:运行指定任务的目标主机。每个playbook都必须指定hosts,可以使用系统默认的/etc/ansible/hosts,也可以自己编辑,在运行的时候加上 -i 选项,指定清单的位置即可。

② remoute_user:在远程主机上执行任务的用户,指定远端主机中的哪个用户来登录远端系统。

③ tasks:任务列表,指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块。

④ templates:包含了模板语法的文本文件。

⑤ variables:变量。

⑥ handlers:由特定条件触发的任务,当某任务的状态在运行后为changed时,可通过"notify"通知给相应的 handlers。

4、Playbooks 的编写与执行:

(1) 编写一个剧本:

vim /etc/ansible/web.yml

在远程主机上安装nginx,将本机上的nginx配置文件拷贝给远程主机,开启nginx服务。


  • hosts: web

remote_user: root

tasks:

  • name: yum install nginx

yum: name=nginx state=latest

  • name: copy nginx.conf

copy: src=/app/nginx.conf dest=/etc/nginx/nginx.conf backup=yes

tags: reloadnginx

  • name: start service

service: name=nginx state=started

tags: startnginx

tags:为任务添加标签。标签可用于在执行Playbook时筛选要执行的任务,例如只运行带有特定标签的任务。

检查剧本的语法:

ansible-playbook /etc/ansible/web.yml --syntax-check

(2) 在剧本中加入handlers 触发任务:

在Ansible剧本(Playbook)中,handlers 起着延迟执行某些特定任务的作用。一个典型的例子是配置Web服务器,如果在剧本中修改了Nginx或Apache的配置文件,可以编写一个handler来重启服务,并在修改配置的任务后面添加notify指令指向该handler,重启服务以使新配置生效。

vim /etc/ansible/web.yml

handlers:

  • name: reload

service: name=nignx state=restarted

(3) 在剧本中加入variables 变量:

① 变量可以不定义在playbook 中,直接在命令行给出。

  • name: start service

service: name={{ servername }} state=started

tags: start{{ servername }}

ansible-playbook web.yml -e servername=nginx -t startnginx

-e servername=nginx 指定变量的值为nginx ; -t startnginx 执行这个标签的操作。

② 变量可以直接定义在playbook 中


  • hosts: web

remote_user: root

vars:

  • servername: nginx

tasks:

  • name: yum install {{ servername }}

yum: name={{ servername }} state=latest

  • name: copy {{ servername }}.conf

copy: src=/app/{{ servername }}.conf dest=/etc/{{ servername }}/{{ servername }}.conf backup=yes

notify: reload

tags: reload{{ servername }}

  • name: start service

service: name={{ servername }} state=started

tags: start{{ servername }}

handlers:

  • name: reload

service: name={{ servername }} state=restarted

执行剧本:

ansible-playbook /etc/ansible/web.yml

检验:查看远程主机的80端口:

五、Ansible Role

1、介绍:

role 是通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中,以层次性、结构化地组织 playbook。

● 目录结构:

① 角色名

② files:存放需要复制到远程主机的静态文件,如证书、配置备份等。

③ handlers:定义事件触发的任务 (main.yml),比如服务重启。

④ tasks:包含主要执行的任务列表 (main.yml)。

⑤ templates:金甲模板,存放模板文件,支持变量替换。

⑥ vars:自定义变量。

2、编写 Role:

(1) 创建目录结构:

cd /etc/ansible

mkdir roles/nginx/{files,handlers,tasks,templates,vars} -p

touch roles/site.yaml roles/nginx/{handlers,tasks,vars}/main.yaml

echo 1234 > roles/nginx/files/index.html

cp /etc/nginx/nginx.conf roles/nginx/templates/nginx.conf.j2

(2) 编写任务:

vim /etc/ansible/roles/nginx/tasks/main.yaml


  • name: install nginx packge

yum: name=nginx state=latest

  • name: copy index.html

copy: src=/etc/ansible/roles/nginx/files/index.html dest=/usr/share/nginx/html/index.html

  • name: copy nginx.conf template

template: src=/etc/ansible/roles/nginx/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf

notify: restart nginx

  • name: make sure nginx service running

service: name=nginx state=started enabled=yes

(3) 编写配置文件:

vim /etc/ansible/roles/nginx/templates/nginx.conf.j2

worker_connections {{ worker_connections }};

(4) 编写变量:

vim /etc/ansible/roles/nginx/vars/main.yaml

worker_connections: 1024

(5) 编写 handlers:

vim /etc/ansible/roles/nginx/handlers/main.yaml


  • name: restart nginx

service: name=nginx state=restarted

(6) 编写剧本:

vim /etc/ansible/roles/site.yaml

  • hosts: 10.1.1.60

roles:

  • nginx

3、执行 Role:

(1) 语法测试:

ansible-playbook site.yaml --syntax-check

(2) 执行:

ansible-playbook /etc/ansible/roles/site.yaml

相关推荐
wanhengidc1 小时前
短视频运营行业该如何选择服务器?
运维·服务器
雨中rain1 小时前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++
-KamMinG1 小时前
Centos7.9安装openldap+phpldapadmin+grafana配置LDAP登录最详细步骤 亲测100%能行
运维·grafana
沛沛老爹1 小时前
什么是 DevOps 自动化?
大数据·ci/cd·自动化·自动化运维·devops
永恒,怎么可能1 小时前
关于博客系统的自动化功能测试报告
自动化·测试
Bessssss1 小时前
centos日志管理,xiao整理
linux·运维·centos
豆是浪个2 小时前
Linux(Centos 7.6)yum源配置
linux·运维·centos
vvw&2 小时前
如何在 Ubuntu 22.04 上安装 Ansible 教程
linux·运维·服务器·ubuntu·开源·ansible·devops
王铁柱子哟-2 小时前
解决 正在下载VS Code 服务器... 问题
运维·服务器
chinayu20072 小时前
虚拟机桥接模式
linux·运维·桥接模式