Ansible简述

Absible 使用 模块(Modules)来定义配置任务。模块可以用标准脚本语言(Python,Bash,Ruby,等等)编写,这是一个很好的做法,使每个模块幂等。Ansible 剧本(YAML语言编写)角色映射到 节点/虚拟机上,以对这些节点/虚拟机 进行编排有序的执行。
Ansible 支持 ad-hoc 任务:管理任务(不必幂等)以在多个节点/虚拟机上执行。Ansible具有无代理架构:你不需要在配置的节点/虚拟机上安装Ansible(然而,这些节点必须安装 python 环境),Ansible 通过SSH或者通过 PowerShell(Windows 机器)从单个控制机器上配置管理节点/虚拟机,并且能够支持并行配置多个节点。
Ansible 可以用来配置类 unix 系统或 Windows 节点/虚拟机。
Ansible 使用 Python 语言编写。许可:GNU General Public License.

Ansible playbook 示例:

- name: Install nginx
       yum: name=nginx state=present- name: restart nginx
       service: name=nginx state=restarted enabled=yes

什么是Ansible

Ansible 是 DevOps 项目基础支撑工具之一,是第一款实现读/ 写跨平台 的“ Infrastructure- as- code” 工具,从系统管理者到开发者,都可使用Ansible自动化部署并维护整个应用的生命周期,实现持续交付。

Ansible 软件及公司

在维基百科里列出了二十多个, 其中Puppet、Chef和Salt,以及CFEngine、Vagrant和NixOS,大家都可能耳熟能详 了。不过后起之秀Ansible( http:// www. ansible. com/)的人气更高,已经是当今最常用的管理基础架构的开源管理工具之一。


运维自动化的发展

  • 纯手工阶段
  • 脚本阶段
  • 工具阶段

Ansible:"Ansible is Simple IT Automation"

  • 一款简单的自动化工具
  • 无代理(无需再所要管理的系统上安装任何软件)
  • Github上最热门的开源自动化工具之一,可免费使用

Ansible提供

  • 应用部署
  • 配置管理
  • 任务自动化

目标用户:

  • 运维&开发

为什么选择Ansible

Ansible核心技术

特点

  • 无客户端
  • 简单,易懂
  • 扩展性强,可管理从几十台到数千台节点
  • ssh连接,安全
  • 强大社区,大量module,role拿来即用
  • 幂等性

Ansible工作原理

Ansible核心技术

Ansible核心构成

  • Inventory:定义Ansible被管理主机的清单
  • Modules:包括Ansible自带的核心模块及自定义模块
  • Playbooks:剧本,定义Ansible多任务配置文件,由Ansible自动执行
  • API:python接口,提供二次开发及系统整合能力
  • Plugins:完成模块功能的补充,包括连接插件、邮件插件等

Ansible安装

yum方式

yum install epel-release
yum install ansible -y

apt-get方式

apt-get install software-properties-common
apt-add-repository ppa:ansible/ansible
apt-get update
apt-get install ansible

pip方式

pip install ansible

文件安装

  • 可执行文件:/usr/bin/ansible*
  • 配置文件目录:/etc/ansible/
  • ansible-config
  • hosts
  • roles/
  • Python lib文件:usr/lib/python2.7/site-packages/ansible
  • Help文档

重要

  • 在/etc/ansible/ansible-config里关闭host_key_checking

Inventory

  • Ansible 通过读取默认的主机清单配置/etc/ansible/hosts,可以同时连接到多个远程主机上执行任务,也可以同时使用多个清单文件,甚至可以动态地或者从云资源中拉取清单。

Ansible核心技术

Ansible核心技术

Ansible核心技术

Ansible ad-hoc

  • ad-hoc是什么
    完成实时的。一次性的,简单的工作
  • ad-hoc 语法规则
    Ansible核心技术

常用参数

  • -i 指定inventory文件
  • -m 指定模块
  • -a 参数命令
  • -u 指定访问用户
  • -k 输入密码
  • -K 输入sudo密码
  • -f 指定并行数量(默认5)

Ansible常用模块

  • ping:用于检测远程主机是否存活
  • shell:在远程主机上执行shell命令
  • script:在远端机器执行本地脚本
  • yum/apt:用于安装软件包
  • service:用于管理服务
  • file:用于配置文件属性
  • copy:复制文件到远程主机
  • setup :查看远程主机的基本信息

ping

检查目标主机手否存活

示例:

  • ansible -i yard all -m ping

shell

在目标主机执行shell命令

  • chdir:运行shell之前cd到某个目录

示例:

  • ansible all -m shell -a "cat /etc/centos-release"
  • ansible all -m shell -a "cat centos-release chdir=/etc"

script

在目标机器上执行本地脚本

  • chdir:先进入目标文件夹再执行脚本

示例:

ansible db -m script -a "/tmp/add_env.sh"
ansible db -m script -a "/root/test.py chdir=/var/www/"

apt/yum

apt、yum 模块分别用于管理Ubuntu系列和RedHat系列系统软件包

  • name:软件包名
  • state:软件包的状态(present/installed/absent/removed)

示例

  • 确保httpd包已经安装
    ansible webservers -m apt -a "name=httpd state=present"
  • 确保安装包到一个特定的版本
    ansible webservers -m apt -a "name=httpd-1.5 state=present"
  • 确保一个软件包没有被安装
    ansible webservers -m apt -a "name=httpd state=absent"

service

管理目标机器服务的状态

  • name:必选项,服务名称
  • state:对当前服务执行启动,停止、重启、重新加载等操作
    (started,stopped,restarted,reloaded)
  • enabled:是否开机启动 yes|no
  • runlevel:运行级别
  • arguments:给命令行提供一些选项

示例:

  • ansible test -m service -a "name=httpd state=started enabled=yes"
  • ansible test -m service -a "name=network state=restarted args=eth0"
  • ansible test -m service -a "name=httpd state=stopped"

copy

将文件从ansible管理机拷贝到目标机器

  • src:源文件
  • dest:目标路径
  • backup:覆盖之前,是否备份原文件
  • owner:设定文件/目标的属主
  • group:设定文件/目标的属组
  • mode:设定文件/目标的权限

示例:

  • ansible test -m copy -a "src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=644"
  • ansible test -m copy -a "src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes"

file

操作目标机器文件属性,新建/删除文件,文件夹及链接文件

  • group:定义文件/目录的属组
  • owner:定义文件/目录的属主
  • mode:定义文件/目录的权限
  • path:必选项,定义文件/目录的路径
  • state:定义文件状态(directory/link/absent/touch/hard)

示例:

  • ansible test -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"
  • ansible test -m file -a "path=/tmp/ansible mode=755 group=test owner=test"
  • ansible test -m file -a "path=/tmp/test state=directory"

setup

搜集系统信息

  • 搜集主机的所有系统信息
    ansible all -m setup
  • 搜集系统信息并以主机名为文件名分别保存在/tmp/facts 目录
    ansible all -m setup --tree /tmp/facts
  • 搜集和内存相关的信息
    ansible all -m setup -a "filter=ansible_*_mb"
  • 搜集网卡信息
    ansible all -m setup -a "filter=ansible_eth[0-2]"

模块帮助

Playbook

  • YAML文件作为载体
  • 描述多个任务的集合
  • 使目标主机按照既定顺序执行任务以达到期望状态
  • 通过ansible-playbook命令执行

什么是YAML语言

一种人性化的数据格式定义语言

YAML:YAML Ain't a Markup Language

  • 结构感强,可读性好
  • 通用的数据串行化格式

这是一个yaml

---
#一位职工记录
name: David
job: Developer
skill: Elite
employed:True
foods:
    -Apple
    -Orange
Languages:
    ruby:Elite
    python:Elite

语法要求:

  • 以‘---’作为起始句
  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格
  • 缩进的空格数目不重要,相同层级的元素左侧对齐即可

数据类型:

  • 对象:键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence)/列表(list)
  • 纯量(scalars):单个的、不可再分的值

对象

name: David
job: Developer

{''name":"David","job":"Developer"}

数组

- apple
- orange

["apple",'orange']

符合结构

students:
    - name: Lucy
        age:15
    - name: Lily
        age: 13

{students:[{"name":"Lucy","age":15,{"name":"Lily","age":13}}]}

布尔值

create_key: yes/no
gather_facts: true/False
sudoer: T/F

再看yaml

Ansible核心技术

YAML语法检查

Pyhton
Python -c 'import yaml,sys;print yaml.load(sys.stdin)'< test.yaml

YAML Lint
http://www.yamllint.com

Ansible命令工具

Ansible-playbook test.yaml --syntax-check

Ansible核心技术

Play

Ansible核心技术

参考链接:http://blog.51cto.com/weiweidefeng/1895261
未完待续,持续更新