Ansible---自动化运维工具

一、Ansible概述

1.1 Ansible简介

Ansible是一款自动化运维工具,通过ssh对目标主机进行配置、应用部署、任务执行、编排调度等操作。它简化了复杂的环境管理和自动化任务,提高了工作效率和一致性,同时,Ansible的剧本(playbooks)可以使用YAML语言进行编写,易于维护和扩展。

  • Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。
  • Ansible能批量配置、部署、管理上千台主机。比如以前需要切换到每个主机上执行的一或多个操作,使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操作。
  • Ansible是基于模块工作的,它只是提供了一种运行框架,它本身没有完成任务的能力,真正执行操作的是Ansible的模块, 比如copy模块用于拷贝文件到远程主机上,service模块用于管理服务的启动、停止、重启等。
  • Ansible其中一个比较鲜明的特性是Agentless,即无Agent的存在,它就像普通命令一样,并非C/S软件,也只需在某个作为控制节点的主机上安装一次Ansible即可,通常它基于ssh连接来控制远程主机,远程主机上不需要安装Ansible或其它额外的服务。
  • 使用者在使用时,在服务器终端输入命令或者playbooks,会通过预定好的规则将playbook拆解为play,再组织成ansible可以识别的任务,调用模块和插件,根据主机清单通过SSH将临时文件发给远程的客户端执行并返回结果,执行结束后自动删除
  • Ansible的另一个比较鲜明的特性是它的绝大多数模块都具备幂等性(idempotence)。所谓幂等性,指的是多次操作或多次执行对系统资源的影响是一致的。比如执行 systemctl stop xxx 命令来停止服务,当发现要停止的目标服务已经处于停止状态, 它什么也不会做,所以多次停止的结果仍然是停止,不会改变结果,它是幂等的,而 systemctl restart xxx 是非幂等的。
  • Ansible的很多模块在执行时都会先判断目标节点是否要执行任务,所以,可以放心大胆地让Ansible去执行任务,重复执行某个任务绝大多数时候不会产生任何副作用。

1.2 Ansible的特点

  1. 部署简单,只需在主控端部署Ansible环境, 被控端无需做任何操作
  2. 默认使用SSH协议设备进行管理;
  3. 主从集中化管理
  4. 配置简单、功能强大、扩张性强;
  5. 支持API及自定义模块,可以通过Pyhton轻松扩展
  6. 通过playbooks 来定制强大的配置、状态管理
  7. 对云计算平台、大数据都有很好的支持

1.3 Ansible自动运维管理工具的优点

  • 轻量级,更新时,只需要在操作机上进行一次更新即可;
  • 采用 SSH 协议;
  • 不需要去客户端安装 agent;
  • 批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
  • 使用 python 编写的,维护更简单;
  • 支持 sudo 普通用户命令;
  • 去中心化管理。

二、Ansible的数据流向(工作机制)

2.1 内部

加载自己的配置文件,默认/etc/ansible/ansible.cfg

查找对应的主机配置文件,找到要执行的主机或组

加载自己对应的模块文件,如command yum ping

通过ansible将模块命令生成对应临时py文件(pyhton),并将该文件传输至远程服务器上

对应执行用户的家目录的.ansible/tmp/xxx/xxxx.py文件

给文件+执行权限

执行并返回结果,删除临时文件,sleep 0 退出

2.2 外部

三、安装Ansible

3.1安装准备

css 复制代码
[root@localhost ~]#setenforce 0              ##关闭核心防护
[root@localhost ~]#systemctl stop firewalld  #关闭防火墙

3.2 修改主机名

css 复制代码
[root@localhost ~]#hostnamectl set-hostname ansible01
[root@localhost ~]#bash

[root@localhost ~]#hostnamectl set-hostname ansible02
[root@localhost ~]#bash

[root@localhost ~]#hostnamectl set-hostname ansible03
[root@localhost ~]#bash

3.3 给每台机器添加域名

