欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Ansible自动化运维

程序员文章站 2022-04-15 23:06:06
Ansible-自动化运维工具 ansible简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。 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:ansible核心程序

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

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

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

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

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

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

ansible工作原理

Ansible自动化运维

ansible任务执行模式

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

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

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

playbook模式(剧本模式)

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

ansible执行流程

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

 

Ansible自动化运维