ansible简介

北城余情 提交于 2019-12-10 22:16:50

ansible介绍

一、ansible介绍

1.1 概念

Ansible自动化运维工具,基于Python开发,集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

1.2 特点

(1) no agents:不需要在被管控主机上安装任何客户端;

(2) no server:无服务器端,使用时直接运行命令即可;

(3) modules in any languages:基于模块工作,可使用任意语言开发模块;

(4) yaml,not code:使用yaml语言定制剧本playbook;

(5) ssh by default:基于SSH工作;

(6) strong multi-tier solution:可实现多级管理。

1.3 优势

(1) 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;

(2) 批量任务执行可以写成脚本,而且不用分发到远程就可以执行;

(3) 使用python编写,维护更简单;

(4) 支持sudo。

1.4 工作机制

Ansible : 核心

Modules : 包括 Ansible 自带的核心模块及自定义模块

Plugins : 完成模块功能的补充,包括连接插件、邮件插件等

Inventory : 定义 Ansible 管理主机的清单

Playbooks : 剧本;定义 Ansible 多任务配置文件,由Ansible 自动执行

1.5 工作流程

二、Ansible安装

1 先安装Centos7版本的EPEL源后再安装Ansible

12
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoyum  -y install ansible

2 测试 ansible –version

3 Ansible配置文件

1234
/usr/bin/ansible-doc        帮助文件/usr/bin/ansible-playbook   指定运行任务文件/etc/ansible/ansible.cfg    主配置文件/etc/ansible/hosts          主机清单三、实验:环境准备
3.1 准备工作
12
一台主控主机:10.0.0.8 (Centos7.6)一台被控主机:10.0.0.9 (Centos7.6)

主控与被控可以相互通信!!

安装要求:

1234
控制主机:需要安装 Python2.6/2.7 安装方法见上管理主机:需要安装 Python2.4 以上版本,关闭selinuxcentos7.6默认python版本为2.7.5

3.2 主控主机配置主机清单

12
vim /etc/ansible/hosts10.0.0.9

3.3 配置控制主机SSH密钥

在控制主机中生成ssh密钥对

1
ssh-keygen -t rsa   # 一路回车默认

3.4 拷贝公钥至被控机

将公钥拷贝到管理主机中.ssh/authorized_keys文件中,实现免密码登录远程管理主机

1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.9

(ssh-copy-id命令会自动将id_rsa.pub文件的内容追加到远程主机root用户下.ssh/authorized_keys文件中)

3.5 ansible配置

vim /etc/ansible/ansible.cfg

找到以下两行, 将其取消注释

12
host_key_checking = False   # 禁用每次执行ansbile命令检查ssh key hostlog_path = /var/log/ansible.log   #开启日志记录

测试:主控机

四、常用模块使用

4.1 ping(测试远程主机运行状态)

测试主机是否连通,用法很简单,不涉及参数

1
ansible all -m ping

4.2 setup(查看远程主机基本信息)

setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。

1
ansible all -m setup

setup模块下经常使用的一个参数是filter参数,具体使用示例如下:

1
ansible 10.0.0.9 -m setup -a 'filter=ansible_*_mb'  # 查看主机内存信息

1
ansible 10.0.0.9 -m setup -a 'filter=ansible_ens33'  # 查看接口为ens33的网卡信息

4.3 file(设置文件属性)

1234567891011121314151617
相关选项:group:定义文件/目录的属组mode:定义文件/目录的权限owner:定义文件/目录的属主path:必选项,定义文件/目录的路径recurse:递归设置文件的属性,只对目录有效src:被链接的源文件路径,只应用于state=link的情况dest:被链接到的路径,只应用于state=link的情况force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|nostate相关参数:   directory:如果目录不存在,就创建目录   file:即使文件不存在,也不会被创建   link:创建软链接   hard:创建硬链接   touch:如果文件不存在,则会创建一个新文件,如果文件或目录已存在,则更新其最后修改时间   absent:删除目录、文件或者取消链接文件

使用示例:
1 远程文件链接创建

1
ansible [hostip] -m file -a "src=/etc/hostname dest=/opt/hostname_link state=link"

被控机上查看:

2 远程文件链接删除

