ansible 简介

Ansible 是基于python开发的,对于客户端的要求是需要有SSH和Python(如果python版本过低则 需要安装python-simplejson module)。

配置

定义配置⽂件,配置⽂文件可以从多个地⽅方加载,其优先级顺序为:

- ANSIBLE_CONFIG (环境变量量) 
- ansible.cfg (当前⽬目录)
- .ansible.cfg (home⽬目录)
- /etc/ansible/ansible.cfg

参考: http://docs.ansible.com/ansible/intro_configuration.html

ansible命令

ansible 执⾏行行简单的临时命令 (ad-hoc命令)
ansible-playbook 执⾏行行playbook,playbook是yaml⽂文件
ansible-doc 查询ansible module ⽂文档

ad-hoc命令

ansible_intro_1

参数:
-i 指定hosts⽂文件的位置,hosts是yaml⽂文件,all表示hosts⽂文件中的所有的组
-m 指定ansible的module,这⾥里里的command表示ansible的command模块,还有很多其他的模块例例如shell -a 指定args参数
-u 指定⽤用户(因为这⾥里里是基于SSH认证的)
ansible-playbook

ansible_intro_2

执行结果如下:

ansible_intro_3

# test.yml 文件中 
hosts: 指定设备组
user: 指定ssh⽤用户
tasks: 关键词指明执⾏行行动作
name: 给动作命名
yum: ansible指定模块
role

使⽤用roles可以更更好的组织框架,如下:

.
├── roles
│   ├── copy
│   │   └── tasks
│   │   └── main.yml
│   └── dmcrypt
│   └── tasks
│   └── main.yml
└── site.yml

5 directories, 3 files

site.yml⽂件是⼊口
tasks下⽂件名必须为main.yml

role下有很多结构,ansible会⾃自动按照⽂文件结构进⾏行行加载解析。具体⽬目录结构如下:

.
├── defaults
├── files
├── handlers
├── meta
├── tasks
├── templates
└── vars

ansible_intro_4

python调用ansible模块
ansible.runner模块
import ansible.runner

r = ansible.runner.Runner(
host_list="/etc/ansible/hosts",
module_name="command",
module_args="ls",
forks=10,
pattern="cmdb"
)

res = r.run()
print res
ansible.playbook模块
import ansible.playbook
from ansible import callbacks
from ansible import utils
import json

example_host = ansible.inventory.host.Host(name='10.204.186.92', port=22)
example_group = ansible.inventory.group.Group(name='simple_group_name')
example_group.add_host(example_host)
example_inventory = ansible.inventory.Inventory()
example_inventory.add_group(example_group)

stats = callbacks.AggregateStats()
playbook_cb = = callbacks.PlaybookCallbacks(verbose=1)
runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=1)
vars = {'ID': 39}

pb = ansible.playbook.PlayBook(
playbook='playbook.yml',
stats=stats,
callbacks=playbook_cb,
runner_callbacks=runner_cb,
inventory=example_inventory,
subset='simple_group_name',
extra_vars=vars
)
res = pb.run()

具体可以查看ansible的源码

yaml模块
import yaml

f = open('C:/Users/sks/Desktop/project/test/1.yml', 'r')
str_1 = f.read()
str_2 = yaml.load(str_1)
f.close()
str_3 = yaml.dump(str_2)
f = open('C:/Users/sks/Desktop/project/test/2.yml', 'w')
f.write(str_3)
f.close()