ansible-python自动化运维框架实例

ansible功能简介
ansible是基于Python paramiko开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2模板语言的自动化运维工具,可以用来自动化部署应用、配置、编排task. Ansible在管理节点将 Ansible 模块通过 SSH 协议(或者 Kerberos、LDAP)推送到被管理端执行,执行完之后自动删除

ansible两种工作模式:
1.push模式,即不要在远程主机做任何操作只需要在控制机编排 playbook,push 到远程主机(即通过ssh协议将命令发送到远程主机)即可完成任务,我只是用过这种模式,以下内容都是这种模式
2.pull模式,Ansible 基于 pull 模式的工作流程:
i.每台被控端需要安装 Ansible 和 git(svn)
ii.所有的配置及 playbooks 都存放在 git 仓库
iii.被控端的 ansible-pull 计划任务会定期检查给定的 git 的 tag 或者分支
iv.ansible-pull 执行特定的 playbooks 即 local.yml 或者 hostname.yml
v.每次更改 playbooks 只需要提交到 git 即可

我的计算机环境:
os: ubuntu14.04
python版本: 2.79

备注:
使用ansbile前请确认远程服务器开启了sshd服务。

安装:
pip install ansible

hosts文件格式:
hosts文件保存ansible执行脚本的远程服务器的ip地址,默认的主机清单配置为/etc/ansible/hosts

[webserver] # []内的内容为服务器组的自命名代号,可以随意填写,一个hosts文件可以包含多个服务器组
127.0.0.2:22 # web server的ip,也可以是url;端口可以省略,默认使用ssh的22端口
127.0.0.[01:200] # 代表127.0.0.01至127.0.0.200的ip组
local ansible_ssh_host=127.0.0.1 ansible_ssh_port=22 ansible_ssh_user=piaotiejun ansible_ssh_pass=password ansible_sudo_pass=password ansible_sudo_exe=/usr/bin/sudo ansible_connection=ssh ansible_shell_type=sh ansible_python_interpreter=/usr/bin/python
# local是服务器的别名 之后的参数依次为服务器ip/服务器端口/服务器用户名/链接服务器的ssh密码ansible_ssh_pass需要安装sshpass/服务器sudo密码/sudo文件路径/连接方式默认为ssh可选有[local, ssh, paramiko]/服务器的shell类型默认sh/本地服务器的python路径

[dbserver]
127.0.0.3

执行ansible时的命令样例:
-i 为输入的hosts文件的路径
-m 为选择执行哪个模块
-a 为执行的命令
-B 表示后台执行的时间
-P 检查下状态周期 默认15s

# 这样会在127.0.0.1执行命令'ls; pwd'
ansible -i ./hosts local -m shell -a 'ls; pwd'

# 这样会在127.0.0.3执行命令'ls; pwd'
ansible -i ./hosts dbserver -m shell -a 'ls; pwd'

# 这样会在hosts中的所有服务器执行命令'ls; pwd'
ansible -i ./hosts all -m shell -a 'ls; pwd'

# 这样会在hosts中的dbserver和webserver服务器执行命令'ls; pwd'
ansible -i ./hosts dbserver:webserver -m shell -a 'ls; pwd'

ansible模块:
ansible模块是 ansible识别的、执行具体任务的命令
执行ansible-doc -l可以查看ansible可用的模块
执行ansible-doc moudle_name可以查看ansible可用的模块, moudle_name是模块名
可以到ansible-doc -l下查找模块名即-m后的参数,然后到ansible-doc moudle_name下查找具体执行的命令即-a后的参数
例子:

# copy模块 会将本地服务器当前目录的hosts文件复制到127.0.0.1:/tmp/目录下
ansible -i ./hosts local -m copy -a 'src=./hostsdest=~/tmp/'

# 会将本地服务器当前目录的hosts文件复制到127.0.0.1:/tmp/目录下
ansible -i ./hosts local -m copy -a 'src=./hostsdest=~/tmp/'

# apt模块(debian系列命令) 在127.0.0.1上安装sshpass程序
ansible -i ./hosts local -m apt -a 'pkg=sshpass state=present'

# service模块  检查在127.0.0.1上的nginx服务是否正常运行
ansible -i ./hosts local -m service -a 'name=nginx state=started'

playbooks:
以上例子都是在命令行上对远程服务器执行命令,相当于命令行,那么playbooks相当于由命令行组成的shell脚本。

Playbooks组成:
Target section: 定义将要执行playbook的远程主机组
Variable section: 定义playbook运行时需要使用的变量
Task section: 定义将要在远程主机上执行的任务列表
Handler section: 定义task执行完成以后需要调用的任务

playbooks文件格式遵循YAML标记性语言,关于YAML请查看

http://my.oschina.net/u/1861837/blog/526142 #yaml格式介绍
http://yaml-online-parser.appspot.com/ #在线yaml解析(这个要)

一个playbooks例子:

先执行命令: ssh-copy-id [email protected] 将本地计算机的公钥添加到远程服务器的ssh认证列表中。

---
- hosts: local
  remote_user: piaotiejun
  vars:
    git: [email protected]:piaotiejun/ansible_test.git
    path: ~/tmp

  tasks:
    - name: install pip 
      apt: 
        pkg=python-pip
        state=present

    - name: install virtualenv
      shell: 'pip install virtualenv'

    - name: init virtualenv
      shell: 'virtualenv venc'

    - name: git clone
      shell: 'git clone {{git}}'
      args:
        chdir: '{{path}}'

    - name: git reset
      shell: 'git reset --hard HEAD; git pull'
      args:
        chdir: '{{path}}/ansible_test'

    - name: update python
      shell: 'source venc/bin/activate; pip install -r requirements'
      args:
        chdir: '{{path}}/ansible_test'

    - name: install nginx
      apt:
        pkg=nginx
        state=present

    - name: run app
      shell: 'source venc/bin/activate; gunicorn -b 127.0.0.1:10000 -D app:app'
      args:
        chdir: '{{path}}/ansible_test'

然后执行命令ansible-playbook deploy.yaml -i hosts

以上可以到 > https://github.com/piaotiejun/ansible_test 下载测试,这是一个用ansbile部署一个web应用的测试项目。

你可能感兴趣的:(python,运维)