css 复制代码
echo "192.168.10.100 ansible01" >> /etc/hosts
echo "192.168.10.101 ansible02" >> /etc/hosts
echo "192.168.10.102 ansible03" >> /etc/hosts
cat /etc/hosts

3.4 Ansible控制端安装epel源

css 复制代码
[root@localhost ~]#yum install epel-release.noarch -y

3.5 Ansible控制端安装Ansible

css 复制代码
[root@ansible01 ~]#yum -y install ansible

3.6 Ansible控制端安装tree

css 复制代码
yum -y install tree

3.7 查看ansible目录结构

css 复制代码
ls /etc/ansible/
或是
tree /etc/ansible/

3.8 配置Ansible主机清单

css 复制代码
[root@ansible01 ~]#cd /etc/ansible/
[root@ansible01 ansible]#ls
ansible.cfg  hosts  roles
[root@ansible01 ansible]#cp hosts{,.bak}   ##做备份
[root@ansible01 ansible]#ls
ansible.cfg  hosts  hosts.bak  roles
[root@ansible01 ansible]#vim hosts         ##修改配置文件

3.9 设置免密登录

css 复制代码
[root@ansible01 ansible]#ssh-keygen -t rsa
css 复制代码
##第一次设置免密的时候是失败的
[root@ansible01 ansible]#sshpass -p '123' ssh-copy-id root@192.168.10.101

[root@ansible01 ansible]#ssh root@192.168.10.101

##此次设置免密成功
[root@ansible01 ansible]#sshpass -p '123' ssh-copy-id root@192.168.10.101
css 复制代码
##第一次设置免密的时候是失败的
[root@ansible01 ansible]#sshpass -p '123' ssh-copy-id root@192.168.10.102

[root@ansible01 ansible]#ssh root@192.168.10.102

##此次设置免密成功
[root@ansible01 ansible]#sshpass -p '123' ssh-copy-id root@192.168.10.102

四、Ansible相关工具

  • /usr/bin/ansible 主程序,临时命令执行工具
  • /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man ansible-doc -l |grep 关键字 具体模块名字
  • /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
  • /usr/bin/ansible-pull 远程执行命令的工具
  • /usr/bin/ansible-vault 文件加密工具
  • /usr/bin/ansible-console 基于Console界面与用户交互的执行工具
  • /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台

4.1 ansible

格式:

css 复制代码
ansible <host-pattern> [-m module_name] [-a args]
命令     主机或者清单中的组 -m 指定模块      -a  执行的任务

选项:

css 复制代码
--version 					#显示版本
-m module   				#指定模块,默认为command
-v 							#详细过程 -vv -vvv更详细
--list-hosts 				#显示主机列表,可简写 --list
-C, --check   				#检查,并不执行 (检查的是脚本,不是配置文件)
-T, --timeout=TIMEOUT 		#执行命令的超时时间,默认10s
-k, --ask-pass     			#提示输入ssh连接密码,默认Key验证 
-u, --user=REMOTE_USER 		#执行远程执行的用户,默认root
-b, --become    			#代替旧版的sudo 切换
--become-user=USERNAME  	#指定sudo的runas用户,默认为root  vim /etc/sudoers 用户权限
-K, --ask-become-pass  		#提示输入sudo时的口令
-f FORKS, --forks FORKS 	#指定并发同时执行ansible任务的主机数

-v #详细过程 -vv -vvv更详细

css 复制代码
[root@ansible01 ansible]#ansible nginx -a "touch /opt/kgc" -vv

去被管理的那两主机查看

--list-hosts #显示主机列表,可简写 --list

css 复制代码
[root@ansible01 ansible]#ansible nginx --list

[root@ansible01 ansible]#ansible tomcat --list

[root@ansible01 ansible]#ansible all --list
css 复制代码
[root@ansible01 ansible]#ansible 'nginx:tomcat' --list-hosts

[root@ansible01 ansible]#ansible 'nginx:&tomcat' --list-hosts

[root@ansible01 ansible]#ansible 'nginx:!tomcat' --list-hosts

4.2 ansible-doc

格式:

