Ansible

参考Ansible官方文档

    • 安装
    • 配置
    • ad-hoc commands
    • Ansible Python API
    • ansible-playbook

之前用过一段时间的salt-stack,两个都是基于Python的配置管理工具,但有几点原因让我偏爱上了Ansible:

  • salt-stack是c-s模式的,在各个被管理服务器上都要安装配置,启动单独的daemon,相比起来部署的成本就高,也比较占用服务器资源
  • salt的master和minion最好是同一个内网下,如果走公网要单独开放端口并且master必须要部署在有独立IP的机器上,否则minion找不到master,这些问题Ansible都不存在
  • salt-stack在管理各个主机的时候必须要保证各个minion是在线状态,否则会有机器执行不到,我觉得这个是不能容忍的(不知道是不是我敲命令的姿势不对……)
  • 相比salt-stack,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

“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
}

Ansible Python API

官方文档: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_namemodule_args通过函数参数的形式传递进去就可以像在shell命令行中一样通过调用不同的模块实现不同的功能。
我也尝试用Ansible的Python的api结合Django,前端用Bootstrap写了一个运维后台,应付一般的需求也都还可以。

ansible-playbook

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 }}"

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