简介
| 是什么?
是新出现的自动化运维工具,基于开发,集合了众多运维工具(、chef、func、)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能
| 特点
部署简单,只需在主控端部署环境,被控端无需做任何操作;
默认使用SSH协议对设备进行管理;
有大量常规运维操作模块,可实现日常绝大部分操作;
配置简单、功能强大、扩展性强;
支持API及自定义模块,可通过轻松扩展;
通过来定制强大的配置、状态管理;
轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台;
| 架构图
上图中我们看到的主要模块如下:
任务执行
| 任务执行模式
系统由控制主机对被管节点的操作方式可分为两类,即adhoc和:
| 执行流程
简单理解就是在运行时, 首先读取 .cfg 中的配置, 根据规则获取 中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果
| 命令执行过程
加载自己的配置文件,默认路径为/etc//.cfg;
查找对应的主机配置文件,找到要执行的主机或者组;
加载自己对应的模块文件,如 ;
通过将模块或命令生成对应的临时py文件(脚本), 并将该文件传输至远程服务器;
对应执行用户的家目录的./tmp/XXX/XXX.py文件;
给文件 +x 执行权限;
执行并返回结果;
删除临时py文件,sleep 0退出;
服务部署
| 关闭服务器防火墙
# 关闭firewalld防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭SELinux
setenforce 0
sed -ri s'#(SELINUX=)enforcing#1disabled#'
| 安装
安装常用两种方式,yum安装 和 pip程序安装,下面我们来详细介绍一下这两种安装方式
使用 pip(的包管理模块)安装
首先,我们需要安装一个-pip包,安装完成以后,则直接使用pip命令来安装我们的包,具体操作过程如下:
yum install python-pip
pip install ansible
使用 yum 安装
yum 安装是我们很熟悉的安装方式了
我们需要先配置epel源,然后再安装我们的 即可
yum install epel-release -y
yum install ansible –y
| 程序结构
安装目录如下(yum安装):
| 常用选项介绍
| 主配置文件
的配置文件可以存放在任何位置,但配置文件有读取顺序,先对配置做一个基本了解
的配置文件有查找顺序:
最先查找$变量对应的位置和文件
其次查找当前目录下.cfg
然后查找用户家目录下的..cfg
最后查找/etc//.cfg(默认)
.cfg 配置文件介绍
主机清单
在配置文件中,我们提到了资源清单,这个清单就是我们的主机清单,里面保存的是一些 需要连接管理的主机列表
| 基于密码连接
# 方式一、主机+端口+用户名+密码 ※※※※※
[web]
10.0.0.101 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
10.0.0.102 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
# 方式二、域名+密码
[web]
web[01:04].oldboy.com ansible_ssh_pass='123456'
# 方式三、主机组设置共用变量variables
[web]
web[1:2].oldboy.com
[web:vars] #给 webservers 主机组设置共用变量variables
ansible_ssh_pass='123456'
| 基于密钥连接
创建和发放密钥
yum -y install openssh-clientsansible
# 生成私钥
ssh-keygen
# 向其它主机分发私钥
ssh-copy-id root@10.0.0.101
ssh-copy-id root@10.0.0.102
设置主机清单
[web]
10.0.0.101
10.0.0.102
| 主机组使用方式
主机清单中
# 定义lbservers组
[lb]
10.0.0.5
10.0.0.6
# 定义webserver组
[web]
10.0.0.7
10.0.0.8
# 定义servers组包括两个子组 [lbservers,webserver]
[servers:children]
lb
web
常用模块
| 什么是ad-hoc
ad-hoc简而言之就是“临时命令”,执行完即结束,并不会保存
| ad-hoc模式的使用场景
临时获取主机的数据、状态
比如在多台机器上查看某个进程是否启动,或拷贝指定文件到本地,等等
| ad-hoc模式的命令使用
ansible 'oldboy' -m command -a 'df -h'
含义如下图
| 使用ad-hoc执行一次远程命令
ansible all -m ping
常用模块
使用过程中需要先了解-doc帮助手册
ansible-doc -l # 查看所有模块说明
ansible-doc copy # 表示指定模块方法
ansible-doc -s copy # 表示指定模块参数
| 主机连通性测试
ping模块可以用于主机连通性测试
-doc帮助手册
ansible web -m ping
这样就说明我们的主机是连通状态的。接下来的操作才可以正常进行
| 模块
这个模块可以直接在远程主机上执行命令,并将结果返回本主机
举例如下:
ansible all -m command -a 'netstat -ntl'
命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行
它不会通过shell进行处理,比如$HOME和操作如"","|",";","&" 工作(需要使用(shell)模块实现这些功能)
注意,该命令不支持 | 管道命令
下面来看一看该模块下常用的几个命令:
下面我们来看看这些命令的执行效果:
# 先切换到/data/ 目录,再执行“ls”命令
ansible all -m command -a 'chdir=/oldboyedu/ ls'
# 如果/data/aaa.jpg存在,则不执行“ls”命令
ansible all -m command -a 'creates=/oldboyedu/aaa.jpg ls'
# 如果/data/aaa.jpg存在,则执行“cat /data/a”命令
ansible all -m command -a 'removes=/oldboyedu/aaa.jpg cat /oldboyedu/a'
| shell 模块
shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等
只要是我们的shell命令,都可以通过这个模块在远程主机上运行
ansible all -m shell -a 'cat /etc/passwd |grep "oldboy"'
| 模块
把对应脚本传输过去,然后运行对应的脚本
# 编写脚本
mkdir -p /server/scripts
cat >/server/scripts/test.sh<<EOF
#!/usr/bin/bash
echo "Hello,Word!!!"
EOF
# 在本地运行模块,等同于在远程执行,不需要将脚本文件进行推送目标主机执行
ansible all -m script -a "/server/scripts/test.sh"
| yum 模块
该模块主要用于软件的安装
其选项如下:
下面我们就来安装一个包试试看
ansible all -m yum -a 'name=sl state=installed'
| 模块
该模块主要用于yum源的配置
其选项如下:
下面我们就来配置一个yum源
ansible all -m yum_repository -a 'name=php description="php repo" baseurl="http://us-east.repo.webtatic.com/yum/el7/x86_64/" enabled=no state=present‘
| file 模块
该模块主要用于设置文件的属性,比如创建文件、创建链接文件、删除文件等
下面是一些常见的命令:
常见的 state 状态
创建目录:
ansible all -m file -a 'path=/oldboyedu/app state=directory'
ansible all -m shell -a 'ls -l /oldboyedu'
修改文件权限
ansible all -m file -a 'path=/oldboyedu/app/ state=directory owner=nobody mode=600 recurse=yes'
ansible all -m shell -a 'ls -l /oldboyedu'
删除文件
ansible web -m file -a 'path=/oldboyedu/app state=absent'
ansible all -m shell -a 'ls -l /oldboyedu'
| copy 模块
这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等
其相关选项如下:
拷贝文件文件至被控节点:
ansible all -m copy -a "src=/etc/hosts dest=/tmp/test.txt"
对远端已有文件进行备份,按照时间信息备份:
ansible all -m copy -a "src=/etc/hosts dest=/tmp/test.txt backup=yes"
内容 写入文件内容 重定向 >
ansible all -m copy -a 'content="oldboy.cn" dest=/tmp/oldboy.txt'
ansible all -a 'cat /tmp/oldboy.txt'
| 模块
中的wget命令
# 通过get_url下载文件或者软件
ansible web -m get_url -a 'url=https://mirrors.aliyun.com/repo/Centos-7.repo dest=/root/ '
ansible web -m shell -a "ls -l /root/C*"
| 模块
该模块用于服务程序的管理
其主要选项如下:
开关服务
# 开启服务
ansible all -m systemd -a 'name=crond state=stopped'
# 关闭服务
ansible all -m systemd -a 'name=crond state=started'
# 服务重启
ansible all -m systemd -a 'name=crond state=reloaded'
ansible all -m systemd -a 'name=crond state=restarted'
设置服务开机启动
# 开机自启
ansible all -m systemd -a 'name=crond enabled=yes'
# 不开机自启
ansible all -m systemd -a 'name=crond enabled=no'
| user 模块
该模块主要是用来管理用户账号
其主要选项如下:
添加一个用户并指定其 uid
ansible web -m user -a 'name=oldboy uid=11111'
ansible web -m shell -a 'cat /etc/passwd |grep oldboy'
删除用户
ansible web -m user -a 'name=oldboy state=absent'
ansible web -m shell -a 'cat /etc/passwd |grep oldboy'
| group 模块
该模块主要用于添加或删除组
常用的选项如下:
创建组
ansible web -m group -a 'name=oldboyedu gid=12222'
ansible web -m shell -a 'cat /etc/group | grep 12222'
删除组
ansible web -m group -a 'name=oldboyedu state=absent'
ansible web -m shell -a 'cat /etc/group | grep 12222'
| crond 模块
该模块适用于管理cron计划任务的
其使用的语法跟我们的文件中的语法一致,同时ansible自动化运维,可以指定以下选项:
添加计划任务
ansible all -m cron -a "minute=* hour=* day=* month=* weekday=* job='/bin/sh test.sh'"
ansible all -m shell -a "crontab -l"
删除计划任务
ansible web -m cron -a "name=None minute=* hour=* day=* month=* weekday=* job='/bin/sh test.sh' state=absent"
ansible all -m shell -a "crontab -l"
| 模块
该模块适用于管理防火墙的
常用的选项如下:
安装nginx服务
# 配置nginx安装源
ansible all -m yum_repository -a 'name=nginx description="nginx repo" baseurl=http://nginx.org/packages/centos/7/x86_64/ enabled=yes gpgcheck=no state=present'
# 安装nginx
ansible all -m yum -a 'name=nginx state=installed'
编写简单网页测试内容
ansible all -m copy -a 'content="oldoby.com" dest=/usr/share/nginx/html/index.html'
启动服务加入开机自启
ansible all -m systemd -a 'name=nginx state=started enabled=yes'
放行对应的端口
ansible all -m iptables -a 'table=filter action=append chain=INPUT protocol=tcp destination_port=80 jump=ACCEPT'
总结
在本教程中,我们通过一些示例学习了如何去使用
感谢您的阅读ansible自动化运维,由于文档整理较费时费力,难免会有疏漏和不妥当地方,敬请谅解