Ansible :一个配置管理和IT自动化工具 (3/3)

现实中的 ansible 例子

我知道不少用户常用 pastebin 这样的服务,以及不少公司基于显而易见的理由配置了他们内部使用的相似东西。最近,我遇到了一个叫作 showterm 的程序,巧合之下我被一个客户要求配置它用于内部使用。这里我不打算赘述这个应用程序的细节,不过若是你感兴趣的话,你可使用 Google 搜索 showterm。做为一个合理的现实中的例子,我将会试图配置一个 showterm 服务器,而且配置使用它所须要的客户端应用程序。在这个过程当中咱们还须要一个数据库服务器。如今咱们从配置客户端开始:php

---
- hosts: showtermClients
  remote_user: root
  tasks:
    - yum: name=rubygems state=latest
    - yum: name=ruby-devel state=latest
    - yum: name=gcc state=latest
    - gem: name=showterm state=latest user_install=no

这部分很简单。下面是主服务器:html

---
    - hosts: showtermServers
      remote_user: root
      tasks:
        - name: ensure packages are installed
          yum: name={{item}} state=latest
          with_items:
            - postgresql
            - postgresql-server
            - postgresql-devel
            - python-psycopg2
            - git
            - ruby21
            - ruby21-passenger
        - name: showterm server from github
          git: repo=https://github.com/ConradIrwin/showterm.io dest=/root/showterm
        - name: Initdb
          command: service postgresql initdb
                   creates=/var/lib/pgsql/data/postgresql.conf
     
        - name: Start PostgreSQL and enable at boot
          service: name=postgresql
                   enabled=yes
                   state=started
        - gem: name=pg state=latest user_install=no
      handlers:
       - name: restart postgresql
         service: name=postgresql state=restarted
     
    - hosts: showtermServers
      remote_user: root
      sudo: yes
      sudo_user: postgres
      vars:
        dbname: showterm
        dbuser: showterm
        dbpassword: showtermpassword
      tasks:
        - name: create db
          postgresql_db: name={{dbname}}
     
        - name: create user with ALL priv
          postgresql_user: db={{dbname}} name={{dbuser}} password={{dbpassword}} priv=ALL
    - hosts: showtermServers
      remote_user: root
      tasks:
        - name: database.yml
          template: src=database.yml dest=/root/showterm/config/database.yml
    - hosts: showtermServers
      remote_user: root
      tasks:
        - name: run bundle install
          shell: bundle install
          args:
            chdir: /root/showterm
    - hosts: showtermServers
      remote_user: root
      tasks:
        - name: run rake db tasks
          shell: 'bundle exec rake db:create db:migrate db:seed'
          args:
            chdir: /root/showterm
    - hosts: showtermServers
      remote_user: root
      tasks:
        - name: apache config
          template: src=showterm.conf dest=/etc/httpd/conf.d/showterm.conf

 

还凑合。请注意,从某种意义上来讲这是一个任意选择的程序,然而咱们如今已经能够持续地在任意数量的机器上部署它了,这即是配置管理的好处。此外,在大多数状况下这里的定义语法几乎是不言而喻的,wiki 页面也就不须要加入太多细节了。固然在个人观点里,一个有太多细节的 wiki 页面毫不会是一件坏事。前端

扩展配置

咱们并无涉及到这里全部的细节。Ansible 有许多选项能够用来配置你的系统。你能够在你的 hosts 文件中内嵌变量,而 ansible 将会把它们应用到远程节点。如:python

[RHELBased]
10.50.1.33 http_port=443
10.50.1.47 http_port=80 ansible_ssh_user=mdonlon

[SUSEBased]
127.0.0.1 http_port=443

尽管这对于快速配置来讲已经很是方便,你还能够将变量分红存放在 yaml 格式的多个文件中。在你的 hosts 文件路径里,你能够建立两个子目录 groupvars 和 hostvars。在这些路径里放置的任何文件,只要能对得上一个主机分组的名字,或者你的 hosts 文件中的一个主机名,它们都会在运行时被插入进来。因此前面的一个例子将会变成这样:mysql

ultrabook:/etc/ansible # pwd
/etc/ansible
ultrabook:/etc/ansible # tree
.
├── group_vars
│ ├── RHELBased
│ └── SUSEBased
├── hosts
└── host_vars
├── 10.50.1.33
└── 10.50.1.47

以及:linux

2 directories, 5 files
ultrabook:/etc/ansible # cat hosts
[RHELBased]
10.50.1.33
10.50.1.47

其它:git

[SUSEBased]
127.0.0.1
ultrabook:/etc/ansible # cat group_vars/RHELBased
ultrabook:/etc/ansible # cat group_vars/SUSEBased
---
http_port: 443
ultrabook:/etc/ansible # cat host_vars/10.50.1.33
---
http_port: 443
ultrabook:/etc/ansible # cat host_vars/10.50.1.47
---
http_port:80
ansible_ssh_user: mdonlon

改善 Playbooks

组织 playbooks 也已经有不少种现成的方式。在前面的例子中咱们用了一个单独的文件,所以这方面被大幅地简化了。组织这些文件的一个经常使用方式是建立角色。简单来讲,你将一个主文件加载为你的 playbook,而它将会从其它文件中导入全部的数据,这些其余的文件即是角色。举例来讲,若是你有了一个 wordpress 网站,你须要一个 web 前端,和一个数据库。web 前端将包括一个 web 服务器,应用程序代码,以及任何须要的模块。数据库有时候运行在同一台主机上,有时候运行在远程的主机上,这时候角色就能够派上用场了。你建立一个目录,并对每一个角色建立对应的小 playbook。在这个例子中咱们须要一个 apache 角色,mysql 角色,wordpress 角色,mod_php,以及 php 角色。最大的好处是,并非每一个角色都必须被应用到同一台机器上。在这个例子中,mysql 能够被应用到一台单独的机器。这一样为代码重用提供了可能,好比你的 apache 角色还能够被用在 python 和其余类似的 php 应用程序中。展现这些已经有些超出了本文的范畴,并且作一件事老是有不少不一样的方式,我建议搜索一些 ansible 的 playbook 例子。有不少人在 github 上贡献代码,固然还有其余一些网站。github

模块

在 ansible 中,对于全部完成的工做,幕后的工做都是由模块主导的。Ansible 有一个很是丰富的内置模块仓库,其中包括软件包安装,文件传输,以及咱们在本文中作的全部事情。可是对一部分人来讲,这些并不能知足他们的配置需求,ansible 也提供了方法让你添加本身的模块。Ansible 的 API 有一个很是棒的事情是,它并无限制模块也必须用编写它的语言 Python 来编写,也就是说,你能够用任何语言来编写模块。Ansible 模块经过传递 JSON 数据来工做,所以你只须要用想用的语言生成一段 JSON 数据。我很肯定任何脚本语言均可以作到这一点,所以你如今就能够开始写点什么了。在 Ansible 的网站上有不少的文档,包括模块的接口是如何工做的,以及 Github 上也有不少模块的例子。注意一些小众的语言可能没有很好的支持,不过那只多是由于没有多少人在用这种语言贡献代码。试着写点什么,而后把你的结果发布出来吧!web

总结

总的来讲,虽然在配置管理方面已经有不少解决方案,我但愿本文能显示出 ansible 简单的设置过程,在我看来这是它最重要的一个要点。请注意,由于我试图展现作一件事的不一样方式,因此并非前文中全部的例子都是适用于你的个别环境或者对于广泛状况的最佳实践。这里有一些连接能让你对 ansible 的了解进入下一个层次:sql

下一步:

更多参考: