一、简要
1、关于Ansible
Ansible是一个部署一群远程主机的工具;Ansible通过SSH协议实现远程节点和管理节点之间的通信。理论上说,只要管理员通过ssh登录到一台远程主机上能做的操作,Ansible都可以做到。Ansible是python开发的,故依赖一些python库和组件
2、ansible架构:
上图右边绿色部分是被管理的主机(虚拟机,物理机,云主机等)从以上架构图中可以看出ansible是由主机清单(配置),playbook(配置),以及各模块插件组成;简单的说就是,用户(管理员)通过ansible的主机清单配置或Playbook配置(一组任务),调用ansible的各种模块及参数来对清单中的主机进行统一管理。
3、测试环境
ansible: 主机名:Cent65 版本:CentOS release 6.8 IP:192.168.1.65
node1: 主机名:cent67 版本:CentOS release 6.9 IP:192.168.1.67
node2: 主机名:rescue 版本:CentOS release 6.9 阿里云主机IP: 47.95.243.198
从ansible(Cent65)上生成ssh密钥对同步到两台node主机上,实现无密钥登录管理(推荐)。
[[email protected] ~]# ssh-keygen -t rsa 一路回车。
把自己公钥复制到远程机器:
[[email protected] ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.1.67
现在通过Cent65远程cent67已经不需要密码了。
同理,设置rescue主机免密登录:
[[email protected] ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 47.95.243.198
[[email protected] ~]# ssh 47.95.243.198
4、安装
目前,只要机器上安装了 Python 2.6 或 Python 2.7 (windows系统不可以做控制主机),都可以运行Ansible,我们这里是2.6.6的python
[[email protected] ~]# python -V
开始安装,这里采用epel yum源的方式安装,更方便。
先安装epel源:
[[email protected] ~]# yum install epel-release –y
出现如下错误,意思是系统中没有epel,需要先下载epel包才能安装。
接下来,我们上阿里云去寻找对应的epel源,网址:https://opsx.alibaba.com/mirror
搜索epel,复制地址:
到Cent65主机wget下载:
[[email protected] ~]# cd /etc/yum.repos.d/
[[email protected] yum.repos.d]# wget https://mirrors.aliyun.com/centos/6.10/extras/i386/Packages/epel-release-6-8.noarch.rpm
又出现了报错:需要加参数
[[email protected] yum.repos.d]# wget https://mirrors.aliyun.com/centos/6.10/extras/i386/Packages/epel-release-6-8.noarch.rpm --no-check-certificate
这样就可以了。可以安装epel源了:
[[email protected] yum.repos.d]# rpm -ivh epel-release-6-8.noarch.rpm
[[email protected] yum.repos.d]# yum -y install ansible
[[email protected] ~]# ansible –version 查看版本。
二、配置及获取帮助说明
通过rpm -ql ansible可以看到有很多文件,主要是配置文件和和可执行文件,以及所依赖的python库文件
1、配置与执行文件说明
主配置文件: /etc/ansible/ansible.cfg (这个文件主要定义了roles_path路径,主机清单路径,连接清单中的主机方式等配置,这些大部的默认配置已经足够我们平时使用,如需要特别配置可以自行去修改)
默认主机清单配置文件:/etc/ansible/hosts (可通过ansible.cfg重新定义)
除了以上两个重要的配置文件还有三个重要的可执行文件分别是:
ansible 主执行程序,一般用于命令行下执行
ansible-playbook 执行playbook中的任务
ansible-doc 获取各模块的帮助信息
2、ansible 使用格式
ansible
HOST-PATTERN #匹配主机模式,如all表示所有主机
-i #指定hosts文件
-m MOD_NAME #模块名 如:ping
-a MOD_ARGS #模块执行的参数
-f FORKS #生成几个子进行程执行
-C #(不执行,模拟跑)
-u Username #某主机的用户名
-c CONNection #连接方式(default smart)
-
例如:[[email protected] ansible]# ansible all -m shell -a "ifconfig|grep eth0"
此命令意思是:ansible对hosts文件中所有主机通过shell模块执行“ifconfig|grep eth0”命令。
3、ansible-doc 获取帮助信息
ansible-doc -s 模块名 获取指定模块帮助信息说明
4、配置hosts文件
ansible默认的hosts文件路径为:/etc/ansible/hosts
[[email protected] ~]#vim /etc/ansible/hosts
在文件最后添加:
[testserver]
192.168.1.67
47.95.243.198
三、ansible常用模块
1、copy模块
从本地copy文件分发到远程主机。
参数说明:
src= 源文件路径
dest= 目标路径
注意src= 路径后面带/ 表示带里面的所有内容复制到目标目录下,不带/是目录递归复制
owner 属主 group 属组 mode权限
示例:
[[email protected] ansible]# ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=600"
[[email protected] ansible]# ansible all -m copy -a "content='hi there\n' dest=/tmp/hi.txt"
命令中没有指定hosts文件,便是使用默认hosts,all参数代表指定所有主机。
现两台主机显示执行都已经成功,现在我们在cent67主机上查看一下:
[[email protected] ~]# ls /tmp/
2、fetch模块
从远程主机拉取文件到本地
例:[[email protected] ansible]# ansible all -m fetch -a "src=/tmp/hi.txt dest=/tmp/"
说明:src为远程主机路劲,dest为本地路径。查看一下是否拉取文件成功:
[[email protected] ansible]# ls /tmp/
3、command模块
在远程主机上执行命令,属于裸执行,非键值对显示;不进行shell解析;
示例1:
[[email protected] ansible]# ansible all -m command -a "ifconfig"
示例2:
[[email protected] ansible]# ansible all -m command -a "ifconfig|grep eth0"
现在使用了管道符后执行失败了,说明command模块不支持。为了能够达成解析,就需要用到shell模块。
4、shell模块
由于commnad只能执行裸命令(即系统环境中有支持的命令),至于管道之类的功能不支持,shell模块可以做到
例:[[email protected] ansible]# ansible all -m shell -a "ifconfig|grep eth0"
已经执行成功了。
5、file模块
设置文件属性(创建文件)
常用参数:
path目标路径
state directory为目录,link为软件链接
group 目录属组
owner 属主
示例1:我们来给远程主机创建一个/var/tmp/hello.dir目录:
[[email protected] ansible]# ansible all -m file -a "path=/var/tmp/hello.dir state=directory"
cent67上检查一下是否创建成功的目录:
示例2:创建软件链接:
[[email protected] ansible]# ansible all -m file -a "src=/tmp/hi.txt path=/var/tmp/hi.link state=link"
6、cron模块
对目标主机生成计划任务
常用参数:
除了 分(minute) 时(hour) 日(day) 月(month) 周(week) 外
name: 本次计划任务的名称
state: present 生成(默认) |absent 删除 (基于name)
示例1:对远程各主机添加每隔3分钟从time.windows.com同步时间
[[email protected] ansible]# ansible all -m cron -a "minute=*/3 job='/usr/sbin/ntpdate time.windows.com &>/dev/null' name=update_time"
到cent67上边查看一下:
示例2:删除计划任务
[[email protected] ansible]# ansible all -m cron -a "name=update_time state=absent"
在cent67上查看发现计划任务已经删除了
7、yum模块
yum安装软件包的模块;
常用参数说明:
enablerepo, disablerepo表示启用与禁用某repo库
name 安装包名
state (present 或者
installed)
表示安装
, (
absent或者removed) 表示删除
示例:通过安装epel扩展源并安装nginx
[[email protected] ansible]# ansible all -m yum -a "name=epel-release state=installed"
[[email protected] ansible]# ansible all -m yum -a "name=nginx state=installed"
在cent67上边查看已经安装成功:
8、service模块
服务管理模块
常用参数:
name: 服务名
state: 服务状态
enabled: 是否开机启动 true | false
runlevel: 启动级别 (systemed方式忽略)
示例:启动nginx服务,并设置开机自动启动
[[email protected] ansible]# ansible all -m service -a "name=nginx state=started enabled=true"
在cent67上查看状态,已经启动成功
9、script模块
把本地的脚本传到远端执行;前提是到远端可以执行,不能把Linux下的脚本同步到windows下执行;
示例:
编写一个简单的脚本;
[[email protected] ansible]# vim test.sh
#!/bin/bash
echo "ansible script test!" > /tmp/ansible.txt
[[email protected] ansible]# ansible all -m script -a "/etc/ansible/test.sh"
在cent67机器上查看test.sh脚本已经执行成功。
以上就是一些常用的模块,其他模块的使用可以用以下命令查看
[[email protected] ansible]# ansible-doc -l
查看某个模块使用方法:
ansible-doc –s 模块名称
四、Playbook实战
playbook是Ansible的配置,部署和编排的语言。他们可以描述你所希望的远程系统强制执行的政策,或者在一般的IT流程的一组步骤
1、playbook的核心元素
hosts : playbook配置文件作用的主机
tasks: 任务列表
variables: 变量
templates:包含模板语法的文本文件
handlers :由特定条件触发的任务
roles :用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等
2、playbook运行方式
ansible-playbook --check 只检测可能会发生的改变,但不真执行操作
ansible-playbook --list-hosts 列出运行任务的主机
ansible-playbook --syntax-check playbook.yaml 语法检测
ansible-playbook -t TAGS_NAME playbook.yaml 只执行TAGS_NAME任务
ansible-playbook playbook.yaml 运行
3、通过playbook安装管理redis服务
先创建一个剧本文件夹,用来存放我们的剧本文件。
[[email protected] ansible]# mkdir playbooks
[[email protected] ansible]# cd playbooks/
创建剧本文件:
[[email protected] playbooks]# vim redis.yaml
(1)下面我们来检测一下这个剧本文件:
[[email protected] playbooks]# ansible-playbook --syntax-check redis.yaml
没有报错,说明语法没有问题。
(2)再来查看一下运行任务的主机:
[[email protected] playbooks]# ansible-playbook --list-hosts redis.yaml
(3)执行剧本文件
[[email protected] playbooks]# ansible-playbook redis.yaml
由于上面的操作是直接安装redis服务并启动,并没有配置文件,这还不能往生产环境中使用,生产环境中的redis肯定有不同的配置项,因此需要在安装时提供配置文件。
4、带配置文件的安装管理redis
(1)首先复制一个redis.conf到本地home目录下并进行修改
[[email protected] ansible]# ansible 192.168.1.67 -m fetch -a "src=/etc/redis.conf dest=/home"
(2)然后编辑下载好的配置文件,修改bind 0.0.0.0,为了任意主机可以远程连接rsdis。之后将配置文件移动到/etc/ansible/playbooks/.
[[email protected] ~]# vim !$
[[email protected] etc]# mv redis.conf /etc/ansible/playbooks/
(3)重新编写redis2.yaml剧本文件
[[email protected] ~]# vim redis2.yaml
- hosts: all #所有远程主机
remote_user: root #以远程主机上root用户执行
tasks: #任务
- name: install redis #任务之安装
yum: name=redis state=latest #动作调用yum模块安装
- name: copy config file #任务之复制同步配置文件到远程目标主机
copy: src=/etc/ansible/playbooks/redis2.conf dest=/etc/redis.conf owner=redis #动作copy模块执行
notify: restart redis #触发的动作
tags: configfile #任务标记名configfile
- name: start redis #任务之启动redis
service: name=redis state=started #动作调用sevice模块
handlers: #特定情况下,接收到其他任务的通知时被触发
- name: restart redis
service: name=redis state=restarted
(4)检测剧本语法
[[email protected] ~]# ansible-playbook --syntax-check redis2.yaml
(把redis2.yaml移动到/etc/ansible/playbook/下面)
[[email protected] ~]# mv redis2.yaml /etc/ansible/playbooks/
[[email protected] ~]# cd !$
(5)执行剧本
[[email protected] playbooks]# ansible-playbook redis2.yaml
执行成功。
本文参考博客:http://blog.51cto.com/dyc2005/2070729
原文地址:http://blog.51cto.com/rescue/2145993