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

相关推荐
乘云数字DATABUFF3 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
悠然南风5 天前
Ansible常见模块总结及LDAP Role 编写与调试
ansible
荣--5 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森5 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜6 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB7 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode8 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220709 天前
如何搭建本地yum源(上)
运维
大树8812 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠12 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql