Ansible任务是幂等的。通常在没有额外编码的情况下,单单调用脚本重复执行通常是不安全的。而Ansible在执行任务之前都会收集当前的系统和环境信息作为上下文环境(这在Ansible中称为Facts
)
Ansible默认通过SSH协议来管理机器。
Ansible安装完成后,不需要新增数据库,也不会有守护进程启动或保持后台运行。你只需要把它安装在一台机器上(通常是一台笔记本电脑),它就可以作为中心点来管理所有的远程机器。Ansible管理远程机器并不依赖于安装或运行与机器上的软件,所以升级Ansible到新的版本并不是一个难题。
Playbooks可以说是Ansible的核心概念。
Playbooks是Ansible的配置,部署和编排语言。它可以描述你希望远程系统执行的策略,也可以描述常规任务中的一系列步骤。
最基本的场合下,playbooks可以用来管理远程机器的配置和部署。更复杂一点的场合,比如说按序进行多层滚动更新,将操作委派给其他主机执行,与监控服务器进行交互,实现负载均衡,playbooks也可以胜任。
由于Playbooks设计考虑,它的语法类似文本语言,可读性很好。
Playbooks通过YAML格式表达,它看起来不是一个编程语言或脚本,而是一个配置或一个过程的模型,这是设计者有意而为之的结果。
在我的例子中,我用Vagrant创建了两个虚拟机。我将在第一台机器上安装Ansible,而在第二个有我应用的一些配置。
多机的配置来自我以前的文章。
Vagrantfile(原文代码因为版本原因有点问题,译者已做更改)
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.define "node" do |node|
node.vm.network "private_network", ip: "192.168.0.101"
node.vm.hostname = "node"
node.vm.provider "virtualbox" do |v|
v.memory = 1024
v.cpus = 1
end
end
config.vm.define "master" do |master|
master.vm.provision :pre, type: :shell, path: "install.sh"
master.vm.network "private_network", ip: "192.168.0.102"
master.vm.hostname = "master"
master.vm.provider "virtualbox" do |v|
v.memory = 1024
v.cpus = 1
end
end
end
install.sh
# add web/database hosts to known_hosts (IP is defined in Vagrantfile)
ssh-keyscan -H 192.168.0.102 >> /home/vagrant/.ssh/known_hosts
ssh-keyscan -H 192.168.0.101 >> /home/vagrant/.ssh/known_hosts
chown vagrant:vagrant /home/vagrant/.ssh/known_hosts
# reload ssh in order to load the known hosts
/etc/init.d/ssh reload
在master
上,使用以下命令安装Ansible:
$ vagrant ssh master
如果要求输入密码,请输入vagrant
。
和安装Ansible的命令(当然你也可以配置在脚本中,在Vagrantfile中调用执行):
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible
sudo apt-get install sshpass
/etc/ansible/hosts
[vagrant]
node ansible_host=192.168.0.101
master ansible_host=192.168.0.102
运行以下命令检查之前的配置命令是否执行成功:
ansible all -m ping -u vagrant --ask-pass
结果应该是:
node | SUCCESS => {
"changed":false,
"ping": pong
}
master | SUCCESS => {
"changed":false,
"ping": pong
}
让我们来创建第一个Playbook,让它在node上安装Java和Tomcat。
playbook-tomcat.yml:
- hosts: node
vars:
http_port: 80
max_clients: 200
remote_user: vagrant
tasks:
- name: updates a server
apt: update_cache=yes
- name: upgrade a server
apt: upgrade=full
- name: install java
apt: name=default-jdk state=latest
- name: install tomcat
apt: name=tomcat7 state=latest
- name: make sure apache is running
service: name=tomcat7 state=started
sudo ansible-playbook playbook-tomcat.yml -u vagrant --ask-pass
执行完毕后,使用vagrant ssh node
连接node
并在其上运行java -version
(可能要多等一会)
如果一切正常,你会看到安装的java版本。
如果你想查看原作者的完整代码,可以点击这里访问。
这个例子中虽然Ansible仅安装在一台机器上(ansible不安装在master而是安装在你的电脑上也可以),但可以在其他机器上执行命令来安装工具或操作(比如说对playbooks进行版本控制)。