《Ansible_Up-And-Running》筆記2-Ansible實戰(zhàn)

接上一篇總結(jié)了ansible的基本用法,這一次通過部署一個博客站點的例子來進行ansible實戰(zhàn)转唉。分為四個部分网严,第一部分是手動部署一個mezzanine站點呼寸;第二部分是通過ansible來部署mezzanine艳汽;第三部分是使用角色來重寫第二部分的代碼;第四部分則是ansible與docker一起使用的效果对雪。(注: mezzanine是一個基于django的CMS系統(tǒng)河狐,有點類似wordpress,官網(wǎng)地址在這里 瑟捣,不過我們的重點是ansible來部署它馋艺,而不是去深究它自身的運行機制)。

**特別說明:本文內(nèi)容和例子素材與上一篇《Ansible超詳細使用指南》都是來自《Ansible_Up-And-Running》一書迈套,我對書中各章節(jié)內(nèi)容進行了翻譯和整合捐祠,在實際測試過程中對例子代碼有做一些細微的修改和整合,特此說明桑李。
**

1 手動搭建mezzanine

在ansible等配置管理和代碼部署的工具出現(xiàn)之前踱蛀,我們一般是要手動去部署一個系統(tǒng)的。mezzanine算是比較簡單化的系統(tǒng)了贵白,我們可以通過下面的步驟在自己的電腦上搭建一個博客系統(tǒng)(我這里的測試環(huán)境是macos10.12)率拒。

  • 先安裝一下virtualenv。

    pip install virtualenv
    
  • 接著創(chuàng)建一個環(huán)境venv并激活禁荒,然后安裝mezzanine模塊猬膨,接著創(chuàng)建工程,初始化數(shù)據(jù)庫和工程呛伴。輸入管理員用戶名密碼以及郵箱等信息勃痴,運行runserver命令就會默認監(jiān)聽在本地的8000端口了谒所,打開瀏覽器輸入http://127.0.0.1:8000即可訪問了。

    $ virtualenv venv
    $ source venv/bin/activate
    $ pip install mezzanine
    $ mezzanine-project myproject 
    $ cd myproject
    $ python manage.py createdb 
    $ python manage.py runserver
    
          _d^^^^^^^^^b_
       .d''           ``b.
     .p'                `q.
    .d'                   `b.
    .d'                     `b.   * Mezzanine 4.2.2
    ::                       ::   * Django 1.10.3
    ::    M E Z Z A N I N E    ::  * Python 2.7.10
    ::                       ::   * SQLite 3.14.0
    `p.                     .q'   * Darwin 16.3.0
    `p.                   .q'
     `b.                 .d'
       `q..          ..p'
          ^q........p^
              ''''
    
    Performing system checks...
    
    System check identified no issues (0 silenced).
    November 26, 2016 - 13:00:00
    Django version 1.10.3, using settings 'myproj.settings'
    Starting development server at http://127.0.0.1:8000/
    Quit the server with CONTROL-C.
    

這是一個開發(fā)者模式運行的django應(yīng)用召耘,架構(gòu)如圖1所示:

圖1 mezzanine最簡單架構(gòu)

當(dāng)然如果要部署到正式環(huán)境,有以下幾點要考慮:

  • mezzanine默認使用的是sqlite數(shù)據(jù)庫褐隆,在正式環(huán)境我們希望是一個功能更完善的數(shù)據(jù)庫污它,比如postgresql或者mysql。
  • 同時開發(fā)者模式并沒有單獨的web服務(wù)器庶弃,對于靜態(tài)文件和動態(tài)內(nèi)容都是通過django自帶的http server來訪問衫贬,在正式環(huán)境我們更希望通過分離靜態(tài)動態(tài)內(nèi)容,靜態(tài)內(nèi)容通過nginx直接訪問歇攻,而動態(tài)內(nèi)容通過一個http WSGI服務(wù)器如gunicorn或者uwsgi來實現(xiàn)訪問固惯。此外,正式環(huán)境可能還需要部署好https缴守。
  • 我們希望WSGI進程以守護進程的方式運行葬毫,同時能夠很方便的控制啟動,停止和重啟等屡穗。使用一個服務(wù)管理工具是很方便的贴捡,在接下來的實例中我們采用supervisor作為服務(wù)管理工具。

2 ansible部署mezzanine

這一節(jié)用ansible來部署mezzanine村砂,使用nginx做反向代理烂斋,gunicorn做應(yīng)用服務(wù)器,基本架構(gòu)如下:

圖2 采用nginx+gunicorn部署mezzanine

2.1 搭建測試環(huán)境

為了不影響自己的系統(tǒng)環(huán)境础废,同時也為了后面多服務(wù)器測試的方便汛骂,我這里使用virtualbox和vagrant搭建了幾個虛擬機(測試環(huán)境macos10.12),步驟如下:

  • 先下載virtualbox安裝评腺。下載地址帘瞭,當(dāng)然,如果你用的虛擬機軟件是parallel desktop蒿讥,那么就不需要下載virtualbox了图张。
  • 再下載vagrant。下載地址
  • 然后下載一個vagrant支持的虛擬機文件xxx.box(注意你如果你的虛擬機軟件用的是virtualbox诈悍,才跟我這里一樣祸轮,否則請下載parallel desktop對應(yīng)的虛擬機文件),本來是可以直接通過vagrant命令下載的侥钳,不過速度較慢适袜,我用的是 ubuntu/trusty64(14.04),下載地址在這里舷夺,用迅雷下載速度還不錯苦酱,我下載后放置的目錄為 ~/Downloads/virtualbox.box售貌。

安裝好后,在virtualbox運行一個ubuntu/trusty64的虛擬機疫萤。在運行前颂跨,先下載我的測試代碼1,然后進入playbooks目錄,執(zhí)行如下命令:

    1. vagrant box add ubuntu/trusty64 ~/Downloads/virtualbox.box
      添加之前下載的box文件扯饶。
    1. vagrant init ubuntu/trusty64
      這個命令初始化vagrant恒削,在當(dāng)前目錄也就是playbooks目錄下會生成Vagrantfile文件。
      在原來的Vagrantfile里面增加一行private ip配置尾序,這里的ip設(shè)置為192.168.56.18是因為我的virtualbox那個網(wǎng)段為這個钓丰,你的virtualbox的網(wǎng)段如果不同設(shè)置為你自己的即可,注意這里如果設(shè)置錯了可就沒法訪問了每币。最終除去注釋后的Vagrantfile如下所示:
    Vagrant.configure("2") do |config|
      config.vm.box = "ubuntu/trusty64"
      config.vm.network "private_network", ip: "192.168.56.18"
    end
    
  • 3)vagrant up
    啟動虛擬機携丁,如果啟動沒有問題,接下來可以通過vagrant的命令來查看虛擬機的狀態(tài)了兰怠。比如查看ssh配置:

    ssj@ssj-mbp ~/mezzanine-example/raw/playbooks [master*] $ vagrant ssh-config
    

Host default
HostName 127.0.0.1
User vagrant
Port 2222
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/ssj/mezzanine-example/raw/playbooks/.vagrant/machines/default/virtualbox/private_key
IdentitiesOnly yes
LogLevel FATAL
```
可以看到虛擬機的ssh端口為2222梦鉴,私鑰文件是當(dāng)前創(chuàng)建目錄下的 .vagrant/machines/default/virtualbox/private_key,虛擬機的名字和密鑰都是vagrant默認配置好的揭保。后面可以看到自己去編寫Vagrantfile尚揣,可以指定創(chuàng)建虛擬機的ip以及是否創(chuàng)建私鑰。如果設(shè)置config.ssh.insert_key = false掖举,則不會在.vagrant目錄創(chuàng)建一個單獨的私鑰快骗,而是用我們的用戶目錄下面 ~/.vagrant.d/insecure_private_key這個默認私鑰。

    1. 接下來可以連接虛擬機看看了塔次。在當(dāng)前目錄執(zhí)行 vagrant ssh方篮,如無意外,你應(yīng)該已經(jīng)登錄到虛擬機了励负。登錄后默認用戶名是vagrant藕溅,同時,虛擬機的vagrant用戶已經(jīng)被設(shè)置了可以無密碼sudo(這都是vagrant的功勞)继榆。

2.2 ansible部署

搭建好配置環(huán)境后巾表,可以通過ansible來部署mezzanine了。這里我在raw/playbooks目錄下面增加了一個ansible.cfg文件略吨,其中內(nèi)容如下:

[defaults]
hostfile = hosts
remote_user = vagrant
private_key_file = .vagrant/machines/default/virtualbox/private_key
host_key_checking = False

這幾個配置項做的事情就是指定hostfile以及登錄的用戶名集币,私鑰文件的位置以及不檢查host的key。因為這個測試機器只有一臺翠忠,所以hosts文件比較簡單如下鞠苟,只需要指定ssh的主機和端口即可:

web ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222

接下來可以看下用來部署的playbook文件了,代碼如下,只要運行 ansible-playbook mezzanine.yml就可以部署好一個mezzanine当娱,數(shù)據(jù)庫用的postgresql店雅,web服務(wù)器用的nginx疑苫,WSGI用的是gunicorn,另外采用supervisor管理gunicorn進程割择。運行成功后江场,打開 http://192.168.56.18.xip.io 即可訪問飘千。

---
- name: Deploy mezzanine
  hosts: web
  
  ###定義變量###
  vars:
    user: "{{ ansible_ssh_user }}"
    proj_name: mezzanine-example
    venv_home: "{{ ansible_env.HOME }}"
    venv_path: "{{ venv_home }}/{{ proj_name }}"
    proj_dirname: project
    proj_path: "{{ venv_path }}/{{ proj_dirname }}"
    reqs_path: requirements.txt
    manage: "{{ python }} {{ proj_path }}/manage.py"
    live_hostname: 192.168.56.10.xip.io
    domains:
      - 192.168.56.18.xip.io
      - www.192.168.56.18.xip.io
    repo_url: https://github.com/shishujuan/mezzanine-example.git
    gunicorn_port: 8000
    locale: en_US.UTF-8
    conf_path: /etc/nginx/conf
    tls_enabled: True
    python: "{{ venv_path }}/bin/python"
    database_name: "{{ proj_name }}"
    database_user: "{{ proj_name }}"
    database_host: localhost
    database_port: 5432
    gunicorn_proc_name: mezzanine
  vars_files:
    - secrets.yml
  tasks:
    ##使用template模塊替換sources.list文件染坯,以加速安裝軟件包和python第三方模塊阴颖,這是我添加的。####
    - name: set the apt source
      template: src=templates/sources.list.j2 dest=/etc/apt/sources.list
      become: True
      
    ##使用apt模塊安裝必要的軟件包###
    - name: install apt packages
      apt: pkg={{ item }} update_cache=yes cache_valid_time=3600
      become: True
      with_items:
        - git
        - libjpeg-dev
        - libpq-dev
        - memcached
        - nginx
        - postgresql
        - python-dev
        - python-pip
        - python-psycopg2
        - python-setuptools
        - python-virtualenv
        - supervisor

    ##啟動supervisor##
    - name: ensure supervisord is running
      become: True
      service:
        name: supervisor
        state: running
        enabled: yes
        
    ##拉取mezzanine代碼云头,這是我fork的書中的代碼捐友,pip安裝的模塊整合到了requirements.txt中淫半,去除了pip部分溃槐。
    - name: check out the repository on the host
      git: repo={{ repo_url }} dest={{ proj_path }} accept_hostkey=yes
      
    ##pip安裝requirements.txt中的python第三方模塊##
    - name: install requirements.txt
      pip: requirements={{ proj_path }}/{{ reqs_path }} virtualenv={{ venv_path }}
      
    ##創(chuàng)建postgresql用戶##
    - name: create a user
      postgresql_user:
        name: "{{ database_user }}"
        password: "{{ db_pass }}"
      become: True
      become_user: postgres
    - name: create the database
      postgresql_db:
        name: "{{ database_name }}"
        owner: "{{ database_user }}"
        encoding: UTF8
        lc_ctype: "{{ locale }}"
        lc_collate: "{{ locale }}"
        template: template0
      become: True
      become_user: postgres
      
    ##生成local_settings.py文件
    - name: generate the settings file
      template: src=templates/local_settings.py.j2 dest={{ proj_path }}/local_settings.py
      
    ##使用django_manage模塊同步遷移django應(yīng)用數(shù)據(jù)##
    - name: sync the database, apply migrations, collect static content
      django_manage:
        command: "{{ item }}"
        app_path: "{{ proj_path }}"
        virtualenv: "{{ venv_path }}"
      with_items:
        - syncdb
        - migrate
        - collectstatic

    ##使用script模塊跑python代碼設(shè)置站點和管理員密碼。
    - name: set the site id
      script: scripts/setsite.py
      environment:
        PATH: "{{ venv_path }}/bin"
        PROJECT_DIR: "{{ proj_path }}"
        WEBSITE_DOMAIN: "{{ live_hostname }}"
    - name: set the admin password
      script: scripts/setadmin.py
      environment:
        PATH: "{{ venv_path }}/bin"
        PROJECT_DIR: "{{ proj_path }}"
        ADMIN_PASSWORD: "{{ admin_pass }}"
        
    ##使用template模塊設(shè)置gunicorn配置文件
    - name: set the gunicorn config file
      template: src=templates/gunicorn.conf.py.j2 dest={{ proj_path }}/gunicorn.conf.py
    
    ##設(shè)置supervisor配置文件##
    - name: set the supervisor config file
      template: src=templates/supervisor.conf.j2 dest=/etc/supervisor/conf.d/mezzanine.conf
      become: True
      notify: restart supervisor
      
    ##設(shè)置nginx配置文件并notify后面的handler重啟nginx##
    - name: set the nginx config file
      template: src=templates/nginx.conf.j2 dest=/etc/nginx/sites-available/mezzanine.conf
      notify: restart nginx
      become: True
      
    ##添加mezzanine.conf鏈接科吭,并notify后面的handler重啟nginx昏滴。##
    - name: enable the nginx config file
      file:
        src: /etc/nginx/sites-available/mezzanine.conf
        dest: /etc/nginx/sites-enabled/mezzanine.conf
        state: link
      notify: restart nginx
      become: True
      
    ##使用file模塊移除nginx默認配置文件。##
    - name: remove the default nginx config file
      file: path=/etc/nginx/sites-enabled/default state=absent
      notify: restart nginx
      become: True
      
    ##添加ssl證書和key
    - name: ensure config path exists
      file: path={{ conf_path }} state=directory
      become: True
      when: tls_enabled
    - name: create ssl certificates
      command: >
        openssl req -new -x509 -nodes -out {{ proj_name }}.crt
        -keyout {{ proj_name }}.key -subj '/CN={{ domains[0] }}' -days 3650
        chdir={{ conf_path }}
        creates={{ conf_path }}/{{ proj_name }}.crt
      become: True
      when: tls_enabled
      notify: restart nginx
      
    ##安裝poll twitter
    - name: install poll twitter cron job
      cron: name="poll twitter" minute="*/5" user={{ user }} job="{{ manage }} poll_twitter"

  ##重啟nginx和重啟supervisor的handlers##
  handlers:
    - name: restart nginx
      service: name=nginx state=restarted
      become: True
    - name: restart supervisor
      supervisorctl: name=gunicorn_mezzanine state=restarted
      become: True

用到的ansible模塊由file对人,template谣殊,django_manage,supervisorctl, command, postgresql_db等牺弄,模塊的參數(shù)詳解可以見 http://docs.ansible.com/ansible/modules_by_category.html姻几。

3 使用roles重寫playbook

上一節(jié)是所有的功能都寫到了一個playbook,這一節(jié)采用標(biāo)準(zhǔn)的role結(jié)構(gòu)來實現(xiàn)相同功能势告,同時將db和web機器分開部署到兩臺虛擬機中蛇捌。與上一節(jié)不同的是分開了db和web的play,另外將handler放到了role里面的handlers目錄咱台,代碼內(nèi)容基本一致络拌。代碼地址: https://github.com/shishujuan/ansible-practice/tree/master/roles

Vagrantfile內(nèi)容如下回溺,定義了兩個虛擬機春贸。

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # Use the same key for each machine
  config.ssh.insert_key = false

  config.vm.define 'db' do |db|

    # Every Vagrant virtual environment requires a box to build off of.
    db.vm.box = "ubuntu/trusty64"

    # Create a private network, which allows host-only access to the machine
    # using a specific IP.
    db.vm.network "private_network", ip: "192.168.56.11"

    # If true, then any SSH connections made will enable agent forwarding.
    db.ssh.forward_agent = true

    db.vm.provider "virtualbox" do |vb|
      # Use VBoxManage to customize the VM. For example to change memory:
      vb.customize ["modifyvm", :id, "--memory", "512"]
    end
  end

  config.vm.define 'web' do |web|

    # Every Vagrant virtual environment requires a box to build off of.
    web.vm.box = "ubuntu/trusty64"

    # Create a private network, which allows host-only access to the machine
    # using a specific IP.
    web.vm.network "private_network", ip: "192.168.56.10"

    # If true, then any SSH connections made will enable agent forwarding.
    web.ssh.forward_agent = true

    web.vm.provider "virtualbox" do |vb|
      # Use VBoxManage to customize the VM. For example to change memory:
      vb.customize ["modifyvm", :id, "--memory", "512"]
    end
  end

end

然后更改了ansible.cfg的配置,設(shè)置了private key為我的用戶目錄下面的那個公用的key遗遵。roles的目錄結(jié)果如下萍恕,一共3個role,其中aptsource是我自己加的车要,看名字也知道就是為了更改sources.list加快安裝軟件和python模塊的速度雄坪。創(chuàng)建角色的目錄層次結(jié)構(gòu)可以用ansible-galaxy工具,非常方便。具體文件內(nèi)容參見代碼维哈,應(yīng)該不用過多注解了绳姨。

├── aptsource
│   ├── README.md
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   │   └── sources.list
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│       └── main.yml
├── database
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   │   ├── pg_hba.conf
│   │   └── postgresql.conf
│   ├── handlers
│   │   └── main.yml
│   └── tasks
│       └── main.yml
└── mezzanine
    ├── defaults
    │   └── main.yml
    ├── handlers
    │   └── main.yml
    ├── tasks
    │   ├── django.yml
    │   ├── main.yml
    │   └── nginx.yml
    ├── templates
    │   ├── gunicorn.conf.py.j2
    │   ├── local_settings.py.filters.j2
    │   ├── local_settings.py.j2
    │   ├── nginx.conf.j2
    │   └── supervisor.conf.j2
    └── vars
        └── main.yml

4 ansible部署docker

由于docker只能在linux上運行飘庄,如果在mac上跑碾盐,需要另外安裝一個linux的虛擬機凌盯。因此,我直接用第一節(jié)中的vagrant創(chuàng)建的ubuntu/trusty64(14.04的64位版本)做測試掂榔,需要安裝的環(huán)境包括docker.io, python-dev, ansible饱溢。ansible版本為2.2.0翁逞,docker的版本為1.18。注意docker-py的版本肉拓,我這里安裝的是1.2.1,其他的版本會跟docker API版本不兼容欺栗。另外我這里沒有用書中自帶代碼中的作者自己寫的docker模塊瘤旨,而是用的ansible自帶的docker模塊祟偷,有些語法點有所不同修肠,我已經(jīng)做了修改適配。如果你的系統(tǒng)不是ubuntu14.04户盯,安裝的docker版本不一樣嵌施,那么需要安裝的docker-py可能也會不一樣。

另外要注意的是莽鸭,docker模塊在ansible新版本中已經(jīng)不推薦使用了吗伤,取而代之的是docker_containerdocker_image模塊硫眨。

apt-get install docker.io python-dev python-pip libffi-dev
pip install jinja2 ansible docker-py==1.2.1
#查看docker版本
root@vagrant-ubuntu-trusty-64:~# docker version
Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.2.1
Git commit (client): 7c8fca2
OS/Arch (client): linux/amd64
Server version: 1.6.2
Server API version: 1.18
Go version (server): go1.2.1
Git commit (server): 7c8fca2
OS/Arch (server): linux/amd64

完整的代碼地址在這里: https://github.com/shishujuan/ansible-practice/tree/master/docker足淆。分為兩個目錄,dockerfiles和playbooks。其中dockerfiles中的是Dockerfile巧号,包括四個目錄族奢,用來創(chuàng)建鏡像文件,啟動容器在playbook中執(zhí)行丹鸿。進入對應(yīng)的目錄歹鱼,運行make image即可創(chuàng)建好對應(yīng)的鏡像文件,運行docker images可以看到鏡像文件卜高。

ssj@ssj-mbp ~/mezzanine-example/docker/dockerfiles [master*] $ tree
.
├── certs
│   ├── Dockerfile
│   ├── Makefile
│   └── sources.list
├── memcached
│   ├── Dockerfile
│   ├── Makefile
│   └── sources.list
├── mezzanine
│   ├── Dockerfile
│   ├── Makefile
│   └── ansible
│       ├── files
│       │   ├── gunicorn.conf.py
│       │   ├── local_settings.py
│       │   ├── scripts
│       │   │   ├── setadmin.py
│       │   │   └── setsite.py
│       │   └── sources.list
│       └── mezzanine-container.yml
└── nginx
    ├── Dockerfile
    ├── Makefile
    └── nginx.conf

運行的playbook完整代碼如下:

---
- name: run mezzanine from containers
  hosts: localhost
  vars_files:
    - secrets.yml
  vars:
    # The postgres container uses the same name for the database
    # and the user
    database_name: mezzanine
    database_user: mezzanine
    database_port: 5432
    gunicorn_port: 8000
    docker_host: "{{ lookup('env', 'DOCKER_HOST') | regex_replace('^tcp://(.*):\\d+$', '\\\\1') | default('localhost', true) }}"
    project_dir: /srv/project
    website_domain: "{{ docker_host }}.xip.io"
    mezzanine_env:
      SECRET_KEY: "{{ secret_key }}"
      NEVERCACHE_KEY: "{{ nevercache_key }}"
      ALLOWED_HOSTS: "*"
      DATABASE_NAME: "{{ database_name }}"
      DATABASE_USER: "{{ database_user }}"
      DATABASE_PASSWORD: "{{ database_password }}"
      DATABASE_HOST: "{{ database_host }}"
      DATABASE_PORT: "{{ database_port }}"
      GUNICORN_PORT: "{{ gunicorn_port }}"
    setadmin_env:
      PROJECT_DIR: "{{ project_dir }}"
      ADMIN_PASSWORD: "{{ admin_password }}"
    setsite_env:
      PROJECT_DIR: "{{ project_dir }}"
      WEBSITE_DOMAIN: "{{ website_domain }}"

  tasks:
    - name: start the postgres container
      docker:
        image: postgres:9.4
        name: postgres
        publish_all_ports: True
        env:
          POSTGRES_USER: "{{ database_user }}"
          POSTGRES_PASSWORD: "{{ database_password }}"
    - name: capture database ip address and mapped port
      set_fact:
        database_host: "{{ docker_containers[0].NetworkSettings.IPAddress }}"
        mapped_database_port: "{{ docker_containers[0].NetworkSettings.Ports['5432/tcp'][0].HostPort}}"
    - name: wait for database to come up
      wait_for: host={{ database_host }} port=5432
    - name: initialize database
      docker:
        image: lorin/mezzanine:latest
        command: python manage.py {{ item }} --noinput
        env: "{{ mezzanine_env }}"
        detach: False
      with_items:
        - syncdb
        - migrate
      register: django
    - name: debug manage result
      debug: msg="ret={{ django }}"
    - name: set the site id
      docker:
        image: lorin/mezzanine:latest
        command: /srv/scripts/setsite.py
        env: "{{ setsite_env.update(mezzanine_env) }}{{ setsite_env }}"
        detach: False
    - name: set the admin password
      docker:
        image: lorin/mezzanine:latest
        command: /srv/scripts/setadmin.py
        env: "{{ setadmin_env.update(mezzanine_env) }}{{ setadmin_env }}"
        detach: False
    - name: start the memcached container
      docker:
        image: lorin/memcached:latest
        name: memcached
    - name: start the mezzanine container
      docker:
        image: lorin/mezzanine:latest
        name: mezzanine
        env: "{{ mezzanine_env }}"
        links: memcached
    - name: start the mezzanine cron job
      docker:
        image: lorin/mezzanine:latest
        name: mezzanine
        env: "{{ mezzanine_env }}"
        command: cron -f
        detach: False
    - name: start the cert container
      docker:
        image: lorin/certs:latest
        name: certs
    - name: run nginx
      docker:
        image: lorin/nginx-mezzanine:latest
        ports:
          - 80:80
          - 443:443
        name: nginx
        volumes_from:
          - mezzanine
          - certs
        links: mezzanine

簡單說明幾點:

  • 1)這里用到的docker模塊主要是啟動容器以及運行容器的一些初始化命令弥姻。如果要設(shè)置docker容器的端口映射,可以用ports參數(shù)掺涛,如nginx容器庭敦。
  • 2)掛載數(shù)據(jù)卷可以直接用 volumes_from 指定數(shù)據(jù)卷的名字即可。
    1. 要關(guān)聯(lián)各個容器薪缆,可以用links參數(shù)秧廉。使用了links參數(shù)后,會在對應(yīng)容器的/etc/hosts文件中加入一條ip和域名對應(yīng)的記錄拣帽,比如mezzanine 172.17.0.12這樣疼电。
  • 4)有幾個容器帶有command的必須設(shè)置detach=False,因為detach參數(shù)默認為True减拭,這樣會導(dǎo)致容器在后臺運行蔽豺,這個時候去運行command里面的命令是會出錯的。
  • 5)postgres容器用到了publish_all_ports: True拧粪,而mezzanine并沒有使用這個參數(shù)修陡,是因為我們在mezzanine的Dockerfile里面已經(jīng)有EXPOSE 8000指定了暴露的端口為8000,而postgres用的是一個官方的鏡像可霎,我們并沒有設(shè)置端口魄鸦,所以用了publish_all_ports去允許容器中的任意端口暴露。

要測試的話癣朗,先是在dockerfiles目錄下面創(chuàng)建這幾個鏡像文件拾因,然后運行 ansible-playbook run-mezzanine.yml即可啟動容器和跑起來各個服務(wù)。查看容器的命令是 docker ps旷余,進入容器的命令是 docker exec -it xxx /bin/bash绢记,xxx是容器ID或者容器名。更多容器的基本操作請參考 https://yeasy.gitbooks.io/docker_practice/content/荣暮。

5 參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庭惜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子穗酥,更是在濱河造成了極大的恐慌护赊,老刑警劉巖惠遏,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骏啰,居然都是意外死亡节吮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門判耕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來透绩,“玉大人,你說我怎么就攤上這事壁熄≈愫溃” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵草丧,是天一觀的道長狸臣。 經(jīng)常有香客問我,道長昌执,這世上最難降的妖魔是什么烛亦? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮懂拾,結(jié)果婚禮上煤禽,老公的妹妹穿的比我還像新娘。我一直安慰自己岖赋,他們只是感情好檬果,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贾节,像睡著了一般汁汗。 火紅的嫁衣襯著肌膚如雪衷畦。 梳的紋絲不亂的頭發(fā)上栗涂,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音祈争,去河邊找鬼斤程。 笑死,一個胖子當(dāng)著我的面吹牛菩混,可吹牛的內(nèi)容都是我干的忿墅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼沮峡,長吁一口氣:“原來是場噩夢啊……” “哼疚脐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邢疙,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤棍弄,失蹤者是張志新(化名)和其女友劉穎望薄,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呼畸,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡痕支,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛮原。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卧须。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖儒陨,靈堂內(nèi)的尸體忽然破棺而出花嘶,到底是詐尸還是另有隱情,我是刑警寧澤蹦漠,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布察绷,位于F島的核電站,受9級特大地震影響津辩,放射性物質(zhì)發(fā)生泄漏拆撼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一喘沿、第九天 我趴在偏房一處隱蔽的房頂上張望闸度。 院中可真熱鬧,春花似錦蚜印、人聲如沸莺禁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哟冬。三九已至,卻和暖如春忆绰,著一層夾襖步出監(jiān)牢的瞬間浩峡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工错敢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留翰灾,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓稚茅,卻偏偏與公主長得像纸淮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子亚享,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容