ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种核心模块、command模块、shell模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:可以通过该模块实现复杂任务流程
(6)、自定义模块
Ansible 中文指南:http://www.ansible.com.cn/docs/intro.html
配置PPA及安装ansible,执行如下命令:
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
Ansible提供两种方式去完成任务,一是 ad-hoc 命令,一是写 Ansible playbook.前者可以解决一些简单的任务, 后者解决较复杂的任务.
执行命令:
ansible
ansible是基于模块的,所有功能都是通过相应的模块来提供的,执行命令默认的是command模块
command 模块不支持 shell 变量,也不支持管道等 shell 相关的东西.如果你想使用 shell相关的这些东西
ansible test -m shell -a 'echo $TERM‘
如果想复制文件到远程主机可以通过copy模块
ansible atlanta -m copy -a "src=/etc/hosts dest=/tmp/hosts"
相对于ad-hoc,playbooks可以处理更复杂处理流程
playbook是将多个task串联成起来,并且可以根据每个task处理结果作不同处理,语法格式是YAML
每个play可以包括vars,tasks,handlers
vars:一个参数列表,可以在tasks,handlers引用
tasks:任务列表,任务是按照从上到下顺序执行的
handlers:在发生改变执行的操作
示例:
modules 具有”幂等”性,意思是如果你再一次地执行 moudle,moudle 只会执行必要的改动,只会改变需要改变的地方.所以重复多次执行 playbook 也很安全.
Handlers就在每个task处理完之后执行,可以通过notify注册事件
比如:
即使多个task通知了相同的事件,handler也只会触发一次。
Handlers 也是一些 task 的列表,通过名字来引用,它们和一般的 task 并没有什么区别.Handlers 是由通知者进行 notify, 如果没有被 notify,handlers 不会执行.不管有多少个通知者进行了 notify,等到 play 中的所有 task 执行完成之后,handlers 也只会被执行一次.
这里是一个 handlers 的示例:
Facts通过访问远程系统获取相应的信息. 一个例子就是远程主机的IP地址或者操作系统是什么. 使用以下命令可以查看哪些信息是可用的:
ansible hostname -m setup
Facts会返回巨量的远端系统的信息,这些信息都可以在playbook里直接使用,类似于变量。
比如:
{{ ansible_devices.sda.model }}
如果不需要远程主机的信息可以关闭facts(默认是开户的),如下命令:
-hosts: whatever
gather_facts: no
•extra vars (-e in the command line) always win
•then comes connection variables defined in inventory (ansible_ssh_user, etc)
•then comes "most everything else" (command line switches, vars in play, included vars, role vars, etc)
•then comes the rest of the variables defined in inventory
•then comes facts discovered about a system
•then "role defaults", which are the most "defaulty" and lose in priority to everything.
•
•extra vars (在命令行中使用 -e)优先级最高
•然后是在inventory中定义的连接变量(比如ansible_ssh_user)
•接着是大多数的其它变量(命令行转换,play中的变量,included的变量,role中的变量等)
•然后是在inventory定义的其它变量
•然后是由系统发现的facts
•然后是 "role默认变量", 这个是最默认的值,很容易丧失优先权
在我只想在特定条件才想执行的task可以用when过滤
eg:
当然也可以根据执行过的task结果作为条件
Ansible提供循环可以在一个任务里执行一组事情,比如创建一组用户,安装很多包,删除特定文件。Ansible循环分很种,也支持自定义的循环。
介绍几种常用的循环
标准循环:
哈希循环:
还有一些其它循环:嵌套循环、文件列表循环、子元素循环、随机选择等,都可以在官方文档里找到资料
Roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以handler。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles 。
一个 playbook 如下:
---
- hosts: webservers
roles:
- common
- webservers
这个 playbook 为一个角色 ‘x’ 指定了如下的行为:
如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 将被添加到 play 中
如果 roles/x/handlers/main.yml 存在, 其中列出的 handlers 将被添加到 play 中
如果 roles/x/vars/main.yml 存在, 其中列出的 variables 将被添加到 play 中
如果 roles/x/meta/main.yml 存在, 其中列出的 “角色依赖” 将被添加到 roles 列表中 (1.3 and later)
所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路径。
所有 script tasks 可以引用 roles/x/files/ 中的脚本,不需要指明文件的路径。
所有 template tasks 可以引用 roles/x/templates/ 中的文件,不需要指明文件的路径。
所有 include tasks 可以引用 roles/x/tasks/ 中的文件,不需要指明文件的路径。
https://galaxy.ansible.com/ 提供了一些由社区开发的roles。
对于我们做项目是一个很好的参考。
安装一个第三方的role非常简单,只需要执行下面的命令:
$ ansible-galaxy install username.rolename
比如安装一下username为binarycode,role为openstack-keystone的role可以执行以下命令:
$ ansible-galaxy install binarycode.openstack-keystone