Ansible自动化运维Ad-Hoc模式详解

Ansible模式
Ansible中有两种模式:分别是ad-hoc模式和playbook模式;
ad-hoc:简而言之,就是“临时命令”,不会保存;
playbook:翻译过来就是剧本,在文件中保存执行的流程;

ansible基础请参照上篇:https://editor.csdn.net/md/?articleId=140516519

编辑ansible主机清单

vim /etc/ansible/hosts
[web]            //组名
host[1:4]
[web:vars]       //组的变量
ansible_ssh_user='root' ansible_ssh_pass='root'

Ad-Hoc-点对点模式

简介:
临时的,在ansible中是指需要快速执行的单条命令,并且不需要保存的命令。对于复杂的命令则为 playbook。
ansible在日常管理时所用的内部指令,比如创建用户、安装软件、启动服务等。

Ad-Hoc模式的命令格式
ansible 主机组名称 -m 模块 -a “具体命令”

常用选项:
-m 指定要使用的模块,不指定默认使用command模块 
-a 指定要执行的具体命令
-i  指定自定义的主机清单配置文件 
-f  一次返回几个结果

ad-hoc 模式执行流程
模块执行的工作流程:
1.主控端命令行执行命令;
2.将模块拷贝到受控端;
3.按照模块定义的操作在受控端执行;
4.返回信息,删除受控端模块;

ansible模块可以使用的前提是:主控端与受控端python版本一致,并且Ansible的模块是幂等执行的

Ansible中常见的返回值

返回值返回值含义
changed几乎所有的Ansible模块都会返回该变量,表示模块是否对远程主机执行了修改操作
failed如果模块未能执行完成,将返回failed为true
msg模块执行失败的原因,常见的错误如ssh连接失败
rc与命令行工具相关的模块会返回rc,表示执行Linux命令的状态码
stdout与rc类似,返回的是标准输出的结果
stderr与rc类似,返回的是标准错误的结果
backup_file所有存在backup选项的模块,用来返回备份文件的路径
results应用在playbook中存在循环的情况,返回多个结果

ansible 常用模块

ansible是模块化的,它所有的操作都依赖于模块。

  • shell模块

shell远程执行命令,shell模快其实就是ansible基本语句+shell命令(正常的shell命令)即可执行。
-a ‘单引号里面写正常的shell命令即可’

//查看web组成员的主机名
ansible web -m shell -a 'hostname' -o -f 2     //-f指指定线程数

在这里插入图片描述

//查看/usr/lib下的文件
ansible web -m shell -a '/usr/lib/'

在这里插入图片描述

  • copy模块

执行以下拷贝命令,将/etc/hosts文件拷贝到其它服务器上
ansible web -m copy -a 'src=/etc/hosts dest=/tmp/2.txt'
 # -a指属性,src指源头,dest指目的地
ansible web -m copy -a 'src=/etc/hosts dest=/tmp/3.txt owner=root group=bin mode=777 backup=yes'
 //backup='yes',表示内容修改后不会被覆盖,会生成新文件,后缀不同

首次复制文件,执行结果为黄色
在这里插入图片描述
再次执行,执行结果为绿色
在这里插入图片描述
此处文件已经复制成功,再次复制,文件内容不发生改变,即测试结果为绿色

黄色:执行命令成功,并且做了修改;
绿色:执行命令成功,只查看信息,没有修改
红色:执行失败,报错
紫色:表示对命令发错的操作有警告信息

src= 源文件路径
dest= 目标文件路径
content= 指定文件内容,只有目标文件;如果文件不存在会创建
owner= 指定属主
group= 指定属组
mode= 指定权限

users模块

  1. 创建用户
ansible web -m user -a 'name=lihao state=present'

**state=present 如果用户 lihao不存在,则创建它;如果已存在,则不做任何更改。**这种方式确保了配置的一致性和可重复性,符合 Ansible 的声明
式配置管理特性。

  1. 修改密码
    生成加密密码
