http://sofar.blog.51cto.com/353572/1579894

http://www.aikaiyuan.com/6299.html

http://docs.ansible.com/modules_by_category.html

http://www.ansible.cn/docs/

http://zh.wikipedia.org/wiki/Cowsay

http://www.poluoluo.com/server/201409/303039.html

http://www.kiratechblog.com/?p=476

自从CFEngine 在1993年被Mark Burgess开发出来之后,配置管理工具就层出不穷了。像puppet 和chef,系统管理员可以有很多选择。Ansible 是一个新的配置管理工具,与其他工具不同的是,其他管理工具注重的是完整性和可配置性,而Ansible注重的是简单性和易用性。

官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。这个工具的目标有这么几项:让我们自动化部署APP;自动化管理配置项;自动化的持续交付;自动化的(AWS)云服务管理。
那么fabric和ansible有什么差别呢?简单来说fabric像是一个工具箱,提供了很多好用的工具,用来在Remote执行命令,而Ansible则是提供了一套简单的流程,你要按照它的流程来做,就能轻松完成任务。这就像是库和框架的关系一样。
当然,它们之间也是有共同点的——都是基于 paramiko 开发的。这个paramiko是什么呢?它是一个纯Python实现的ssh协议库。因此fabric和ansible还有一个共同点就是不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

ansible是一个python package,是个完全的unpack and play软件,对客户端唯一的要求是有ssh有python,并且装了python-simplejson包,部署上简单到发指。

ansible.cfg。ansible执行的时候会按照以下顺序查找配置项:
* ANSIBLE_CONFIG (环境变量)
* ansible.cfg (当前目录下)
* .ansible.cfg (用户家目录下)
* /etc/ansible/ansible.cfg

在ansible中还有一个Module(模块)的概念,这个模块可以理解为一个库,所有的命令都需要通过模块来执行
这是一条ad-hoc命令——临时执行命令,ad-hoc是ansible里的一个概念, 在上面命令中就是 -a
ad hoc——临时的,在ansible中是指需要快速执行,并且不需要保存的命令。说白了就是执行简单的命令——一条命令。对于复杂的命令后面会说playbook。
上面的ad hoc是指执行一条临时的不需要保存的命令,那么复杂的命令怎么执行呢?因此也就有了playbook这个命令: ansible-playbook 。

playbook的组成:playbook是由一个或多个“play”组成的列表,可以让它们联同起来按事先编排的机制执行;所谓task无非是调用ansible的一个module,而在模块参数中可以使用变量;模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致;
执行模型:task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在顺序运行某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在修改playbook后重新执行一次即可;
task组成:每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出;
notify指定handler的执行机制:“notify”这个action可用于在每个play的最后被触发,在notify中列出的操作称为handler,仅在所有的变化发生完成后一次性地执行指定操作。

默认playbook是进行客户端fact搜集,一般如果你配置里没有使用fact的话,可以关闭这样就能减少运行时间

Intro to Playbooks
Introduction To Ad-Hoc Commands
ad hoc     adj 特别的,临时

[root@084-monitor bin]# cat /var/www/html/scripts/newmonitor/aa.yml
---
- hosts: 192.168.2.225
  remote_user: root
  gather_facts: False
  tasks:
  - name: pong
    ping:
  - name: free
    command : free

---
- hosts: web
  remote_user: root
  tasks:
  - name: ping host
    ping:
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

可以用下面的time测试加与不加gather_facts的效果,
[root@084-monitor ~]# time ansible-playbook shell.yml

从本地到远程是copy模块
从远程到本地是fetch模块
[root@084-monitor ~]# ansible 192.168.2.222 -m fetch -a "src=/usr/local/src/jdk1.6.tar.gz dest=/root/"
192.168.2.222 | success >> {
    "changed": true,
    "dest": "/root/192.168.2.222/usr/local/src/jdk1.6.tar.gz",
    "md5sum": "321b6121ff8d59f802dd64cef2452d14",
    "remote_md5sum": "321b6121ff8d59f802dd64cef2452d14"
}

[root@084-monitor ~]# ansible web -m shell -a "ss -ln|grep 80"

如果你有多台服务器的话,想并发运行,可以使用-f参数,默认是并发5
sudo esay_install ansible
# 或者
sudo pip install ansible

-m 模块
shell,        默认是此模块,会处理一些变量,管道,重定向
command,    只能执行单个命令

Python 2.6 或更高版本
Paramiko(Python的SSH模块)
PyYAML(Python的YAML解析器)
Jinja2(Python的模板引擎)

更多模块可以参考:
#ansible-doc –l

受控节点如果是Python 2.4 或 Python 2.5 ,则需额外安装 Simplejson 模块。到Python的2.6或以上版本,就则内置了 Simplejson模块,不需要额外安装任何其它依赖。值得欣慰的是,目前主流的服务器上内置的Python版本绝多数都是 Python 2.6 以上版本。

