http://sofar.blog.51cto.com/353572/1579894
http://www.aikaiyuan.com/6299.html
http://docs.ansible.com/modules_by_category.html
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在等号的左边。
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"