mkpasswd --method=SHA-512 --stdin <<< "1234"
表示将1234生成加密密码
//下面是生成的加密后的密码
$6$tu7bPJuzEcPfTSxo$MVLJdfTGdZv7RtJ70RCCHxxWDiR0EHo3epAfGRiVHTR27Z3lQ21Pw3aH00iz3KEBCjDlmbcIPJIDijkk1bFjd1
ansible webserver -m user -a 'name=lihao password="$6$tu7bPJuzEcPfTSxo$MVLJdfTGdZv7RtJ70RCCHxxWDiR0EHo3epAfGRiVHTR27Z3lQ21Pw3aH00iz3KEBCjDlmbcIPJIDijkk1bFjd1"'   //加密后的密码

测试密码是否修改成功

//随便一个host主机
ssh lihao@host2
lihao@host2's password:  //输入密码
exit    //退出登录

  1. 修改shell
ansible web -m user -a 'name=lihao shell=/sbin/nologin append=yes'   //append=yes 表示追加
  1. 删除用户
ansible web -m user -a 'name=lihao state=absent'  //absent 表示确保用户不存在,如果存在,删除,如果不存在,不执行操作
  • yum模块

升级所有包

ansible host1 -m yum -a 'name="*" state=latest'   //latest 确保安装最新版本
ansible host2 -m yum -a 'name="httpd" state=latest'   //安装最新版本的apache

present(或installed):确保包已安装。
absent(或removed):确保包已移除。
latest:确保安装最新版本。
reinstalled:重新安装包(Ansible 2.4及以上版本支持)。
默认值:present

  • service模块

ansible host2 -m service -a 'name=httpd state=started'   //启动http服务
ansible host2 -m service -a 'name=httpd state=started enabled=yes'  //开机自动启动http服务
ansible host2 -m service -a 'name=httpd state=stopped'   //停止http服务
ansible host2 -m service -a 'name=httpd state=restarted'   //重启http服务
ansible host2 -m service -a 'name=httpd state=started enabled=no'   //开机禁止启动
  • file模块

ansible host1 -m file -a 'path=/tmp/88.txt mode=777 state=touch'   //创建文件88.txt 权限为777
ansible host1 -m file -a 'path=/tmp/99 mode=777 state=directory'   //创建文件夹
  • setup收集模块

ansible host3 -m setup   //查询所有信息
ansible host3 -m setup -a 'filter=ansible_all_ipv4_addresses' //查看ipv4地址

ansible_all_ipv4_addresses # ipv4的所有地址
ansible_all_ipv6_addresses # ipv6的所有地址
ansible_date_time # 获取到控制节点时间
ansible_default_ipv4 # 默认的ipv4地址
ansible_distribution # 系统
ansible_distribution_major_version # 系统的大版本
ansible_distribution_version # 系统的版本号
ansible_domain #系统所在的域
ansible_env #系统的环境变量
ansible_hostname #系统的主机名
ansible_fqdn #系统的全名
ansible_machine #系统的架构
ansible_memory_mb #系统的内存信息
ansible_os_family # 系统的家族
ansible_pkg_mgr # 系统的包管理工具
ansible_processor_cores #系统的cpu的核数(每颗)
ansible_processor_count #系统cpu的颗数
ansible_processor_vcpus #系统cpu的总个数=cpu的颗数*CPU的核数
ansible_python # 系统上的python

  • fetch模块

fetch 从远程某主机获取文件到本地
dest:用来存放文件的目录,例如存放目录为backup,源文件名称为/etc/profile ;那么在主
机中,保存为/backup/master/etc/profile
src:在远程拉取的文件,并且必须是一个file,不能是目录。

ansible host1 -m file -a 'path=/root/a.txt state=touch'   //host4创建a.txt
ansible host4 -m fetch -a "src=/root/a.txt dest=/root/a.txt"
//或者
ansible host4 -m fetch -a "src=/root/a.txt dest=/root/"
  • cron模块

