ansible自动运维入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible自动运维入门相关的知识,希望对你有一定的参考价值。

一、简要

1、关于Ansible
Ansible是一个部署一群远程主机的工具;Ansible通过SSH协议实现远程节点和管理节点之间的通信。理论上说,只要管理员通过ssh登录到一台远程主机上能做的操作,Ansible都可以做到。Ansible是python开发的,故依赖一些python库和组件

2ansible架构:

技术分享图片

上图右边绿色部分是被管理的主机(虚拟机,物理机,云主机等)从以上架构图中可以看出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  获取各模块的帮助信息

2ansible 使用格式

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”命令。

3ansible-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常用模块

1copy模块

从本地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 ' dest=/tmp/hi.txt"

技术分享图片

命令中没有指定hosts文件,便是使用默认hosts,all参数代表指定所有主机。

现两台主机显示执行都已经成功,现在我们在cent67主机上查看一下:

[[email protected] ~]# ls /tmp/

技术分享图片

技术分享图片

2fetch模块

从远程主机拉取文件到本地

例:[[email protected] ansible]# ansible all -m fetch -a "src=/tmp/hi.txt dest=/tmp/"

技术分享图片

说明:src为远程主机路劲,dest为本地路径。查看一下是否拉取文件成功:

[[email protected] ansible]# ls /tmp/

技术分享图片

3command模块

在远程主机上执行命令,属于裸执行,非键值对显示;不进行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模块。

4shell模块

由于commnad只能执行裸命令(即系统环境中有支持的命令),至于管道之类的功能不支持,shell模块可以做到

例:[[email protected] ansible]# ansible all -m shell -a "ifconfig|grep eth0"

技术分享图片

已经执行成功了。

5file模块

设置文件属性(创建文件)

常用参数:
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"

技术分享图片

6cron模块

对目标主机生成计划任务

常用参数:
除了 分(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上查看发现计划任务已经删除了

技术分享图片

7yum模块

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上边查看已经安装成功:

技术分享图片

8service模块

服务管理模块
常用参数:

name: 服务名
state: 服务状态
enabled: 是否开机启动 true | false
runlevel: 启动级别 (systemed方式忽略)

示例:启动nginx服务,并设置开机自动启动

[[email protected] ansible]# ansible all -m service -a "name=nginx state=started enabled=true"

在cent67上查看状态,已经启动成功

技术分享图片

9script模块

把本地的脚本传到远端执行;前提是到远端可以执行,不能把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流程的一组步骤

1playbook的核心元素

hosts : playbook配置文件作用的主机
tasks: 任务列表
variables: 变量
templates:包含模板语法的文本文件
handlers :由特定条件触发的任务
roles :用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等

2playbook运行方式

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

以上是关于ansible自动运维入门的主要内容,如果未能解决你的问题,请参考以下文章

ansible自动运维入门

Ansible 自动化运维工具简单入门

运维自动化好帮手:ansible软件入门篇

Ansible快速入门

第20章,运维自动化之ansible

Ansible - 入门及安装