使用Ansible自动化管理云上或者本地的基础设施

Ansible任务是幂等的。通常在没有额外编码的情况下,单单调用脚本重复执行通常是不安全的。而Ansible在执行任务之前都会收集当前的系统和环境信息作为上下文环境(这在Ansible中称为Facts

设计原则

  • 有非常简单的设置过程和最小的学习曲线。
  • 可以快速和并行地管理机器。
  • 通过利用现有的SSH守护进程来避免添加自定义代理和其他开放端口。
  • 用同时满足机器友好和可读性高的语言描述基础设施。
  • 重视安全性和内容的可维护性(方便审计、review以及重构)。
  • 不需要任何软件引导即可管理你新建的远程机器。
  • 允许使用任何动态语言进行模块开发,而不仅仅是Python。
  • 非root用户也可以执行。

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进行版本控制)。

本文的版权归 ArrayZoneYour 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT技术精选文摘

深入讲解ActiveMQ5.X消息的持久性

我经常被问到一些基本的关于解释消息存储在ActiveMQ中是如何工作的问题。在这里我将做一个高层面的解释。注意,上下文环境是它是在JMS范围内。如果你使用的是A...

1975
来自专栏北京马哥教育

误删重要文件怎么办?学会Linux 救援模式再也不担心

背景 在运用Linux时会出现一些误操作,导致系统无法正常使用,比如删除了某个重要依赖库,或者删除了rpm等等。在这里记录下具体的操作步骤,供以后参考。 意义 ...

4059
来自专栏北京马哥教育

DNS服务器之理论基础

一、什么是DNS DNS全称为Domain Name System,即域名系统,其作用就是将我们经常使用的“网址”解析为IP地址。 在互联网上...

5645
来自专栏高爽的专栏

服务化架构下的数据一致性如何保证

在系统服务化的过程中,我们不得不面临的一个问题是多个子系统间业务数据的一致性如何保证,解决这个问题有多种方式。 XA 可能很多人首先会想到XA规范中定义的分布式...

2730
来自专栏北京马哥教育

用开源自动化运维工具 SaltStack 在云平台中实现各主机统一配置管理

本文将主要介绍开源软件 SaltStack 自动化运维工具在大型云计算环境中,如何帮助管理员快速完成运维任务,降低运维工作量,提高效率。根据不同业务特性,进行...

5055
来自专栏编程坑太多

『中级篇』docker网络(23)

PS:本机基本上docker的多虚拟机网络已经完成了,比较简单,毕竟是演示环境,可能有老铁说,为啥设置成了自动获得IP,而不是静态IP,毕竟是学习的环境,我也尝...

1324
来自专栏杨建荣的学习笔记

半自动化搭建Data Guard的想法和实践(二)(r9笔记第79天)

关于半自动化搭建Data Guard,自己花了一些时间,总算是把这件事情继续推进了一下,还是再啰嗦一句,为什么不自动化,因为安全。主库就是主库,任何变更都要手...

3425
来自专栏JAVA高级架构

高并发面试必问:分布式消息系统Kafka简介

2823
来自专栏步履前行

RabbitMQ-安装以及入门

一篇文章,想了很久,Spring-data-jpa,Spring-secuity都是想写的,不过由于代码量和深度都不小,最近又在使用mq,就想写一些关于mq的使...

4494
来自专栏java思维导图

分布式事务的实现方法及替代方案

图的上半是两阶段提交成功的演示, 下半是两阶段提交失败的演示. 关于两阶段提交网上有很多经典的讲解, 这里就不细说了

1494

扫码关注云+社区

领取腾讯云代金券