Ansible快速入门

📅 2026/7/9 2:50:39 👁️ 阅读次数 📝 编程学习
Ansible快速入门

一、介绍

Ansible是一款简单的运维自动化工具,只需要使用ssh协议连接就可以来进行系统管理,自动化执行命令,部署等任务。
Ansible的特点
1、ansible不需要单独安装客户端,也不需要启动任何服务
2、ansible是python中的一套完整的自动化执行任务模块
3、ansible playbook 采用yaml配置,对于自动化任务执行过一目了然
Ansible组成结构
● Ansible
是Ansible的命令工具,核心执行工具;一次性或临时执行的操作都是通过该命令执行。
● Ansible Playbook
任务剧本(又称任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,yaml格式。
● Inventory
Ansible管理主机的清单,默认是/etc/ansible/hosts文件。
● Modules
Ansible执行命令的功能模块,Ansible2.3版本为止,共有1039个模块。还可以自定义模块。
● Plugins
插件,模块功能的补充,常有连接类型插件,循环插件,变量插件,过滤插件,插件功能用的较少。
● API
提供给第三方程序调用的应用程序编程接口。

二、环境准备

IP 系统 主机名 描述
172.16.1.3 CentOS7 Master ansible管理节点
172.16.1.4 CentOS7 Node1 被管理节点1
172.16.1.5 CentOS7 Node2 被管理节点2
  • 管理节点关闭防火墙和SElinux
[root@Master ~]# systemctl stop firewalld
[root@Master ~]# systemctl disable firewalld
[root@Master ~]# setenforce 0
[root@Master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@Master ~]# egrep "^SELINUX=" /etc/selinux/config
SELINUX=disabled
  • 管理节点修改/etc/hosts文件实现本地解析
[root@Master ~]# cat >>/etc/hosts<<'EOF'
172.16.1.4 Node1
172.16.1.5 Node2
EOF

之后使用ping域名方式是否解析正常。

  • 管理节点实现免密登录被管理节点
#生成公钥私钥ssh-keygen->回车->回车->回车
[root@Master ~]# ssh-keygen#传递公钥到被管理节点
[root@Master ~]# for i in localhost Node1 Node2; do ssh-copy-id $i; done

完成后测试看看是否可以免密登录。

三、安装Ansible软件包

  • 安装ansible软件包,由于ansible需要epel源,这里选用阿里epel源。可以把Base源也加上:
[root@Master ~]# yum -y install wget
[root@Master ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
[root@Master ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
[root@Master ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
  • 安装ansible软件包
[root@Master ~]# yum -y install ansible
  • 查看软件包版本
[root@Master ~]# ansible --version

四、定义被管理主机的清单文件

  • ansible主要配置文件如下
  • 主配置文件的默认配置:

/etc/ansible/ansible.cfg

· 主机清单配置方式,默认全部都是注释的

4.1 清单定义

[root@Master ~]# mv /etc/ansible/hosts /etc/ansible/hosts-default

可以直接把要管理的主机IP或者主机名写入,写主机名的前提是之前有本地配置了解析。

例如:

172.16.1.1
172.16.1.2
...
Node1
Node2
...

分组方式:

[webserver]
172.16.1.1
node2
...[dbserver]
172.16.1.3
node3
...

假设这里要安装k8s集群就可以配置如下,如果主机非常多,有Node1、Node2、···、Node100,可以简写成:

[kubernetes]
localhost
Node[1:2][node]
Node[1:2]

4.2 清单查看方法

  • 查看所有主机清单
[root@Master ~]# ansible all --list-host
  • 查看某个组的主机清单
[root@Master ~]# ansible kubernetes --list-host

五、常用使用模块

命令格式:ansible 组名/主机 [-m 模块名] [-a 具体操作]

  • 查看主机清单
[root@Master ~]# ansible all --list-host
  • 查看某个组内的主机清单
[root@Master ~]# ansible kubernetes --list-host
  • ansible-doc命令介绍:
    • ansible-doc** 模块文档命令

· 常用选项

-l:列出所有模块列表

-s:查看模块帮助信息

[root@Master ~]# ansible-doc -l
[root@Master ~]# ansible-doc -s ping

5.1 ping模块测试连通性

[root@Master ~]# ansible node -m ping
  • ansible返回结果颜色表示:
    • 绿色:代表命令执行成功,对远程节点不会造成改变
    • 黄色:代表命令执行成功,对远程节点造成改变
    • 红色:代表命令执行失败或者异常
    • 粉色:代表命令执行后发出的告警,给一些建议(可忽略)

5.2 command模块

使用文档命令查看使用帮助:

[root@Master ~]# ansible-doc -s command

可以看到该模块--name的解释,用于在目标主机上执行命令。

  • chdir:切换目录之后执行
[root@Master ~]# ansible node -m command -a 'chdir=/root ls -l'

表示切换到/root目录之后执行ls -l命令。

  • create:如果文件不存在将创建
[root@Master ~]# ansible node -m command -a 'creates=/data mkdir /data'

在/目录下创建data目录,如果存在将会绿色提示已经存在。

[root@Master ~]# ansible node -m command -a 'creates=/data/hello.txt touch /data/hello.txt'

在/data目录下新建hello.txt文件,如果存在会绿色提示文件存在。

  • removes:如果文件存在将删除它
[root@Master ~]# ansible node -m command -a 'removes=/data/hello.txt rm -rf /data/hello.txt'

删除/data下的hello.txt文件,如果不存在将会绿色显示不存在。

[root@Master ~]# ansible node -m command -a 'removes=/data rm -rf /data'

删除/data文件夹,如果不存在将会绿色显示不存在。

  • 其它
  • 注意,不能交互执行vim、top之类的命令。

5.3 shell 模块

shell模块和command模块是一样的,都是在目标主机上执行命令,但是它比command强大,它比command好在支持grep、>、*等等,但是它也不支持vi、vim。

5.4 script

  • script模块用于远程执行脚本,脚本存放在ansible主机本地即可,不需要拷贝到远程主机。
  • 常用参数:
    • chdir:此参数表示执行命令前,会先进入到指定的目录中。
    • creates:此参数表示如果文件存在于远程主机中,则不执行对应命令,如果不存在才执行命令。
    • removes:此参数表示文件如果不存在与远程主机当中,则不执行对应命令,如果存在,才执行命令。

提示:shell模块中的chdir、creates、removes参数的作用与command中的作用都是相同的,不在例举。

示例:

有如下脚本:

[root@Master ~]# cat /root/hello.sh
#!/bin/bash
echo "hello"

在远程主机上执行:

这个主要考验执行脚本的编写能力,它不用拷贝到其它主机上,执行之后会被其它主机调用。

5.5 copy 模块

[root@Master ~]# ansible node -m copy -a 'src=/root/hello.sh dest=/root'

src指定本地文件路径,dest指定目标路径。