Ansible自动化运维,


Ansible-自动化运维工具

ansible简介

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

ansible是基于模块工作的,本身没有批量部署能力,真正具有批量部署的是ansible所运行的模块。

ansible的特性

部署简单,只需在主控端部署ansible环境,被控端无需做任何操作;

默认使用SSH协议对设备进行管理;

有大量常规运维操作模块,可实现日常绝大部分操作;

配置简单、功能强大、扩展性强;

有Paramiko,PyYAML,Jinja2三个关键模块;

支持API及自定义模块,可通过Python轻松扩展;

通过Playbooks来定制强大的配置、状态管理;

可使用任何编程语言写模块;

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

提供一个功能强大、操作性强的web管理界面和REST API接口--AWX平台

ansible架构图

Ansible:ansible核心程序

Host Inventory:记录由ansible管理的主机信息,包括端口、密码、ip等

Play books:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能

Core Modules:核心模块,主要操作是通过调用核心模块来完成管理任务

Custom Modules:自定义模块,完成核心模块无法完成的功能,支持多种语言

Plugins:插件,实现记录日志,发送邮件等功能

Connection Plugins:连接插件,ansible和host通信使用,默认ssh连接

ansible工作原理

ansible任务执行模式

ansible系统由控制主机对被控节点的操作可分为两类,即adhoc和playbook

ad-hoc模式(点对点模式)

使用单个模块,支持批量执行单条命令。ad-hoc命令是一种可以快速输入的命令,而且不需要保存起来的命令

playbook模式(剧本模式)

是ansible主要管理方式,也是ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如web服务的安装部署、数据库服务器的批量备份等

ansible执行流程

ansible命令执行过程

1、加载自己的配置文件,默认 /etc/ansible/ansible.cfg

2、查找对应的主机配置文件,找到要执行的主机或者组

3、加载自己对应的模块文件

4、通过ansible将模块或命令生成对应的临时python文件,并将该文件传输至远程服务器

5、对应执行用户的家目录的文件

6、给文件+x执行权限

7、执行并返回结果

8、删除临时python文件,sleep 0 退出

ansible常用命令

ansible命令集

/usr/bin/ansible    临时命令执行工具

/usr/bin/ansible-doc    模块功能查看工具

/usr/bin/ansible-galaxy    下载/上传优秀代码或Roles模块的官网平台

/usr/bin/ansible-playbook    定制自动化的任务集编排工具

/usr/bin/ansible-pull    远程执行命令的工具

/usr/bin/ansible-vault    文件加密工具

/usr/bin/ansible-console    可与用户交互的命令执行工具

ansible命令使用

命令格式

# ansible  <host-pattern>  [-f forks]  [-m module_name]  [-a args]

-a    模块的参数

-k    登陆密码

-c    连接类型使用

-m    执行模块的名字

-o    压缩输出

-R    指定用户

ansible配置

准备至少两台机器,一台主控机器,其余的为被控机器

ansible安装

在主控机器上安装ansible

# yum install -y ansible

生成密钥对

# ssh-keygen

设置密钥认证

# ssh-copy-id root@ip

配置主机清单

# vi /etc/ansible/hosts

[web]          ##主机组名

192.168.37.16

192.168.37.17

ansible常用模块

主机连通性测试

# ansible web -m ping 

192.168.37.16 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
192.168.37.17 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

确认主机是连通状态

command模块

该模块可以直接在远程主机上执行命令,并将结果返回本主机

模块常用选项

chdir    在执行命令之前,先切换到该目录

executable    切换shell来执行命令,需要使用命令的绝对路径

free_form    要执行的Linux指令

creates    一个文件名,当这个文件存在,则该命令不执行

removes     一个文件名,当这个文件不存在,则该命令不执行

copy模块

该模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等

常用选项

src    被复制到远程主机的本地文件

content    用于替换“src”,可以直接指定文件的值

dest    将源文件复制到的远程主机的绝对路径

backup    当文件内容发生改变后,再覆盖之前把源文件备份

directory_mode    递归设定目录的权限

file模块

该模块主要用于设置文件的属性,如创建文件、创建链接文件、删除文件等

常用选项

group    定义文件目录的属组,后面可以加上mode:定义文件目录的权限

owner    定义文件目录的属主,后面必须加上path:定义文件目录的路径

recurse    递归设置文件的属性,只对目录有效

dest    被链接到的路径

state    状态,有以下选项

   directory    如果目录不存在,就创建目录

   file    即使文件不存在,也不会被创建

   link    创建软链接

   hard    创建硬链接

   touch    如果文件不存在,则创建一个新文件,如果文件存在,则更新最后修改时间

   absent    删除目录、文件或者取消链接文件

fetch模块

该模块用于从远程某主机获取文件到本地

选项

dest    用来存放文件的目录

src    在远程拉取的文件

yum模块

该模块主要用于软件的安装

常用选项

name=    所安装的包的名字

update_cache    强制更新yum的缓存

conf_file    指定远程yum安装时所依赖的配置文件

