python-ansible

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

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

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

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

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

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

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

自从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来和远程主机通信的。apache

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包,部署上简单到发指。json

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 。windows

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@084-monitor ~]# ansible test -m file -a 'path=/tmp/ksops state=directory mode=0755 owner=nobody'
192.168.2.250 | success >> {
    "changed": true,
    "gid": 0,
    "group": "root",
    "mode": "0755",
    "owner": "nobody",
    "path": "/tmp/ksops",
    "size": 4096,
    "state": "directory",
    "uid": 99
}

[root@084-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": 0,
    "group": "root",
    "md5sum": "dbdff0f3ef913dd399cd52608c27cdf0",
    "mode": "0755",
    "owner": "root",
    "size": 1148,
    "src": "/root/.ansible/tmp/ansible-tmp-1421140306.4-262938535704591/source",
    "state": "file",
    "uid": 0
}


 

先作免密码登陆,有几台机器就scp几回公钥
ssh-keygen -t rsa -P ''
scp id_rsa.pub 192.168.2.84:/root/.ssh/authorized_keys

[root@084-monitor ansible]# bash ansib
[root@084-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.1.tar.gz
cd pycrypto-2.6.1
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.5.tar.gz
cd yaml-0.1.5
./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.3.tar.gz
cd MarkupSafe-0.9.3
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.3.tar.gz
cd Jinja2-2.7.3
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.1.tar.gz
cd paramiko-1.15.1
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.5.tar.gz
cd simplejson-3.6.5
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.2/
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@084-monitor ansible]# ansible aa -m command -a 'free'
192.168.2.224 | success | rc=0 >>
             total       used       free     shared    buffers     cached
Mem:       1020132     953112      67020          0     134156     541024
-/+ buffers/cache:     277932     742200
Swap:      1675256       6260    1668996

192.168.2.223 | success | rc=0 >>
             total       used       free     shared    buffers     cached
Mem:       7999632    7717876     281756          0     219012    6540924
-/+ buffers/cache:     957940    7041692
Swap:      3145720      32772    3112948

192.168.2.220 | success | rc=0 >>
             total       used       free     shared    buffers     cached
Mem:       3923760    3818168     105592          0     239264    2671504
-/+ buffers/cache:     907400    3016360
Swap:      3145720     132888    3012832

192.168.2.221 | success | rc=0 >>
             total       used       free     shared    buffers     cached
Mem:       1019820     723684     296136          0     138636     104360
-/+ buffers/cache:     480688     539132
Swap:      1675256        736    1674520

192.168.2.222 | success | rc=0 >>
             total       used       free     shared    buffers     cached
Mem:       1020296     951344      68952          0      69916     218880
-/+ buffers/cache:     662548     357748
Swap:      1675256     161188    1514068

 

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

[root@84-monitor ~]# vi /etc/ansible/hosts
[root@84-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=0 >>
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
105  1796  105  1796    0     0   1677      0  0:00:01  0:00:01 --:--:--  7741

192.168.2.232 | success | rc=0 >>
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
105  1796  105  1796    0     0    905      0  0:00:01  0:00:01 --:--:--  7610

[root@84-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=0 >>
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
169   169  169   169    0     0    254      0 --:--:-- --:--:-- --:--:--   725

192.168.2.233 | success | rc=0 >>
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
169   169  169   169    0     0    253      0 --:--:-- --:--:-- --:--:--   725

 

[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"

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息