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应用的测试项目。