参考Ansible官方文档
之前用过一段时间的salt-stack,两个都是基于Python的配置管理工具,但有几点原因让我偏爱上了Ansible:
推荐使用软件源进行安装:
yum install ansible # RHEL/CentOS/Fedora,需要配置 EPEL
apt-get install ansible # Debian/Ubuntu
也可以用pip安装,但使用之前要手动添加配置文件:
pip install ansible
ansible-shell是一个非常好用的批量执行命令的命令行工具,可以像在本地操作一样批量地在服务器上执行命令
pip install ansible-shell
/etc/ansible/ansible.cfg是Ansible的默认全局配置文件,也可以将配置写在个人用户的家目录下.ansible.cfg文件中或当前目录下的ansible.cfg文件中,后面的文件配置覆盖前面的配置
/etc/ansible/ansible.cfg
hostfile = /etc/ansible/hosts
forks = 100 #定义同时并发数
ask_sudo_pass = True
ask_pass = True
remote_port = 22
host_key_checking = False #不检查known_hosts
/etc/ansible/hosts
[test]
test ansible_ssh_host=192.168.1.98
[local]
local ansible_ssh_host=127.0.0.1
“ad-hoc commands”是官方文档里面的说法,其实就是在本地敲命令在远程服务器上批量执行,是相对于解析并执行playbook的另一个ansible的功能,以下是经常会用到的用法整理:
ansible all -m ping --ask-pass #使用密码登陆服务器
ansible all -a "df -h" -u admin --sudo -K #admin用户使用sudo执行命令,-K是--ask-sudo-pass的缩写
ansible test -m copy -a "src=./id_rsa dest=/home/test/.ssh/" #批量copy文件
ansible test -m file -a "dest=/home/test/.ssh/id_rsa mode=0600 owner=test group=test" # 修改权限和所有者
ansible all -m file -a "dest=/data mode=755 owner=admin group=admin state=directory" # file支持创建文件夹
ansible all -m setup -u root -a "filter=ansible_memtotal_mb" #获取facts,这里面是查询服务器的总内存数
ansible的setup模块用于获取服务器信息,在/etc/ansible/facts.d目录中加上可执行的返回json信息的脚本或者json/ini文件,以.fact结尾,就可以在setup模块中返回自己想要的内容
ansible all -m setup -u root -a "filter=ansible_local"
/etc/ansible/facts.d/server_no.fact
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import json
def get_server_list():
server_list_file = "/etc/server_no"
f = open(server_list_file)
server_list = f.read().strip().split('\n')
return json.dumps(map(int, server_list))
if __name__ == "__main__":
print get_server_list()
ansible local -m setup -a “filter=ansible_local”
返回信息如下:
local | success >> {
“ansible_facts”: {
“ansible_local”: {
“server_no”: [
1,
2,
3,
4,
5,
6
]
}
},
“changed”: false
}
官方文档:http://docs.ansible.com/ansible/developing_api.html
from ansible.runner import Runner
a = Runner(
pattern="all",
module_name='shell',
remote_user='root',
module_args="df -h"
).run()
print a
官方文档里面只有很简短的一篇关于python api的介绍,其实这个api的作用也确实比较简单,就是提供了一种在Python中直接调用内置各种模块的方法。
将modle_name和module_args通过函数参数的形式传递进去就可以像在shell命令行中一样通过调用不同的模块实现不同的功能。
我也尝试用Ansible的Python的api结合Django,前端用Bootstrap写了一个运维后台,应付一般的需求也都还可以。
playbook是ansible内容最多的一部分,语法很多,慢慢总结吧
ANSIBLE_NOCOWS=1 ansible-playbook servers.yml -vv
ANSIBLE_NOCOWS参数: Ansible运行时会在终端上打印出一个个奶牛的logo,设置ANSIBLE_NOCOWS=1可以去掉这个输出
-vv 参数: 可以输出详细的执行过程和命令,方便debug
# 循环操作
- name: touch file
file: dest=/tmp/{{ item }} state=touch
with_sequence: count=4 (with_sequence: start=6379 end=6389)
# 运行时候让用户输入变量
vars_prompt:
server_no: "input the server_no"
nginx_port: "input the nginx_port"
tasks:
- debug: msg="server_no is {{ server_no }}, nginx_port is {{ nginx_port }}"
# 逐行遍历一个文件:
tasks:
debug: msg="{{ item }} is a line from /etc/hosts"
with_lines:
- cat /etc/hosts
# 查看文件内容并保存到变量里面
vars:
contents: "{{ lookup('file', '/etc/hosts') }}"
tasks:
debug: msg="this is the contents of /etc/hosts: {{ contents }}"