css 复制代码
ansible-doc   模块    #可以看模块的详细信息
css 复制代码
[root@ansible01 ansible]#ansible-doc
css 复制代码
ansible-doc -l				#列出所有已安装的模块,按q退出
css 复制代码
[root@ansible01 ansible]#ansible-doc -l | wc -l
3387
[root@ansible01 ansible]#ansible-doc -s ping      ##显示模块的简单信息

[root@ansible01 ansible]#ansible-doc ping         ##该模块的详细信息
css 复制代码
[root@zzzcentos1 ~]#ansible-doc file
#幂等性,安全性,自己写脚本    按q退出

4.3 ansible-console

css 复制代码
#此工具可交互执行命令,支持tab,ansible 2.0+新增
提示符格式
执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
 
常用子命令:
设置并发数: forks n 例如: forks 10
切换组: cd 主机组 例如: cd web
列出当前组主机列表: list
列出所有的内置命令: ?或help
 
 
root@all (4)[f:5]$ cd nginx
root@nginx (2)[f:5]$ 
root@nginx (2)[f:5]$ forks 1
root@nginx (2)[f:1]$ 
 
 
[root@ansible01 ~]#ansible-console
Welcome to the ansible console.
Type help or ? to list commands.
 
root@all (4)[f:5]$ ping   
#直接使用模块

4.4 playbook

css 复制代码
此工具用于执行编写好的 playbook 任务
范例
ansible-playbook hello.yml
cat hello.yml
---
#hello world yml file
- hosts: websrvs
 remote_user: root
 gather_facts: no
  
 tasks:
    - name: hello world
      command: /usr/bin/wall hello world

五、Ansible 模块

常用模块帮助文档参考:

css 复制代码
https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html
 
 
https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html
https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

用法:

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

命令 主机或者清单中的组 -m 指定模块 -a 执行的任务

5.1 Command 模块

css 复制代码
在远程主机执行命令,不支持管道,重定向等shell的特性。
ansible-doc -s command		#-s 列出指定模块的描述信息和操作动作

command模块是ansible的默认模块

css 复制代码
vim /etc/ansible/ansible.cfg

功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项

注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现

< >(重定向) |(管道符) ;(并行执行) & (后台执行)

注意:此模块不具有幂等性

css 复制代码
[root@ansible01 ansible]#ansible nginx -m command -a "cp /etc/passwd /opt/"

验证:

注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现

css 复制代码
[root@ansible01 ansible]#ansible nginx -a "echo hello > /opt/haha"

[root@ansible01 ansible]#ansible nginx -m shell -a "echo hello > /opt/haha"

5.2 shell 模块

功能 :和command相似,用shell执行命令,支持各种符号,比如:*,$, >

shell 可以用特殊符号,可以用的命令更多

注意:此模块不具有幂等性

css 复制代码
在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令(支持管道符号等功能)
ansible-doc -s shell
css 复制代码
chdir:在远程主机上运行命令的前提进入目录
creates: 判断指定文件是否存在 如果存在 不执行后面的操作 
removes: 判断指定文件知否存在  如果存在 执行后面的操作
css 复制代码
[root@ansible01 ansible]#ansible nginx -m shell -a "echo hahahaha > /opt/test1"

验证:

[root@ansible01 ansible]#ansible web -m shell -a "ifconfig ens33|awk 'NR==2{print}'"

提取出ip地址行

5.3 cron 模块

css 复制代码
在远程主机定义任务计划。其中有两种状态(state):present表示添加(可以省略),absent表示移除。
ansible-doc -s cron				#按 q 退出

5.3.1 制作计划任务

css 复制代码
##制作计划任务
[root@ansible01 ansible]#ansible nginx -m cron -a 'minute="*/5" job="/bin/echo this is kysw" name="kysw crontab"'

[root@ansible01 ansible]#ansible nginx -a 'crontab -l'

验证:

css 复制代码
[root@ansible02 ~]#crontab -l

5.3.2 移除计划任务