各自不同的实现
java yaml
python yaml
ruby yaml
Ruby和YAML的联系,甚至比Java与XML的联系还要紧密。Ruby把YAML用到了和数据相关的方方面面。配置文件的约定格式是YAML。同时YAML还是Ruby的文本序列化格式,就像XML是SDO的文本序列化格式一样。
不夸张的说,YAML是Ruby中流动的血液。
由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用。列一下现有的语言实现:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript。除了Java,其他都是脚本语言.
YAML比较适合做序列化。因为它是宿主语言数据类型直转的。
YAML做配置文件也不错。比如Ruby on Rails的配置就选用的YAML。对ROR而言,这很自然,也很省事.
由于兼容性问题,不同语言间的数据流转建议现在不要用YAML.

We use YAML because it is easier for humans to read and write than other common data formats like XML or JSON. Further, there are libraries available in most programming languages for working with YAML.

默认情况下Ansible会读取 /etc/ansible 文件里的主机列表,内容为ini格式的
ini格式
xml格式
json格式

ini文件(Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。
为什么要用INI文件?如果我们程序没有任何配置文件时,这样的程序对外是全封闭的,一旦程序需要修改一些参数,必须要修改程序代码本身并重新编译,这样很不好,所以要用配置文件,让程序出厂后还能根据需要进行必要的配置;配置文件有很多如INI配置文件,XML配置文件,还有就是可以使用系统注册表等。
本文主要是为读者在实现读写INI配置文件模块之前,提供有关INI文件的格式信息。
“.INI ”就是英文 “initialization”的头三个字母的缩写;当然INI file的后缀名也不一定是".ini"也可以是".cfg",".conf ”或者是".txt"。
INI文件的格式很简单,最基本的三个要素是:parameters,sections和comments。
INI所包含的最基本的“元素”就是parameter;每一个parameter都有一个name和一个value,name和value是由等号“=”隔开。name在等号的左边。

yaml在python上的具体实现:PyYaml
YAML被很多人认为是可以超越xml和json的文件格式。对比xml,除了拥有xml的众多优点外,它足够简单,易于使用。而对于json,YAML可以写成规范化的配置文件(这我认为是高于json很多的优点,用json写配置文件会让人发疯)。

任何转义失效的地方都可能发生注入。幸运的是,许多框架(至少有Pyramid和Flask)使用了markupsafe库,它能智能地帮助避免这个问题。
markupsafe提供一个单一的类, Markup ,继承自 unicode . Markup(u'Hello!') ,会产生一个行为上相当像字符串的对象。类方法 Markup.escape 工作方式相同,但会转义经过包裹的字符串中的任意HTML字符。

Jinja2是基于python的模板引擎,功能比较类似于于PHP的smarty,J2ee的Freemarker和velocity。 它能完全支持unicode,并具有集成的沙箱执行环境,应用广泛。jinja2使用BSD授权。
果然,还是需要用到模板,不能总是直接在Response中写上长串的html代码。
python中的模板引擎主要有mako, genshi, jinjia等。
    mako 主要特点在于模板里面 可以比较方便的嵌入Python代码,而且执行效率一流;
    genshi 的特点在于基于 xml, 非常简单易懂的模板语法,对于热爱xhtml的朋友来说是很好的选择,同时也可以嵌入Python 代码,实现一些复杂的展现逻辑;
    jinja 和 genshi 一样拥有很简单的模板语法,只是不 依赖于 xml 的格式,同样很适合设计人员直接进行模板的制作,同时也可以嵌入Python 代码实现一些复杂的展现逻辑。

Python
中使用SSH需要用到OpenSSH,而OpenSSH依赖于paramiko模块,而paramiko模块又依赖于pycrypto模块,因此要在
Python中使用SSH,则需要先安装模块顺序是:pycrypto -> ecdsa -> paramiko
看很多博客没有提到这个库,但我执行paramiko时,提示找不到ecdsa模块。

在python中,我理解的simplejson模块就是主要用于将python数据类型转换为json类型。
控制服务器(Master)需要安装Python2.6/7,windows上无法使用ansible。被管理的服务器(Managed Node)需要安装Python2.4以上的版本,如果低于2.5,需要安装python-simplejson。
yum -y install python-simplejson

对于连接多台服务器,进行复杂的连接操作特别有帮助。批量操作机器
安装paramiko有两个先决条件,python和另外一个名为PyCrypto的模块。
通常安装标准的python模块,只需要在模块的根目录下运行:
python setup.py build
python setup.py install

ansible Site01 -u root -k -m ping
回车后会提示你输入root密码,然后会打印如下结果:
如果你使用密钥方式登录SSH,去掉 -k 参数即可。可以为Ansible设置一个特定的用户,所有操作均以此用户来执行。甚至可以为每个“受控节点”设置各自不同的用户。 [root@-monitor ~]# ansible test -m file -a 'path=/tmp/ksops state=directory mode=0755 owner=nobody'
192.168.2.250 | success >> {
"changed": true,
"gid": ,
"group": "root",
"mode": "",
"owner": "nobody",
"path": "/tmp/ksops",
"size": ,
"state": "directory",
"uid":
} [root@-monitor ~]# ansible test -m copy -a 'src=/root/ssh-conn dest=/tmp/ mode=0755 owner=root'
192.168.2.250 | success >> {
"changed": true,
"dest": "/tmp/ssh-conn",
"gid": ,
"group": "root",
"md5sum": "dbdff0f3ef913dd399cd52608c27cdf0",
"mode": "",
"owner": "root",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1421140306.4-262938535704591/source",
"state": "file",
"uid":
}
先做免密码登录,有几台机器就scp几次公钥
ssh-keygen -t rsa -P ''
scp id_rsa.pub 192.168.2.84:/root/.ssh/authorized_keys [root@-monitor ansible]# bash ansib
[root@-monitor ansible]# cat ansib
wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz
tar zxvf setuptools-7.0.tar.gz
cd setuptools-7.0
python setup.py install
cd ../ wget --no-check-certificate https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz
tar zxvf pycrypto-2.6..tar.gz
cd pycrypto-2.6.
yum install python-devel
python setup.py install
cd ../ wget --no-check-certificate http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
tar zxvf yaml-0.1..tar.gz
cd yaml-0.1.
./configure --prefix=/usr/local
make --jobs=`cat /proc/cpuinfo|grep processor|wc -l`
cd ../ wget --no-check-certificate https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz
tar zxvf PyYAML-3.11.tar.gz
cd PyYAML-3.11
python setup.py install
cd ../ wget --no-check-certificate https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz
tar zxvf MarkupSafe-0.9..tar.gz
cd MarkupSafe-0.9.
python setup.py install
cd ../ wget --no-check-certificate https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz
tar zxvf Jinja2-2.7..tar.gz
cd Jinja2-2.7.
python setup.py install
cd ../ wget --no-check-certificate https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz
tar zxvf ecdsa-0.11.tar.gz
cd ecdsa-0.11
python setup.py install
cd ../ wget --no-check-certificate https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz
tar zxvf paramiko-1.15..tar.gz
cd paramiko-1.15.
python setup.py install
cd ../ wget --no-check-certificate https://pypi.python.org/packages/source/s/simplejson/simplejson-3.6.5.tar.gz
tar zxvf simplejson-3.6..tar.gz
cd simplejson-3.6.
python setup.py install
cd ../ wget --no-check-certificate https://github.com/ansible/ansible/archive/v1.7.2.tar.gz
tar zxvf v1.7.2.tar.gz
cd ansible-1.7./
python setup.py install
cd ../ mkdir -p /etc/ansible cat <<EOF > /etc/ansible/ansible.cfg
[defaults]
hostfile=/etc/ansible/hosts
EOF cat <<EOF > /etc/ansible/hosts
[aa]
192.168.2.220
192.168.2.221
192.168.2.222
192.168.2.223
192.168.2.224
EOF
[root@-monitor ansible]# ansible aa -m command -a 'free'
192.168.2.224 | success | rc= >>
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap: 192.168.2.223 | success | rc= >>
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap: 192.168.2.220 | success | rc= >>
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap: 192.168.2.221 | success | rc= >>
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap: 192.168.2.222 | success | rc= >>
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap:

批量部署  在有很多服务器,并且需要相同环境时,批量部署就很简单与方便了。不用专门每次都去下载wget,直接使用自带的curl就可以了

[root@-monitor ~]# vi /etc/ansible/hosts
[root@-monitor ~]# ansible mfs -m shell -a "curl 'http://ppa.moosefs.com/RPM-GPG-KEY-MooseFS' > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS"
192.168.2.233 | success | rc= >>
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
:: :: --:--:-- 192.168.2.232 | success | rc= >>
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
:: :: --:--:-- [root@-monitor ~]# ansible mfs -m shell -a "curl 'http://ppa.moosefs.com/MooseFS-stable-rhsysv.repo' > /etc/yum.repos.d/MooseFS.repo"
192.168.2.232 | success | rc= >>
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
--:--:-- --:--:-- --:--:-- 192.168.2.233 | success | rc= >>
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
--:--:-- --:--:-- --:--:--

[root@84-monitor ~]# ansible wo -m shell -a "sed -i '/ntpdate/d' /var/spool/cron/root"

[root@84-monitor ~]# ansible wo -m shell -a "echo '0 20 * * * /usr/sbin/ntpdate 192.168.2.1 && /sbin/clock -w > /dev/null 2>&1' >>/var/spool/cron/root"

python-ansible的更多相关文章

  1. python ansible api

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @File : test2.py # @Author: Anthony.waa # @Date : 20 ...

  2. Python+Django+ansible playbook自动化运维项目实战☝☝☝

    Python+Django+ansible playbook自动化运维项目实战☝☝☝  一.入门引导 DevOPSDevOps(英文Development和Operations的组合)是一组过程.方法 ...

  3. ansible自动化

    一,工具与环境介绍   1.1 ansible简介 批量管理服务器的工具 无需部署agent,通过ssh进行管理 流行的自动化运维工具:https://github.com/ansible/ansib ...

  4. ansible学习笔记三:playbook和roles

    参考博客: Ansible 系列之 Playbooks 剧本 -飞走不可(博客园) linux运维学习之ansible的playbook及roles的使用 - 51CTO博客 nginx 基于uwsg ...

  5. ansible 2.1.0 api 编程

    pdf文档 https://media.readthedocs.org/pdf/ansible/latest/ansible.pdf api介绍 http://blog.csdn.net/python ...

  6. ansible 模块 roles

    setup 作用,用来查看用看内部的详细信息 ansible_all_ipv4_addresses # ipv4的所有地址 ansible_all_ipv6_addresses # ipv6的所有地址 ...

  7. ansible之基础篇(三)

    setup ansible_all_ipv4_addresses # ipv4的所有地址 ansible_all_ipv6_addresses # ipv6的所有地址 ansible_date_tim ...

  8. Ansible批量自动化管理工具 roles标准化

    批量管理服务器的工具,无需部署代理,通过ssh进行管理,是python写的 ansible 常用模块 : (1)shell命令模块执行命令 (2)copy模块批量下发文件或文件夹 (3)script模 ...

  9. ansible 剧本进阶 角色

    主要内容: playbook(剧本) roles 一.查看收集到的信息 ansible cache -m setup setup (需要了解的参数) ansible_all_ipv4_addresse ...

  10. Ansible - iventory

    概述 简单的 ansible 准备 ansible 安装 免密登录 约定 因为重点是 iventory, 所以只使用最简单的模块 ping 1. host-simple 概述 简单版 hosts 文件 ...

随机推荐

  1. HDU5619 (费用流)

    Problem Jam's Store (HDU5619) 题目大意 有m个服务员,和n个顾客,给出每个服务员招待每个顾客的时间,每个服务员在同一时间只能服务一个顾客,询问所有顾客完成服务的最少时间. ...

  2. 四则运算<3>

    //李妍 2015.3.12 //四则运算新 #include<iostream> #include<fstream> #include<iomanip> #inc ...

  3. WPF Step By Step 完整布局介绍

    WPF Step By Step 完整布局介绍 回顾 上一篇,我们介绍了基本控件及控件的重要属性和用法,我们本篇详细介绍WPF中的几种布局容器及每种布局容器的使用场景,当 然这些都是本人在实际项目中的 ...

  4. SQL基础2

    create database fuxi --创建一个名为“fuxi”的数据库go                   --连接语句use fuxi   --使用名为“fuxi”的数据库gocreat ...

  5. LeetCode Rectangle Area (技巧)

    题意: 分别给出两个矩形的左下点的坐标和右上点的坐标,求他们覆盖的矩形面积? 思路: 不需要模拟,直接求重叠的部分的长宽就行了.问题是如果无重叠部分,注意将长/宽给置为0. class Solutio ...

  6. Linux常用命令整理 - imsoft.cnblogs

    su 用户名 在不退出登陆的情况下,切换到另外一个人的身份如果用户名缺省,则切换到root状态会提示输入密码,密码不回显的. 在用su命令切换root用户时,使用“-”选项,这样可以将root的环境变 ...

  7. c语言中函数的递归

    题目:用递归法把一个整数转换成字符串输出. 比较下面两种方法的不同: putchar(n%10+'0')的位置不同,造成输出结果的不同. 方法一: #include <stdio.h> v ...

  8. CentOS6.3 Hostname设定修改

    今天装了个CentOS6.3恩,基本上是参照百度文库上面的文章来安装的 http://wenku.baidu.com/link?url=K0tqotryKLFHhJGicx1nC-hsgfWhL3OI ...

  9. 转 用 AXIOM 促进 XML 处理

    转自:http://www.ibm.com/developerworks/cn/xml/x-axiom/ AXIOM 还不是另一种对象模型.它有着明确的设计目标:大幅提升 Apache 下一代 SOA ...

  10. Tomcat的JVM优化

    一.JVM管理内存段分类 1.线程共享内存 方法区:存储jvm加载的class.常量.静态变量.及时编译器编译后的代码等 java堆:存储java所有对象实例.数组等 2.线程私有内存 程序计数寄存器 ...