cron 管理crontab计划任务
action:cron backup= #如果设置,则创建一个crontab备份[yes|no]
cron_file= #如果指定,使用这个文件cron.d,而不是单个用户
day= #日应该运行的工作( 1-31, , /2, )
hour= #小时 ( 0-23, , /2, )
minute= #分钟( 0-59, , /2, )
month= #月( 1-12, *, /2, )
weekday= #周 ( 0-6 for Sunday-Saturday, )
job= #指明运行的命令是什么
name= #定时任务描述
reboot #任务在重启时运行,不建议使用,建议使用special_time
special_time #特殊的时间范围,参数:reboot(重启时),annually(每
年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
state #指定状态,present表示添加定时任务,也是默认设置, absent表示删除定时
任务
user #以哪个用户的身份执行


ansible host1 -m cron -a 'name="sync time from ntpserver" minute="*/10"
job="/sbin/ntpdate 192.168.229.59 &> /dev/null" '  //每隔十分钟,从192.168.229.59中对照一次时间

ansible host1 -m cron -a 'name="sync time from ntpserver" state=absent '  //清除计划任务
  • group模块

user用于管理用户的创建与删除,相当于useradd,userdel,usermod;

group模块用于管理用户组的,相当于groupadd,groupdel等。

group 用户组模块,添加或删除组
gid 设置组的GID号
name= 管理组的名称
state 指定组状态,默认为创建,设置值为absent为删除,present创建
system 设置值为yes,表示创建系统组

ansible host1 -m group -a 'name=hdm state=present'  //创建组hdm

ansible host1 -m user -a "name=lihao group=hdm append=yes"  
//添加用户到组,使用 user 模块将用户 lihao 添加到组 hdm
  • script模块

script
在指定节点运行服务端的脚本
示例
将服务器端上的脚本放在节点机器上运行

vim wan.sh
#!/bin/bash
   date > /root/time.txt
ansible host1 -m script -a "./wan.sh"

//host1中查看
cat  time txt.txt
2024年 07月 19日 星期五 15:44:38 CST

ansible host1 -m script -a “./wan.sh”
去host1查看

  • unarchive 解压缩模块

关选项:
src: 必选项, 要解压的包名
dest: 必选项, 解压到哪个目录下
remote_src:
yes: 解压远程主机上的包
no: 将管理机上的包传到远程主机上解压

tar -jcf 1.tar /etc   //打包
ansible host1 -m unarchive -a 'src=/root/1.tar dest=/tmp/'  //解压到/tmp/下

YAML-YAML Ain’t Markup Language-非标记语言

  • 语法
列表
fruits:
  -Apple
  -Orange
  -Strawberry
  -Mango
字典
martin:
  name: Martin D'vloper
 job: Developer     
 skill: Elite
  • 示例
    需求:通过YAML编写一个简单的剧本,完成web的部署,配置,启动的全过程这里实验的环境为"Ansible部署环境"
在ansible服务器上
ansible all -m yum -a 'name=httpd state=removed' -o         #卸载服务器的所有httpd
ansible all -m yum -a 'name=httpd-tools state=removed' -o   #卸载服务器的所有httpd-tools
yum -y install httpd     #安装httpd
mkdir apache
cd apache
cp  /etc/httpd/conf/httpd.conf .
grep '^Listen' httpd.conf 
sed -ri 's/Listen 80/Listen 8080/' httpd.conf    
vim apache.yaml                      //编写剧本
- hosts: webserver
  tasks:                             //总任务
  - name: install apache packages    //第一个任务名字(自定义)
    yum: name=httpd state=present    //第一个任务模块
  - name: copy apache conf           //第二个任务名字
    copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf  //第二个任务模块
    notify: restart apache service    //引用处理程序(notify指通知)     
  - name: ensure apache is running   //第三个任务名字
    service: name=httpd state=started enabled=yes          //第三个任务模块  
  handlers:
  - name: restart apache service for xulei                 //任务 (定义处理程序)
    service: name=httpd state=restarted
//测试剧本
ansible-playbook apache.yaml --syntax-check //检查剧本语法是否正确
ansible-playbook apache.yaml --list-tasks   //列出剧本的任务名字
ansible-playbook apache.yaml --list-hosts   //列出剧本的主机名字
ansible-playbook apache.yaml    //执行剧本 
  • 19
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值