css 复制代码
[root@ansible01 ansible]#ansible nginx -m cron -a 'name="kysw crontab" state=absent'

[root@ansible01 ansible]#ansible nginx -a 'crontab -l'

5.4 user 模块

css 复制代码
用户管理的模块
ansible-doc -s user

5.4.1 创建用户

css 复制代码
[root@ansible01 ansible]#ansible nginx -m user -a 'name="lisan"'

[root@ansible01 ansible]#ansible nginx -m user -a 'name="lisi"'

5.4.2 查看创建的用户

css 复制代码
[root@ansible01 ansible]#ansible nginx -a 'tail /etc/passwd'

[root@ansible02 ~]#tail -n3 /etc/passwd

5.4.3 删除创建的用户

css 复制代码
[root@ansible01 ansible]#ansible nginx -m user -a 'name="lisan" state=absent'
css 复制代码
[root@ansible01 ansible]#ansible nginx -m user -a 'name="lisi" state=absent remove=yes'
css 复制代码
[root@ansible02 ~]#tail -n3 /etc/passwd

[root@ansible02 ~]#ls /home/

5.5 group 模块

css 复制代码
用户组管理的模块
ansible-doc -s group

5.5.1 创建myzh组

css 复制代码
[root@ansible01 ansible]#ansible nginx -m group -a 'name=myzh gid=305 system=yes'

5.5.2 查看组

css 复制代码
[root@ansible02 ~]#tail -n5 /etc/group

5.5.3 将用户添加到组中

css 复制代码
[root@ansible01 ansible]#ansible nginx -m user -a 'name="wangwu" uid=305 system=yes group=myzh'

5.5.4 查看用户是否加入到组中

css 复制代码
[root@ansible02 ~]#id wangwu

5.6 copy 模块

css 复制代码
用于复制指定主机文件到远程主机的
ansible-doc -s copy

复制到指定的路径下,并添加权限

验证:

验证:

5.7 file模块

css 复制代码
设置文件属性
ansible-doc -s file

5.7.1 创建文件

css 复制代码
[root@ansible01 ansible]#ansible nginx -m file -a "path=/opt/ceshi.txt state=touch"

5.7.2 删除文件

css 复制代码
[root@ansible01 ansible]#ansible nginx -m file -a "path=/opt/ceshi.txt state=absent"

5.7.3 创建软链接

css 复制代码
[root@ansible01 ansible]#ansible nginx -m file -a "path=/opt/fstab.link src=/opt/fstab.bak  state=link"

5.8 hostname模块

css 复制代码
用于管理远程主机上的主机名
ansible-doc -s hostname
css 复制代码
[root@ansible01 ansible]#ansible tomcat -m hostname -a 'name=kysw'

5.9 ping 模块

css 复制代码
检测远程主机的连通性
ansible-doc -s ping
css 复制代码
[root@ansible01 ansible]#ansible nginx -m ping

[root@ansible01 ansible]#ansible tomcat -m ping

[root@ansible01 ansible]#ansible all -m ping
css 复制代码
[root@ansible01 ansible]#ansible 192.168.10.101 -m ping

[root@ansible01 ansible]#ansible 192.168.10.102 -m ping

[root@ansible01 ansible]#ansible 192.168.10.103 -m ping

5.10 yum 模块

css 复制代码
在远程主机上安装与卸载软件包
ansible-doc -s yum

5.10.1 安装tree

css 复制代码
[root@ansible01 ansible]#ansible tomcat -m yum -a 'name=tree'

验证:

5.10.2 卸载tree

css 复制代码
[root@ansible01 ansible]#ansible tomcat -m yum -a 'name=tree state=absent'

验证:

5.11 service/systemd 模块

css 复制代码
用于管理远程主机上的管理服务的运行状态
ansible-doc -s service

5.11.1 安装httpd服务

css 复制代码
[root@ansible01 ansible]#ansible tomcat -m yum -a 'name=httpd'

5.11.2开启httpd服务

css 复制代码
[root@ansible01 ansible]#ansible tomcat -m service -a 'name=httpd enabled=true state=started'