state=    状态,有以下选项

   present    安装

   latest    安装最新的

   absent    卸载软件

service模块

该模块用于服务程序的管理

常用选项

arguments    命令行提供额外的参数

enabled    设置开机启动

name=    服务名称

runlevel    开机启动的级别

sleep    在重启服务的过程中,是否等待

state    状态,有以下选项

   started    启动服务

   stopped    停止服务

   restarted    重启服务

   reloaded    重载配置

user模块

该模块主要用来管理用户账号

常用选项

comment    用户的描述信息

createhome    是否创建家目录

force    在使用state=absent时,行为与userdel-force一致

group    指定基本组

groups    指定附加组

home    指定用户家目录

name    指定用户名

non_unique    允许改变非唯一的用户ID值

password    指定用户密码

state    设置账号状态

system    当创建一个用户,设置这个用户时系统用户

uid    指定用户的uid

group模块

该模块主要用于添加或删除组

常用选项

gid=    设置组的gid号

name=    指定组的名称

state=    指定组的状态

system=    设置值为yes,表示创建为系统组

Ansible playbook

简介

playbook是ansible用于配置、部署和管理被控节点的剧本。通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态

使用场景

使用playbook可以方便的重用这些代码,可以移植到不同的机器上面,最大化的利用代码

格式

playbook由YMAL语言编写

1、文件的第一行应该以“---”(三个连字符)开始,表明YAML文件的开始

2、在同一行中,#之后的内容表示注释

3、YAML中的列表元素以“-”开头然后紧跟着一个空格,后面为元素内容

4、同一个列表中的元素应该保持相同的缩进,否则会被当做错误处理

5、playbook中hosts,variables,roles,tasks等对象的表示方法都是键值中间以“:”分隔表示,“:”后面还要增加一个空格

文件名称应该以 .yml 结尾,由三个部分组成

host部分:使用hosts指示使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hosts,hosts也可以使用通配符格式

remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行tasks的用户,可以任意指定,也可以使用sudo,但是用户必须要有执行相应task的权限

tasks:指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块,tasks包含name和要执行的模块

核心元素

playbook的核心元素

Hosts:主机组

Tasks:任务列表

Variables:变量,设置方法有四种

Templates:包含了模板语法的文本文件

Handlers:由特定条件触发的任务

playbook实战-nginx安装

先在主控机器上安装并编译好nginx

进入ansible配置文件目录

# cd /etc/ansible

创建目录

# mkdir nginx.install

# cd nginx.install

# mkdir -p roles/{common.install}/{handlers,files,meta,tasks,templates,vars}

## roles目录下由两个角色,common为一些准备操作,install为安装nginx的操作。每个角色下又有几个目录,handlers下面是当发生改变时要执行的操作,通常用在配置文件发生改变,重启服务。files为安装时用到的一些文件,meta为说明信息,说明角色依赖等信息,tasks里面是核心的配置文件,templates通常存一些配置文件,启动脚本等模板文件,vars下为定义的变量

 

将nginx目录打包,放到/etc/ansible/nginx_install/roles/install/files/下面并重命名

# mv /etc/local/sbin/nginx  /etc/ansible/nginx_install/roles/install/files/nginx.tar.gz

启动脚本和配置文件也移动到/etc/ansible/nginx_install/roles/install/templates/下面

 

定义依赖包

# cd /ect/ansible/nginx.install/roles

# vi common/tasks/main.yml

- name: Install initializtion require software
  yum: name={{ item }} state=installed
  with_items:
  - zlib-devel
  - pcre-devel

 

定义变量

# vi install/vars/main.yml

nginx_user: www
nginx_port: 80
nginx_basedir: /usr/local/nginx

 

拷贝文件

# vi install/tasks/copy.yml

- name: Copy Nginx Software
  copy: src=nginx dest=/tmp/nginx.tar.gz owner=root group=root
- name: Uncompression Nginx Software
  shell: tar zxf /tmp/nginx.tar.gz -C /usr/local/
- name: Copy Nginx Start Script
  template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755
- name: Copy Nginx Config
  template: src=nginx.conf dest={{ nginx_basedir }}/conf/ owner=root group=root mode=0644

 

建立用户,启动服务,删除压缩包

# vi install/tasks/install.yml

- name: Create Nginx User
  user: name={{ nginx_user }} state=present createhome=no shell=/sbin/nologin
- name: Create Nginx Service
  shell: /etc/init.d/nginx start
- name: Add Boot Start Nginx Service
  shell: chkconfig --level 345 nginx on
- name: Delete Nginx compression files
  shell: rm -rf /tmp/nginx.tar.gz

 

调用文件

# vi install/tasks/main.yml

- include: copy.yml
- include: install.yml

 

定义入口文件

# vi /etc/ansible/nginx_install/install.yml

---
- hosts: testhost
  remote_user: root
  gather_facts: Ture
  roles:
  - common
  - install

 

执行

# ansible-playbook /etc/ansible/nginx_install/install.yml

 

 

相关内容

    暂无相关文章