Ansible

Ansible开源自动化工具

一、 Ansible介绍

Ansible 是一种 IT 自动化工具。它可以配置管理,部署软件以及协调更高级的 IT 任务, 例如持续部署,滚动更新。 Ansible 适用于管理企业 IT 基础设施,从 几十台到上百台的服务器环境。Ansible 也是一种简单的自动化语言,可以完美 地描述 IT 应用程序基础结构。

官方文档:https://docs.ansible.com

ansible是一种由Python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

特点:

  • 部署简单
  • 默认使用ssh进行管理,基于python里的paramiko模块开发
  • 管理端和被管理端不需要启动服务
  • 配置简单,功能强大,扩展性强
  • 能过playbook(剧本)进行多个任务的编排


二、特点

简单 -- 减少学习成本

• 易读的描述语言

• 无需特殊编码技能

• 任务按顺序执行

强大 -- 协调应用程序生命周期

• 应用部署

• 配置管理

• 工作流程编排

无代理 -- 可预测,可靠和安全

• 无代理架构

• 使用 OpenSSH 通信

• 没有代理维护成本

三、架构

四、核心组件

Inventory:Ansible 管理的主机信息,包括 IP 地址、 SSH 端口、账号、密码 等;

• Modules:任务均有模块完成,也可以自定义模块,例如经常用的脚本;

• Plugins:使用插件增加Ansible 核心功能,自身提供了很多插件, 也可以自

定义插件。例如 connection 插件, 用于连接目标主机。 callback 插件可以将 结果输出到其他地方。vars 插件将定义的比变量注入到Ansible 中运行。

• Playbooks:"剧本",模块化定义一系列任务,供外部统一调用。Ansible 核心功能。

五、认识自动化运维

问题:

假设我要去1000台服务上做一个操作(如nginx服务器修改配置文件里的某一个参数), 下面两种方法缺点明显:

  1. 按传统的方法, 一台连着一台服务器的ssh上去手动操作。

    缺点:

    • 效率太低。
  2. 写个shell脚本来做。

    缺点:

    • 管理的机器平台不一致,脚本可能不具备通用性。

    • 传密码麻烦(在非免密登录的环境下, 需要expect来传密码)

    • 效率较低,循环1000次也需要一个一个的完成,如果用&符放到后台执行,则会产生1000个进程。

自动化运维 : 将日常IT运维中大量的重复性工作,小到简单的日常检查、配置变更和软件安装,大到整个变更流程的组织调度,由过去的手工执行转为自动化操作,从而减少乃至消除运维中的延迟,实现"零延时"的IT运维。

六、主要关注的方面

假如管理很多台服务器,主要关注以下几个方面:

  1. 管理机与被管理机的连接(管理机如何将管理指令发送给被管理机)

  2. 服务器信息收集 (如果被管理的服务器有centos7.5外还有其它linux发行版,如suse,ubuntu等。当你要做的事情在不同OS上有所不同,你需要收集信息,并将其分开处理)

  3. 服务器分组(因为有些时候我要做的事情不是针对所有服务器,可能只针对某一个分组)

  4. 管理内容的主要分类

  • 文件目录管理(包括文件的创建,删除,修改,查看状态,远程拷贝等)

  • 用户和组管理

  • cron时间任务管理

  • yum源配置与通过yum管理软件包

  • 服务管理

  • 远程执行脚本

  • 远程执行命令

七、自动化运维工具对比

  1. puppet(拓展)

    基于ruby语言,成熟稳定。适合于大型架构,相对于ansible和saltstack会复杂些。

  2. saltstack(拓展)

    基于python语言。相对简单,大并发能力比ansible要好, 需要维护被管理端的服务。如果服务断开,连接就会出问题。

  3. ansible

    基于python语言。简单快捷,被管理端不需要启服务。直接走ssh协议,需要验证所以机器多的话速度会较慢。

八、Ansible环境搭建

一、实验准备三台机器,一台管理机,两台被管理机

第一台管理机 主机名 hd1 192.168.115.3