验证:

5.11.3用Ansible查看服务状态

css 复制代码
[root@ansible01 ansible]#ansible tomcat -a 'systemctl status httpd'

5.12 script 模块

css 复制代码
实现远程批量运行本地的 shell 脚本
ansible-doc -s script

5.12.1 创建一个本地的shell脚本

css 复制代码
[root@ansible01 ansible]#cd /opt/
[root@ansible01 opt]#ls
rh
[root@ansible01 opt]#vim test.sh

#!/bin/bash
echo "hello ansible from script" > /opt/script.txt

[root@ansible01 opt]#ls

[root@ansible01 opt]#chmod +x test.sh

5.12.2 给脚本添加执行权限

5.12.3 远程批量运行本地脚本

css 复制代码
[root@ansible01 opt]#ansible tomcat -m script -a 'test.sh'

验证:

5.12.4 远程查看脚本运行后的文档

css 复制代码
[root@ansible01 opt]#ansible tomcat -a ' cat /opt/script.txt'

5.13 setup 模块

css 复制代码
facts 组件是用来收集被管理节点信息的,使用 setup 模块可以获取这些信息
ansible-doc -s setup

5.13.1 获取mysql组主机的facts信息

css 复制代码
[root@ansible01 opt]#ansible tomcat -m setup

5.13.2 使用filter可以筛选指定的facts信息

css 复制代码
[root@ansible01 opt]#ansible nginx -m setup -a 'filter=ipv4'

[root@ansible01 opt]#ansible nginx -m setup -a 'filter=*ipv4'

正在加载...

总结:

1、ansible模块

1.1 ansible命令格式

css 复制代码
## ansible命令格式
ansible <组名> -m <模块> -a <参数列表>
ansible-doc -l 列出所有已安装的模块  按q退出
ansible-doc -s 模块名 指导模块使用方法

1.2 ansible操作模式

css 复制代码
command                ## 在远程主机执行命令,不支持管道,重定向等shell的特性。
##常用的参数
chdir:  在远程主机上运行命令前提前进入目录
creates:判断指定文件是否存在,如果存在,不执行后面的操作
removes:判断指定文件是否存在,如果存在,执行后面的操作

shell                  ## 在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令(支持管道符号等功能)
cron                   ## 在远程主机定义任务计划。其中有两种状态(state):present表示添加(可以省略),absent表示移除。
user                   ## 用户管理的模块
group                  ## 用户组管理的模块
copy                   ## 用于复制指定主机文件到远程主机的
file                   ## 设置文件属性
hostname               ## 用于管理远程主机上的主机名
ping                   ## 检测远程主机的连通性
yum                    ## 在远程主机上安装与卸载软件包
systemd/service        ## 用于管理远程主机上的管理服务的运行状态
script                 ## 实现远程批量运行本地的 shell 脚本
setup                  ## facts 组件是用来收集被管理节点信息的,使用 setup 模块可以获取这些信息
相关推荐
程序猿小三1 小时前
Linux下基于关键词文件搜索
linux·运维·服务器
虚拟指尖1 小时前
Ubuntu编译安装COLMAP【实测编译成功】
linux·运维·ubuntu
椎4952 小时前
苍穹外卖前端nginx错误之一解决
运维·前端·nginx
刘某的Cloud2 小时前
parted磁盘管理
linux·运维·系统·parted
极验3 小时前
iPhone17实体卡槽消失?eSIM 普及下的安全挑战与应对
大数据·运维·安全
爱倒腾的老唐3 小时前
24、Linux 路由管理
linux·运维·网络
yannan201903133 小时前
Docker容器
运维·docker·容器
_清浅3 小时前
计算机网络【第六章-应用层】
运维·服务器·计算机网络
正在努力的小河3 小时前
Linux 自带的 LED 灯驱动实验
linux·运维·服务器
李子圆圆3 小时前
电力专用多功能微气象监测装置在电网安全运维中的核心价值是什么?
运维·安全