自动化部署系统将集群的所有状态保存在几个文件中,及时将集群完全摧毁,通过这些配置文件,可以很快恢复完全一样的集群出来。
这就像将一座城市保存在一个水晶球里。或者钢铁侠的衣服折叠成一个手提箱。
比起来其他自动化集群管理和运维工具 Puppet、Chef、Slat, Ansible 显得很简单并且轻量级, 但是Ansible 又不像 Fab 那样功能单一只能做批量命令。
Ansible 比 Fab 增加了对服务器状态的管理功能,这样就能将运维操作状态记录和保存在版本库中。Ansible 尽量少引入 DSL 这样的学习门槛。配置文件只是常见的 YAML 格式 (playbooks)。
同样这样的简单设计的劣势是没有依赖管理功能。但是 Ansible 对于一般的使用场景已经足够了。
可以用来初始化基础设施的服务器集群,用户管理、部署和更新、卸载应用代码,管理配置文件,维护 Web 服务器等等。并且可以用来同时管理多个不同的云服务提供商。
轻量级的好处是学习门槛低、问题少、安装快、执行快。操作完全依赖 SSH 而不需要安装 agent 。这样的好处是不再需要维护 agent 的状态,不用担心 Agent 挂掉。而 SSH 是每台服务器必备的服务。它非常适合安全补丁更新的场景。比如,100 台服务器打 bash vulnerability 安全补丁只需要 10 分钟。
这样你可以将服务器混合部署在自建 IDC、AWS、DigitalOcean、Linode 上。而且将调试环境放到本机的 Vagrant 的虚拟机中。
这对于测试和调试非常方便。
Ansible 支持对集群的小部分机器批量操作,然后逐步完成整个集群的操作。这对于需要机器重启的场景就非常实用。
Ansible 可以补充现有 Salt 和 puppet 系统的不足。比如重启那些运行在每个服务器上的 Agent 。
任务 Task
多个 Task 顺序执行,在每个 Task 执行结束可以通知 Hanlder 触发新操作。
变量 Variable
用户定义的变量。
环境 Facts
Facts 从每台服务器上收集得到,可以用作变量。
模块
比如 shell、ping、apt 等等
操作 Hanlder
sudo pip install ansible
修改 /etc/ansible/hosts 添加
[web] 192.168.1.2 192.168.1.3 192.168.1.4
PS: 一般将 hosts 文件放到当前文件夹, 需要在命令中指定 hosts 文件位置
ansible -u root web -m ping -i ./hosts
执行下 Helloworld:
ansible all -m ping -u root
这样的入门教程已经完成了。
ansible all -m ping -u root
看其他几个常用的操作,体会一下,通过看命令你就会知道所做的操作,非常简单:
ansible -u root web -m copy -a "src=/etc/hosts dest=/tmp/hosts" ansible -u root web -m yum -a "name=abcd state=present" ansible -u root web -m yum -a "name=abcd state=absent" ansible -u root web -m user -a "name=foo password=" ansible -u root web -m user -a "name=foo state=absent ansible -u root web -m git -a "repo=git://blog.eood.cn/repo.git dest=/srv/myapp version=HEAD" ansible -u root web -m service -a "name=nginx state=started" ansible -u root web -m service -a "name=nginx state=restarted" ansible -u root web -m service -a "name=nginx state=stopped"
--- - hosts: blog.eood.cn tasks: - name: Installs nginx web server apt: pkg=nginx state=installed update_cache=true notify: - start nginx handlers: - name: start nginx service: name=nginx state=started
保存成 nginx.yml
ansible-playbook nginx.yml
通过添加命令行变量可以 override nginx 中的变量。