Ansible自动化运维工具及其常用模块(1)

Ansible自动化运维工具及其常用模块(1)

一、Ansible简介

1. Ansible概述

Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Puppet和Saltstack能实现的功能,Ansible基本上都可以实现。

2. Ansible作用

Ansible能批量配置、部署、管理上千台主机。比如以前需要切换到每个主机上执行的一或多个操作,使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操作。

3. Ansible的工作模块

Ansible是基于模块工作的,它只是提供了一种运行框架,它本身没有完成任务的能力,真正执行操作的是Ansible的模块, 比如copy模块用于拷贝文件到远程主机上,service模块用于管理服务的启动、停止、重启等。

4. 常用的自动化运维工具及区别

5. Ansible的主要特点

Ansible其中一个比较鲜明的特性是Agentless,即无Agent的存在,它就像普通命令一样,并非C/S软件,也只需在某个作为控制节点的主机上安装一次Ansible即可,通常它基于ssh连接来控制远程主机,远程主机上不需要安装Ansible或其它额外的服务。
Ansible的另一个比较鲜明的特性是它的绝大多数模块都具备幂等性(idempotence)。所谓幂等性,指的是多次操作或多次执行对系统资源的影响是一致的。比如执行 systemctl stop xxx 命令来停止服务,当发现要停止的目标服务已经处于停止状态, 它什么也不会做,所以多次停止的结果仍然是停止,不会改变结果,它是幂等的,而 systemctl restart xxx 是非幂等的。
Ansible的很多模块在执行时都会先判断目标节点是否要执行任务,所以,可以放心大胆地让Ansible去执行任务,重复执行某个任务绝大多数时候不会产生任何副作用。

6. Ansible的工作机制

使用者在使用时,在服务器终端输入命令或者playbooks,会通过预定好的规则将playbook拆解为play,再组织成ansible可以识别的任务,调用模块和插件,根据主机清单通过SSH将临时文件发给远程的客户端执行并返回结果,执行结束后自动删除

安装ansible ,选择的是yum 安装,简单,ansible的管理端必须是Linux系统

      YUM是一个shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。

      首先得安装EPRL源,然后才能安装ansible。EPEL是一个软件仓库项目,为RHEL和Centos提供它们默认提供的软件包

      yum -y install epel-release

      yum -y install ansible 

    

      yum源用163源的可以安装epel-release,用镜像挂载的没有这个包,自己写的一个简单的163yum源执行脚本

      vim update_yum.sh           

#!/bin/bash

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

cd /etc/yum.repos.d

user_id=`rpm -q centos-release | awk -F"-" '{print $3}'`

if [ $user_id -eq 7 ] ;then

wget http://mirrors.163.com/.help/CentOS7-Base-163.repo 如果脚本执行有问题就输入这条命令,centos7用的比较多

elif [ $user_id -eq 6 ] ;then

wget http://mirrors.163.com/.help/CentOS6-Base-163.repo

elif [ $user_id -eq 5 ] ;then

wget http://mirrors.163.com/.help/CentOS5-Base-163.repo

fi

yum clean all

yum makecache

二、Ansible部署

1. Ansible环境安装部署

服务器

IP地址

主机名

主要软件

管理端

192.168.10.2

ansible

ansible

被管理端

192.168.10.3

node1

-

被管理端

192.168.10.4

node2

-

被管理端

192.168.10.5

node3

-

2. 管理端安装ansible

cd /etc/yum.repos.d

wget http://mirrors.163.com/.help/CentOS7-Base-163.repo

[root@ansible ~]# yum install -y epel-release.noarch

[root@ansible ~]# yum install -y ansible

[root@ansible ~]# ansible --version

3. ansible目录结构

[root@ansible ~]# yum -y install tree

[root@ansible ~]# tree /etc/ansible

/etc/ansible

├── ansible.cfg

├── hosts

└── roles

ansible.cfg

ansible的配置文件,一般无需修改

hosts

ansible的主机清单,用于存储需要管理的远程主机的相关信息

roles

公共角色目录

4. 配置主机清单

[root@ansible ~]# cd /etc/ansible/

[root@ansible ansible]# vim hosts

 

##配置组名

[webservers]

#组里面包含的被管理的主机IP地址或主机名

#主机名需要先修改/etc/hosts文件,更新ip映射

192.168.10.3

192.168.10.4

192.168.10.5

 

[dbservers]

192.168.10.3

192.168.10.4

192.168.10.5

如果配置了/etc/hosts,可以写主机名,例如node1,node2,node3

5. 配置密钥对验证

5.1 生成密钥对

[root@ansible ~]# ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):密钥对存放路径

回车,即使用默认路径

Enter passphrase (empty for no passphrase):输入私钥保护密码

回车,即无密码

Enter same passphrase again:再次输入

回车,即无密码

Your identification has been saved in /root/.ssh/id_rsa. 私钥

Your public key has been saved in /root/.ssh/id_rsa.pub. 公钥

The key fingerprint is:

SHA256:Vzp9tTv3No2kGeSNkYJ1AjTmNBa+7C5388H3tvFk+hw root@ansible

The key's randomart image is:

+---[RSA 2048]----+

| .Xo |

| * oo . |

| oo o.. .|

| ....++ ..|

| S ++.+.. |

| . . o+.o .|

| . o=.E=|

| ... o oo.B@|

| o.. o. .=O|

+----[SHA256]-----+

5.2 复制公钥至node,输入yes和password

[root@ansible ~]# ssh-copy-id root@192.168.10.3

[root@ansible ~]# ssh-copy-id root@192.168.10.4

[root@ansible ~]# ssh-copy-id root@192.168.10.5

截图以node1为例

5.3 验证

[root@ansible ~]# ssh root@192.168.10.3

[root@ansible ~]# ssh root@192.168.10.4

[root@ansible ~]# ssh root@192.168.10.5

三、Ansible命令行模块

命令格式:ansible <组名> -m <模块> -a <参数列表>

ansible-doc -l

列出所有已安装的模块,按q退出

1. command模块

在远程主机执行命令,不支持管道,重定向等shell的特性。

1.1 列出指定模块的描述信息和操作动作

ansible-doc -s command

例:指定组执行ping

在ansible中使用选项-i或--inventory-file指定Inventory

[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m ping

如果第一次没有一次性输完,可以在第二次把剩下的补上

再次ping,就直接OK

如果使用的是默认配置文件(/etc/ansible/hosts),也可以不指定inventory文件

[root@ansible ~]# ansible webservers -m ping

node3 | SUCCESS => {

"ansible_facts": {

"discovered_interpreter_python": "/usr/bin/python"

},

"changed": false,

"ping": "pong"

}

node2 | SUCCESS => {

"ansible_facts": {

"discovered_interpreter_python": "/usr/bin/python"

},

"changed": false,

"ping": "pong"

}

node1 | SUCCESS => {

"ansible_facts": {

"discovered_interpreter_python": "/usr/bin/python"

},

"changed": false,

"ping": "pong"

}

1.2 指定ip(主机)执行操作,如果/etc/ansible/hosts配置文件的组里写的是IP地址,就指定IP地址,如果是主机名,就指定主机名

ansible 192.168.10.3 -m command -a 'date' 查看当前时间

[root@ansible ~]# ansible node1 -m command -a 'date'

node1 | CHANGED | rc=0 >>

2022年 01月 13日 星期四 11:50:28 CST

1.3指定组执行操作

格式

ansible 组名 -m command -a '操作'

只对webservers组中node1操作。通--limit参数限定主机的变更

查看node1当前目录下的所有目录和文件

[root@ansible ~]# ansible webservers -m command -a "ls" --limit "node1"

node1 | CHANGED | rc=0 >>

anaconda-ks.cfg

initalize.sh

查看node1的磁盘使用情况

[root@ansible ~]# ansible webservers -m command -a "df -hT" --limit "node1"

node1 | CHANGED | rc=0 >>

文件系统 类型 容量 已用 可用 已用% 挂载点

/dev/mapper/centos-root xfs 17G 1.1G 16G 7% /

devtmpfs devtmpfs 478M 0 478M 0% /dev

tmpfs tmpfs 489M 0 489M 0% /dev/shm

tmpfs tmpfs 489M 6.8M 482M 2% /run

tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup

/dev/sr0 iso9660 4.3G 4.3G 0 100% /media/cdrom

/dev/sda1 xfs 1014M 125M 890M 13% /boot

tmpfs tmpfs 98M 0 98M 0% /run/user/0

查看webservers组内的所有主机的当前目录下的目录和文件

[root@ansible ~]# ansible webservers -m command -a "ls"

打印当前路径

[root@ansible ~]# ansible webservers -m command -a "pwd"

1.4 all代表所有主机

看似没区别,是因为2个组的组成员是一样的

[root@ansible ~]# ansible all -m command -a "pwd"

node3 | CHANGED | rc=0 >>

/root

node2 | CHANGED | rc=0 >>

/root

node1 | CHANGED | rc=0 >>

/root

1.5 如省略-m模块,则默认运行command模块

[root@ansible ~]# ansible all -a 'pwd'

1.6 常用的参数

chdir:在远程主机上运行命令前提前进入目录

creates:判断指定文件是否存在,如果存在,不执行后面的操作

removes:判断指定文件是否存在,如果存在,执行后面的操作

[root@ansible ~]# ansible all -m command -a "chdir=/root ls ./"

[root@ansible ~]# ansible all -m command -a "creates=/shsfh ls ./"

[root@ansible ~]# ansible all -m command -a "creates=/root ls ./"

[root@ansible ~]# ansible all -m command -a "removes=/root ls ./"

[root@ansible ~]# ansible all -m command -a "removes=/aa ls ./"

2. shell模块

在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开有一个子shell运行命令(支持管段符号等功能)

[root@ansible ~]# ansible-doc -s shell

2.1 创建用户/更改密码

ansible webservers -m shell -a 'useradd test'

ansible webservers -m shell -a 'echo 123456 | passwd --stdin test'

删除用户

ansible webservers -m shell -a 'userdel -r test'

确认用户是否删除

ansible webservers -m shell -a 'tail -3 /etc/passwd'

ansible webservers -m shell -a 'ls /home'

2.2 查看ip

ansible webservers -m shell -a 'ifconfig ens34 | awk "NR==2 {print $2}"'

ansible webservers -m shell -a 'echo $(ifconfig ens34 | awk "NR==2 {print}") |cut -d " " -f 2'

3. cron模块

在远程主机定义任务计划。其中有两种状态(state):present表示添加(默认,可省略),absent表示移除

 

3.1 列出指定模块的描述信息和操作动作

ansible-doc -s cron

3.1 常用的参数

minute/hour/day/month/weekday:分/时/日/月/周

job:任务计划要执行的命令

name:任务计划的名称

3.2 设置计划任务

ansible webservers -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test crontab"'

3.3 查看计划任务

ansible webservers -a 'crontab -l'

3.4 移除计划任务

ansible webservers -m cron -a 'name="test crontab" state=absent'

ansible webservers -a 'crontab -l'

移除计划任务,若该计划任务没有取名字,name=None即可。

若有多个计划任务没有取名字,name=None将批量删除所有未取名任务。

posted @   wang-a  阅读(270)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示