Ansible快速部署web application
目标
通过ansible快速搭建web应用, 包括 python flask , mysql
大致步骤分为:
- 安装依赖包 python mysql
- 初始化数据库
- 安装flask
- 上传代码文件
- 启动应用程序
我这里的环境是 master-1 作为ansible server , worker-1 worker-2 作为客户机.
机器信息
主机名 | IP |
---|---|
master-1 | 192.168.5.101 |
worker-1 | 192.168.5.201 |
worker-2 | 192.168.5.202 |
ansible安装过程,我这里不作讲解。直接开始ansible playbook的内容。
创建 inventory.txt
[root@master-1 ~]# cat inventory.txt
db_and_web_server-2 ansible_ssh_host=worker-2 ansible_ssh_user=root ansibel_ssh_pass=vagrant
这里只在 worker-2上面做部署。
部署web application的playbook-- db_and_web_application.yml
- name: Deploy a web application
hosts: db_and_web_server-2
tasks:
- name: Install all required dependencies
yum:
name: [ 'python', 'python-setuptools', 'python-pip', 'MySQL-python' ]
state: present
- name: Add repository
yum_repository:
name: mysql57-community
description: MySQL 5.7 Community Server
baseurl: http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
gpgkey: http://repo.mysql.com/RPM-GPG-KEY-mysql
- name: Install and Configure Database
yum: name=mysql-community-server state=present
- name: Start MySQL Service
service: name=mysqld state=started enabled=yes
- name: check file /tmp/init-mysql.log exist
stat:
path: /tmp/init-mysql.log
register: init_mysql_log
- name: Init mysql password
shell: mysql -uroot -p`grep 'temporary password' /var/log/mysqld.log| awk '{print $NF}'` --connect-expired-password -e "alter user root@localhost identified by 'zaq1@WSX123';" > /tmp/init-mysql.log
when: not init_mysql_log.stat.exists
- name: Create application Database
mysql_db: name=employee_db login_host=127.0.0.1 login_user=root login_password='zaq1@WSX123' state=present
- name: Create Database User
mysql_user: name='db_user' host=% password='zaq1@WSX123' priv='*.*:ALL' login_user=root login_password='zaq1@WSX123' state=present
- name: Create Table
shell: |
mysql -uroot -pzaq1@WSX123 --connect-expired-password -e "USE employee_db;CREATE TABLE employees (name VARCHAR(20));INSERT INTO employees VALUES ('JasonLong');"
- name: pip update to 20.2.4
shell: /usr/bin/python -m pip install --upgrade pip==20.2.4
- name: pip update to latest
shell: /usr/bin/python -m pip install --upgrade pip
- name: Install Python Flask dependency
pip: name={{ item }} state=present
with_items:
- flask
- flask-mysql
- name: Copy source code
copy: src=app.py dest=/opt/app.py
- name: Running flask app
shell: FLASK_APP=/opt/app.py nohup flask run --host=0.0.0.0 &
关于- name: Init mysql password ,判断/tmp/init-mysql.log 不存在,就初始化mysql root密码。
- name: Create application Database 创建数据库
- name: Create Database User 创建应用账号
- name: Running flask app 运行flask应用程序
应用程序app.py
import os
from flask import Flask
from flaskext.mysql import MySQL # For newer versions of flask-mysql
# from flask.ext.mysql import MySQL # For older versions of flask-mysql
app = Flask(__name__)
mysql = MySQL()
mysql_database_host = 'MYSQL_DATABASE_HOST' in os.environ and os.environ['MYSQL_DATABASE_HOST'] or 'localhost'
# MySQL configurations
app.config['MYSQL_DATABASE_USER'] = 'db_user'
app.config['MYSQL_DATABASE_PASSWORD'] = 'zaq1@WSX123'
app.config['MYSQL_DATABASE_DB'] = 'employee_db'
app.config['MYSQL_DATABASE_HOST'] = mysql_database_host
mysql.init_app(app)
conn = mysql.connect()
cursor = conn.cursor()
@app.route("/")
def main():
return "Welcome!"
@app.route('/welcome')
def hello():
return 'Hello , welcome to JasonLong Blog'
@app.route('/read from database')
def read():
cursor.execute("SELECT * FROM employees")
row = cursor.fetchone()
result = []
while row is not None:
result.append(row[0])
row = cursor.fetchone()
return ",".join(result)
if __name__ == "__main__":
app.run()
注意: 数据库名和密码是否正确。
运行ansible部署
[root@master-1 ~]# ansible-playbook db_and_web_application.yml -i inventory.txt
我的测试机环境,由于网络问题,下载包有时会超时,失败时多执行几次,就可以了。
上面的部署成功后,我们开始检查一下页面是否正常。
网页访问 http://192.168.5.202:5000/
网页访问 http://192.168.5.202:5000/welcome
网页访问 http://192.168.5.202:5000/read%20from%20database
至此,ansible playbook 部署 python mysql的例子完成。