Linux中國

使用 Ansible Container 構建和測試應用程序

容器是一個日益流行的開發環境。作為一名開發人員,你可以選擇多種工具來管理你的容器。本文將向你介紹 Ansible Container,並展示如何在類似生產環境中運行和測試你的應用程序。

入門

這個例子使用了一個簡單的 Flask Hello World 程序。這個程序就像在生產環境中一樣由 Apache HTTP 伺服器提供服務。首先,安裝必要的 docker 包:

sudo dnf install docker

Ansible Container 需要通過本地套接字與 Docker 服務進行通信。以下命令將更改套接字所有者,並將你添加到可訪問此套接字的 docker 用戶組:

sudo groupadd docker && sudo gpasswd -a $USER docker
MYGRP=$(id -g) ; newgrp docker ; newgrp $MYGRP

運行 id 命令以確保 docker 組在你的組成員中列出。最後,使用 sudo 啟用並啟動 docker 服務:

sudo systemctl enable docker.service
sudo systemctl start docker.service

設置 Ansible Container

Ansible Container 使你能夠構建容器鏡像並使用 Ansible playbook 進行編排。該程序在一個 YAML 文件中描述,而不是使用 Dockerfile,列出組成容器鏡像的 Ansible 角色。

不幸的是,Ansible Container 在 Fedora 中沒有 RPM 包可用。要安裝它,請使用 python3 虛擬環境模塊。

mkdir ansible-container-flask-example
cd ansible-container-flask-example
python3 -m venv .venv
source .venv/bin/activate
pip install ansible-container[docker]

這些命令將安裝 Ansible Container 及 Docker 引擎。 Ansible Container 提供三種引擎:Docker、Kubernetes 和 Openshift。

設置項目

現在已經安裝了 Ansible Container,接著設置這個項目。Ansible Container 提供了一個簡單的命令來創建啟動所需的所有文件:

ansible-container init

來看看這個命令在當前目錄中創建的文件:

  • ansible.cfg
  • ansible-requirements.txt
  • container.yml
  • meta.yml
  • requirements.yml

該項目僅使用 container.yml 來描述程序服務。有關其他文件的更多信息,請查看 Ansible Container 的入門文檔。

定義容器

如下更新 container.yml

version: "2"
settings:
  conductor:
    # The Conductor container does the heavy lifting, and provides a portable
    # Python runtime for building your target containers. It should be derived
    # from the same distribution as you're building your target containers with.
    base: fedora:26
    # roles_path:   # Specify a local path containing Ansible roles
    # volumes:      # Provide a list of volumes to mount
    # environment:  # List or mapping of environment variables

  # Set the name of the project. Defaults to basename of the project directory.
  # For built services, concatenated with service name to form the built image name.
  project_name: flask-helloworld

services: 
  # Add your containers here, specifying the base image you want to build from.
  # To use this example, uncomment it and delete the curly braces after services key.
  # You may need to run `docker pull ubuntu:trusty` for this to work.
  web:
    from: "fedora:26"
    roles: 
      - base
    ports:
      - "5000:80"
    command: ["/usr/bin/dumb-init", "httpd", "-DFOREGROUND"]
    volumes:
      - $PWD/flask-helloworld:/flaskapp:Z

conductor 部分更新了基本設置以使用 Fedora 26 容器基礎鏡像。

services 部分添加了 web 服務。這個服務使用 Fedora 26,後面有一個名為 base 的角色。它還設置容器和主機之間的埠映射。Apache HTTP 伺服器為容器的埠 80 上的 Flask 程序提供服務,該容器重定向到主機的埠 5000。然後這個文件定義了一個卷,它將 Flask 程序源代碼掛載到容器中的 /flaskapp 中。

最後,容器啟動時運行 command 配置。這個例子中使用 dumb-init,一個簡單的進程管理器並初始化系統啟動 Apache HTTP 伺服器。

Ansible 角色

現在已經設置完了容器,創建一個 Ansible 角色來安裝並配置 Flask 程序所需的依賴關係。首先,創建 base 角色。

mkdir -p roles/base/tasks
touch roles/base/tasks/main.yml

現在編輯 main.yml ,它看起來像這樣:

- name: Install dependencies 
  dnf: pkg={{item}} state=present
  with_items:
    - python3-flask
    - dumb-init
    - httpd
    - python3-mod_wsgi

- name: copy the apache configuration
  copy:
    src: flask-helloworld.conf
    dest: /etc/httpd/conf.d/flask-helloworld.conf
    owner: apache
    group: root
    mode: 655

這個 Ansible 角色是簡單的。首先它安裝依賴關係。然後,複製 Apache HTTP 伺服器配置。如果你對 Ansible 角色不熟悉,請查看角色文檔

Apache HTTP 配置

接下來,通過創建 flask-helloworld.conf 來配置 Apache HTTP 伺服器:

$ mkdir -p roles/base/files
$ touch roles/base/files/flask-helloworld.conf

最後將以下內容添加到文件中:

<VirtualHost *>
    ServerName example.com

    WSGIDaemonProcess hello_world user=apache group=root
    WSGIScriptAlias / /flaskapp/flask-helloworld.wsgi

    <Directory /flaskapp>
        WSGIProcessGroup hello_world
        WSGIApplicationGroup %{GLOBAL}
    Require all granted
    </Directory>
</VirtualHost>

這個文件的重要部分是 WSGIScriptAlias。該指令將腳本 flask-helloworld.wsgi 映射到 /。有關 Apache HTTP 伺服器和 mod_wsgi 的更多詳細信息,請閱讀 Flask 文檔

Flask 「hello world」

最後,創建一個簡單的 Flask 程序和 flask-helloworld.wsgi 腳本。

mkdir flask-helloworld
touch flask-helloworld/app.py
touch flask-helloworld/flask-helloworld.wsgi

將以下內容添加到 app.py

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

然後編輯 flask-helloworld.wsgi ,添加這個:

import sys
sys.path.insert(0, &apos;/flaskapp/&apos;)

from app import app as application

構建並運行

現在是時候使用 ansible-container buildansible-container run 命令來構建和運行容器。

ansible-container build

這個命令需要一些時間來完成,所以要耐心等待。

ansible-container run

你現在可以通過以下 URL 訪問你的 flask 程序: http://localhost:5000/

結論

你現在已經看到如何使用 Ansible Container 來管理、構建和配置在容器中運行的程序。本例的所有配置文件和源代碼在 Pagure.io 上。你可以使用此例作為基礎來開始在項目中使用 Ansible Container。

via: https://fedoramagazine.org/build-test-applications-ansible-container/

作者:Clement Verna 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國