第二台被管理机 主机名 hd2 192.168.115.4

第三台被管理机 主机名 hd3 192.168.115.5


所有主机都要配置hosts文件

bash 复制代码
vim /etc/hosts

二、三台机器的配置

关闭防火墙,图形化,时间同步

bash 复制代码
systemctl restart ntpd

开机启动

bash 复制代码
systemctl enable ntpd 

四、配置yum源

bash 复制代码
yum -y install epel-release

管理机上安装ansible

bash 复制代码
yum install ansible

主服务 输入

bash 复制代码
ssh-keygen

查看结果

将ssh下的秘钥对分别拷贝到两个被管理服务中

bash 复制代码
ssh-copy-id -i 192.168.115.4

提示结果如下

来到192.168.115.4 查看验证

同样的方法 上传查看192.168.115.5

bash 复制代码
ssh-copy-id -i 192.168.115.5

五、更改配置文件并验证

bash 复制代码
vim /etc/ansible/hosts
bash 复制代码
ansible -m ping 192.168.115.4
bash 复制代码
ansible -m ping 192.168.115.5

你Ping ip 他会给你回应一个 Pang

就是 乒乓乒乓 (#^.^#) !

这里面的验证结果分为三种颜色

绿色说明没有变化

黄色说明更改或者变化成功

红色代表失败

不光只能Ping IP

Ping群组也可以显示成功

bash 复制代码
ansible -m ping webserver
bash 复制代码
ansible -m ping all

也可以成功验证

六、主机给主机设置免密

bash 复制代码
ssh-copy-id -i 192.168.115.3

验证结果

显示成功

批量创建 ip为 115.1 到 115.5 的五台机器

输入

bash 复制代码
vim /etc/ansible/hosts

进入后更改

bash 复制代码
ansible -m ping webserver

验证显示三台成功,两台失败

因为只配置了三台机器 分别是 3 4 5

所以 1 2失败


bash 复制代码
vim /etc/ansible/hosts

进入配置文件更改

到 115.4 更改文件

bash 复制代码
vim /etc/ssh/sshd_config

将监听端口号改为 2222

重启服务

bash 复制代码
systemctl restart sshd

查看端口号是否成功启用

bash 复制代码
netstat -anptu | grep 2222

将 192.168.115.3 这台机器更改别名为nginx1

bash 复制代码
vim /etc/ansible/hosts

进入后在第一行输入

bash 复制代码
nginx1 ansible_ssh_host=192.168.115.4 ansible_ssh_port=2222

ping nginx1

bash 复制代码
ansible -m ping nginx1

如果将配置文件 改为 [web] nginx1 也可以成功ping通

七、ansible模块

查看所有支持的模块

bash 复制代码
ansible-doc -l

查看ping 模块的使用方法

bash 复制代码
ansible-doc ping
bash 复制代码
ansible web -m ping

这个命令是使用Ansible来执行ping模块对名为"web"的主机进行测试连接的操作

八、hostname模块

bash 复制代码
ansible web -m hostname -a 'name=agent1.com'

九、file模块

一、创建一个目录

注意主机要记得自己给自己做个免密

bash 复制代码
ssh-copy-id 192.168.115.3

输入命令创建目录

bash 复制代码
ansible web -m file -a 'path=/test state=directory'

提示三台机器创建成功

二、创建一个文件

bash 复制代码
ansible web -m file -a 'path=/test/111 state=touch'

显示结果应该是三台机器都是黄色 则表示创建成功


三、递归修改owner,group,mode

bash 复制代码
ansible group1 -m file -a 'path=/test recurse=yes owner=bin group=daemon mode=1777'

四、删除目录 absent 缺席的(连同目录里的所有文件)

bash 复制代码
ansible web -m file -a 'path=/test state=absent'

五、创建文件并指定owner,group,mode等

bash 复制代码
ansible group1 -m file -a 'path=/tmp/111 state=touch owner=bin group=daemon mode=1777'

六、删除文件

bash 复制代码
ansible group1 -m file -a 'path=/tmp/111 state=absent'

七、创建软链接文件

bash 复制代码
ansible web -m file -a 'src=/etc/fstab path=/tmp/fstab state=link'

八、创建硬链接

bash 复制代码
ansible group1 -m file -a 'src=/etc/fstab path=/tmp/fstab2 state=hard'

十、stat模块

stat模块类似linux的stat命令,用于获取文件的状态信息。

获取/etc/fstab文件的状态信息

bash 复制代码
ansible group1 -m stat -a 'path=/etc/fstab'

显示结果

十一、copy模块

copy模块用于对文件的远程拷贝操作(如把本地的文件拷贝到远程的机器上)

一、在master上准备一个文件,拷贝此文件到group1的所有机器上

bash 复制代码
echo master > /tmp/222
bash 复制代码
ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333'

二、使用content参数直接往远程文件里写内容(会覆盖原内容)
注意:ansible中-a后面的参数里也有引号时,记得要单引双引交叉使用,如果都为双引会出现问题

bash 复制代码
ansible web -m copy -a 'content="ha ha\n" dest=/tmp/333'

将 ha ha 写入 tmp/333 中 并替换原来333中的内容

三、使用force参数控制是否强制覆盖
如果目标文件已经存在,则不覆盖

bash 复制代码
ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333 force=no'

因为 tmp下已经有333 的文件 所以验证结果是三个绿 查看 tmp下的333没有变化

如果目标文件已经存在,则会强制覆盖

bash 复制代码
ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333 force=yes'

验证

因为覆盖掉了之前tmp下的333,所以,里面内容更改为默认的master

四、使用backup参数控制是否备份文件
backup=yes表示如果拷贝的文件内容与原内容不一样,则会备份一份
group1的机器上会将/tmp/333备份一份(备份文件命名加上时间),再远程拷贝新的文件为/tmp/333

bash 复制代码
ansible web -m copy -a 'src=/etc/fstab dest=/tmp/333 backup=yes owner=daemon group=daemon mode=1777'

验证

五、copy模块拷贝时要注意拷贝目录后面是否带"/"符号
/etc/yum.repos.d后面不带/符号,则表示把/etc/yum.repos.d整个目录拷贝到/tmp/目录下

bash 复制代码
ansible group1 -m copy -a 'src=/etc/yum.repos.d dest=/tmp/'

将整个yum.repo.d拷贝到tmp下

/etc/yum.repos.d/后面带/符号,则表示把/etc/yum.repos.d/目录里的所有文件拷贝到/tmp/目录下

bash 复制代码
ansible group1 -m copy -a 'src=/etc/yum.repos.d/ dest=/tmp/'

将yum.repo.d 下的文件拷贝到tmp下

验证

六、练习 1

在master上配置好所有的yum源,然后拷贝到group1的远程机器上(要求目录内的内容完全一致)

bash 复制代码
ansible group1 -m file -a "path=/etc/yum.repos.d/ state=absent"
bash 复制代码
 ansible web -m copy -a "src=/tmp/yum.repos.d dest=/etc/"

去到另外两台机器查看,可以在etc下成功查看到yum.repos.d及里面的文件

练习2

先在master上修改好/etc/hosts文件,然后使用下面命令拷贝过去覆盖

bash 复制代码
ansible group1 -m copy -a "src=/etc/hosts dest=/etc/hosts"

十二、fetch模块

fetch模块与copy模块类似,但作用相反。用于把远程机器的文件拷贝到本地。

第1步: 在两台被管理机上分别创建一个同名文件(但内容不同)

bash 复制代码
echo agent1 > /tmp/1.txt
bash 复制代码
echo agent2 > /tmp/1.txt

从master上fecth文件(因为group1里有2台机器,为了避免同名文件文件冲突,它使用了不同的目录)

bash 复制代码
ansible group1  -m fetch -a 'src=/tmp/1.txt dest=/tmp/'


删除在拷贝显示结果是一样的

bash 复制代码
rm /tmp/10.1.1.* -rf

结果没变化,但是需要操作两次

bash 复制代码
ansible 192.168.115.4  -m fetch -a 'src=/tmp/1.txt dest=/tmp/'

注意: fetch模块不能从远程拷贝目录到本地

十三、user模块

user模块用于管理用户账号和用户属性

一、创建aaa用户,默认为普通用户,创建家目录

bash 复制代码
ansible group1 -m user -a 'name=aaa state=present'

成功创建

二、创建bbb系统用户,并且登录shell环境为/sbin/nologin

bash 复制代码
ansible web -m user -a 'name=bbb state=present system=yes shell="/sbin/nologin"'

查看创建结果

bash 复制代码
cat /etc/passwd

三、创建ccc用户, 使用uid参数指定uid, 使用password参数传密码

先输入下方命令生成密码

bash 复制代码
echo 123456 | openssl passwd -1 -stdin


下一句命令注意一下格式,密码要用双引号引起来,单引号的话验证时会密码不正确

bash 复制代码
ansible group1 -m user -a 'name=ccc uid=2000 state=present password="生成的密码"'
bash 复制代码
cat /etc/passwd

查看结果

四、创建一个普通用户叫hadoop,并产生空密码 密钥对

bash 复制代码
ansible web -m user -a 'name=hadoop generate_ssh_key=yes'

五、删除aaa用户,但家目录默认没有删除

bash 复制代码
ansible group1 -m user -a 'name=aaa state=absent'

查看用户

bash 复制代码
cat /etc/passwd

查看家目录

bash 复制代码
cd /home

六、删除bbb用户,使用remove=yes参数让其删除用户的同时也删除家目录

bash 复制代码
ansible group1 -m user -a 'name=bbb state=absent remove=yes'

查看结果 成功删除

bash 复制代码
cat /etc/passwd

查看家目录

bash 复制代码
cd /home

十四、group模块

group模块用于管理用户组和用户组属性。

创建组

bash 复制代码
ansible group1 -m group -a 'name=groupa gid=3000 state=present'

查看组

bash 复制代码
cat /etc/group

删除组(如果有用户的gid为此组,则删除不了)

bash 复制代码
ansible group1 -m group -a 'name=groupa state=absent'

查看结果 成功删除

十五、cron模块

cron模块用于管理周期性时间任务
创建一个cron任务,不指定user的话,默认就是root(因为我这里是用root操作的)。
如果minute,hour,day,month,week不指定的话,默认都为
*

bash 复制代码
ansible group1 -m cron -a 'name="test cron1" user=root job="touch /tmp/111" minute=*/2'

查看主机所有的cron任务输入

bash 复制代码
ansible group1 -m shell -a 'crontab -l'

显示结果

删除cron任务

bash 复制代码
ansible group1 -m cron -a 'name="test cron1" state=absent'

查看结果

bash 复制代码
ansible group1 -m shell -a 'crontab -l'

十六、yum_repository模块

相关推荐
Elastic 中国社区官方博客6 小时前
Elasticsearch:使用 LLM 实现传统搜索自动化
大数据·人工智能·elasticsearch·搜索引擎·ai·自动化·全文检索
一切皆文件linux6 小时前
网站集群批量管理-密钥认证与Ansible模块
ansible
南种北李1 天前
Linux自动化构建工具Make/Makefile
linux·运维·自动化
IG工程师1 天前
关于 S7 - 1200 通过存储卡进行程序更新
经验分享·笔记·自动化
怒放的生命.1 天前
电器自动化入门08:隔离变压器、行程开关介绍及选型
运维·自动化·电气自动化·电工基础
我爱学Python!1 天前
基于 LangChain 的自动化测试用例的生成与执行
人工智能·自然语言处理·langchain·自动化·llm·测试用例·大语言模型
让美好继续发生1 天前
ansible学习
学习·ansible
有谁看见我的剑了?2 天前
ansible学习之 Facts
ansible
peanutfish2 天前
Chapter 4 RH294 RHEL Automation with Ansible
linux·ansible·yaml
ZOHO项目管理软件2 天前
自动化分配客服售后工单的高效策略
运维·自动化