1
ansible [hostip] -m file -a "path=/opt/hostname_link state=absent"

4.4 copy(复制文件到远程主机)

12345678
相关选项:backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|nocontent:用于替代“src”,可以直接设定指定文件的值dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录directory_mode:递归设定目录的权限,默认为系统默认权限force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yesothers:所有的file模块里的选项都可以在这里使用src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

实例:
将本地文件/opt/tools/Python-3.6.6.tgz复制到远程服务器

1
ansible [hostip] -m copy -a "src=/opt/tools/Python-3.6.6.tgz dest=/opt/tools/Python-3.6.6.tgz owner=root group=root mode=0644"

在被控机上查看:

4.5 command(在远程主机上执行命令)

123456
相关选项如下:creates:一个文件名,当该文件存在,则该命令不执行free_form:要执行的linux指令chdir:在执行指令之前,先切换到该目录removes:一个文件名,当该文件不存在,则该选项不执行executable:切换shell来执行指令,该执行路径必须是一个绝对路径

实例:

1
ansible all -m command -a "ifconfig"    # 执行命令不写入history

远程文件信息查看

1
ansible all -m command -a "ls -l /etc/hostname"

4.6 shell(切换到shell执行指定的指令)

​ shell的参数与command相同, 与command不同的是,此模块可以支持命令管道,同时还有另一个模块也具备此功能:raw

实例:

1 先在主控机本地创建一个SHELL脚本
vim /tmp/test.sh

12
#!/bin/shdate +%F_%H:%M:%S
1
chmod +x /tmp/test.sh  # 添加脚本可执行权限

2 将创建的脚本文件分发到远程

1
ansible all -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh owner=root group=root mode=0755"

3 远程执行

1
ansible all  -m shell -a "/tmp/test.sh"

4.7 cron(创建和删除计划任务)

1 创建和删除计划任务语法:

1
ansible [HostGroup or IP] -m cron -a "name='....' job='.....' $time"

参数解释:

1234567
-m 跟模块,使用的是 cron 模块name= 指定计划任务的名字,方便日后管理job= 要执行的任务,依赖于state=present$time 指定具体的执行时间,minute分钟,hour小时,day 天,month 月份。weekday 0或者7代表周末。special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly state= 选项用来指定该任务计划是创建还是删除user:以哪个用户的身份执行

2 在主控机上增加计划任务

1
ansible all -m cron -a "name='test cron' job='/bin/bash /tmp/test.sh' weekday=6"

12
# 每月的1,10,15日的6:35清空/tmp目录的所有文件ansible all -m cron -a "name='clean all tmp file' job='rm -rf /tmp/*' minute=35 hour=6 day=1,10,15"

3 被控机查看

4 删除计划任务

12
ansible all -m cron -a "name='test cron' state=absent"ansible all -m cron -a "name='clean all tmp file' state=absent"

4.8 yum模块

使用yum包管理器来管理软件包,其选项有:

123
-m 使用 yum 模块name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径 state= installed  removed,不加state选项默认是installed
1
ansible all -m yum -a "name=tree"  # 使用yum安装tree命令

1
ansible all -m yum -a "name=wget state=removed"    # 使用yum卸载wget命令

4.9 service管理服务

1234
-m service 模块name= 必选项,系统服务名称,可以用chkconfig --list查看enabled= 是否开机启动,yes| nostate:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)

1 在被控机上使用yum安装一个nginx

1
yum install -y nginx

2 安装好之后查看nginx服务的状态

3 在主控机管理被控机的nginx服务

1
ansible all -m service -a "name=nginx state=started enabled=no"

4 在被控机上查看当前的nginx服务状态

5 在主控机上远程关闭被控机上的nginx服务

1
ansible all -m service -a "name=nginx state=stopped enabled=yes"

4.10 其他模块使用帮助

​ 官方提供的可能用到模块有git、svn版本控制模块,sysctl 、authorized_key_module系统模块,apt、zypper、pip、gem包管理模块,find、template文件模块,mysql_db、redis数据库模块,url 网络模块等。具体可以参看官方手册模块部分, 或者查看帮助信息。

12
ansible-doc -l                列出ansible所有的模块ansible-doc -s MODULE_NAME    查看指定模块具体适用
 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!