Absible 自动化部署工具简介和入门

来源:互联网 发布:js 数组初始化0 编辑:程序博客网 时间:2024/06/01 15:24

Ansible简介


Ansible是一款基于一致性、安全性、高可靠性设计的轻量级自动化工具,具有功能强大、部署便捷、描述性清晰等特性。Ansible提供一种最简单的方式用于发布、管理和编排计算机系统的工具,可在数分钟内搞定。Ansible由Python语言开发, 默认通过 SSH 协议管理机器。只要ssh连接ok 被控制节点不需要安装任何工具,就可以实现远程连接执行任何操作支持多节点发布、远程任务执行。

Ansible功能特性


  1. 应用代码自动化部署;
  2. 系统管理配置自动化;
  3. 支持持续交付自动化;
  4. 支持云计算,大数据平台环境;
  5. 轻量级,无序在客户端安装agent,更新时只需在控制机上进行更行即可
  6. 批量任务执行可以写成脚本,不用分发到远程就可以执行;
  7. 支持非root用户管理操作,支持sudo;
  8. 使用python编写,维护更简单。

Ansible基础结构


Ansible所有的工作都是基于模块实现的,Ansible本身并没有批量部署的能力,真正具有批量部署的是Ansible所运行的模块,Ansible只是提供了一种框架。组件构成如下:
组件:
1)核心:Ansible主命令
2)核心模块(Core Modules):Ansible默认自带的模块
3)扩展模块(Custom Modules):可以添加各种功能的扩展模块
4)插件(Plugins):完成模块功能的补充
5)剧本(Playbooks):Ansible的任务配置文件,将多个任务定义在剧本中,由Ansible自动执行
6)连接插件(Connectior Plugins):Ansible除了默认使用ssh方式连接各个客户端之外,还支持基于各种连接插件进行连接
7)主机清单(Host Inventory):定义Ansible管理的主机

Ansible安装配置


安装环境要求及过程
1、 源码安装,地址:htttp://github.com/ansible/ansible;
2、 tar包:地址:http://release.ansible.com/ansible
3、 只需安装在控制主机上,不需要其他支撑软件;
4、 准备控制主机(目前不支持windows系统),需要以下组件:
(1) Python 2.6以上
(2) Paramiko模块
(3) PyYAML
(4) Jinja2
(5) Httplib2
5、 被管理节点的要求;
(1) Python 2.5以上
(2) 如果Python版本低于2.5,需安装python-simplejson模块
6、 安装步骤:
(1) 下载源码
(2) 切换到安装路径 cd ./ansible
(3) source ./hacking/env-setup -q
(4) 如果系统没有安装pip,需先安装对应Python版本的pip
(5) 安装控制主机所需的Python模块 sudo pip install paramiko PyYAML Jinja2 httplib six

配置ansible运行环境


1、 使用环境变量方式来配置,大多数ansible参数可以通过设置带有ANSIBLE_开头的环境变量来进行配置,参数名称必须都是大写字母开头,如:export ANSIBLE_SUDO_USER=root,
设置之后就可以直接在playbook中引用了。
2、 修改ansible.cfg文件的参数,常用参数如下:、
(1) inventory:主机清单文件的位置 inventory=/etc/ansible/hosts
(2) library:ansible模块的目录 library=/usr/share/ansible
(3) forks:设置ansible最大并发进程数,默认是5 forks=5
(4) sudo_user:设置默认执行命令的用户 sudo_user= root
(5) remote_port:指定被管理节点的连接端口,默认是22 remote_port=22
(6) host_key_checking:设置是否检查ssh主机秘钥 host_key_checking=False
(7) timeout:ssh连接超时时间 timeout=60
(8) log_path:默认不记录日志,如果要记录,需指定log_path log_path=/var/log/ansible.log
3、ansible1.2.1版本后默认使用公钥认证,如果不需要可以对host_key_checking参数进行操作。

Ansible实例


目录结构

1、Hosts:主机清单文件;
2、group_var:存放全局变量;
3、 rloes:存放具体操作,每一个role下的目录如下图:

4、site.yaml:启动操作文件,存放批量操作规则,即主机对应的roles操作

操作步骤

1、 创建hosts文件:具体内容是被管理的主机地址,实例如下:

[YUM]172.16.7.1 ANSIBLE_SSH_PASS="234"[K8SMASTER] 172.16.7.2 ANSIBLE_SSH_PASS="1234"[NGINX]172.16.7.1 ANSIBLE_SSH_PASS="1234" 172.16.7.2 ANSIBLE_SSH_PASS="1234"

其中,[YUM]表示组名, hosts文件主要是对被管理主机进行分组管理。
2、 创建site.yaml文件:指明hosts中对应的组要进行的操作,需注意此文件为yaml文件,所以要注意格式问题,实例如下:

#为所有主机关闭防火墙- HOSTS: ALL    ROLES:  - COMMON#创建私有YUM源- HOSTS: YUM   ROLES:       - YUMRESOURCE

其中,HOSTS参数指明需进行操作的主机分组,ROLES指明需使用哪个规则来对该类主机进行操作。
3、 创建group_var文件夹,再创建all文件,将需要使用到的全局变量放进去,实例如下:

# VARIABLES HERE ARE APPLICABLE TO ALL HOST GROUPSHTTPD_PORT: 80NTPSERVER: 192.168.1.2#MYSQLMYSQLSERVICE: MYSQLDMYSQL_PORT: 3306DBUSER: ROOTUPASSWORD: ROOT

4、 创建rloes文件夹,再创建每一个具体的role文件夹,一般一些公共的操作,会放到以common命名的rrole中,每一个role文件夹中至少要有一个tasks文件夹,里面至少要有一个man.yaml文件,里面是一些要进行的task。实例如下:

#关闭防火墙等设置#关闭并禁止防火墙开机自启- NAME: DISABLED FIREWALL  SERVICE: NAME=FIREWALLD STATE=STOPPED ENABLED=NO  TAGS: FIREWALLD#关闭LINUX自带防火墙- NAME: CLOSE SELINUX  SHELL: SETENFORCE 0#关闭LINUX自带防火墙- NAME: CLOSE SELINUX IN CONFIGUR FILESCOPY: SRC=SELINUX DEST=/ETC/SYSCONFIG/SELINUX

5、 将创建的文件夹上传到控制主机中,切换到对应的文件目录,执行启动文件,命令:

ansible-playbook -i hosts site.yml 

rloes详解

一般一个典型的role文件夹,会有:
1、 file:存放一些不会改变的文件和一些安装包之类;
2、 handler:主要用来进行重启工作;
3、 tasks:主要是自己写操作步骤
4、 templates:主要是Jinja2模板文件

遇到过的一些问题


1、 ansible本身有很多变量可以供我们使用,但这些变量是比较难掌握的;有些时候你不知道它是从哪里来的;有些时候,可能不知道为什么有些变量可以在playbook中使用,却不能再site文件的规则中使用;有些时候,可能不知道使用环境是什么样的
2、 Jinja2模块的语法和ansible是不同的,二者不可以混用;
3、 copy和template模块不可混用,二者虽然都有copy文件的功能,但本质上是不同的,copy是拷贝file下的文件,template是拷贝templates下的模板文件;
4、 使用条件判断when的时候,不能是带有{{}}格式的变量,如果是这种情况,就需将非系统变量做一个显性的定义,例如:
- NAME: WRITE MYID FILE
SHELL: ECHO “{{ITEM.0+1}}” > /ROOT/ZOOKEEPER-3.4.6/DATA/MYID
WITH_INDEXED_ITEMS: “{{GROUPS.ZOOKEEPER}}”
VARS:
PARAM: “{{ITEM.1}}”
WHEN: ANSIBLE_DEFAULT_IPV4.ADDRESS==PARAM
其中, when: ansible_default_ipv4.address==param就不能直接写成
when: ansible_default_ipv4.address=={{item.1}}