linux cpu占用率如何看
265
2022-10-14
ansible的python实现
Ansible管理:一般我们常常使用yml格式进行管理。但yml格式的编写较为苛刻,不好排除错误且比较费时费力
于是思考,是否能够使用python 协助进行ansible的批量命令管理:
1.ansible搭建
在自己设定的ansible安装位置,设置myansi文件夹,收管理的集群必须与ansible管理主机免密通讯
在下面创建两个文本: ansible.cfg hosts
Vim ansible:
[defaults]
inventory = hosts //查看分组情况
remote_user = root //远端登录的用户
Vim hosts: //设置管理的集群
[dbservers]
node1.XXX.cn
[webservers]
node2.XXX.cn
node3.XXX.cn
设置远程的hosts
Echo 192.168.4.1{1..3} node {1..3} >> /etc/hosts
设置免应答文件:
ssh-keyscan 192.168.4.1{1..3} node{1..3} node{1..3} node{1..3}.XXX.cn >> ~/.ssh/known_hosts
检验是否可用ansible ping通
ansible all -m ping -k
设置vim小工具,方便配置yml
Vim ~/.vimrc
set ai #自动缩进
set ts=4 #一个tab=4空格
set et #tab转化位空格
autocmd FileType yaml setlocal sw = 2 ts = 2 et ai #在yaml中 ts =2 ai et
对比:
ansible的一般yml操作
1 . 设置密钥/安装yum:
vim auth_key.yml
---
- name: configure authorized key
hosts: all
tasks:
- name: root key
authorized_key:
user: root
state: present
key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
- name: copy yum file
copy:
src: files/dvd.repo
dest: /etc/yum.repos.d/
#语法检测+执行
ansible-playbook --syntax-check auth_key.yml
ansible-playbook auth_key.yml
2.安装web,db应用到各个主机上
执行程序:
---
- name: configure web serivce #创建web任务
hosts: webservers #任务所属组
tasks: #具体的执行任务
- name: install web app
yum:
name: "{{item}}" #设置变量for循环
state: present
with_items: #yum装php
- php-mysql
- name: config web service #设置开机启动
service:
name: started
enabled: true
检测:
ansible-playbook --syntax-check lamp.yml
ansible-playbook lamp.yml
Ansible的python实现
Ansible-playbook的python实现方式
from collections import namedtuple from ansible.parsing.dataloader import DataLoader from ansible.vars.manager import VariableManager from ansible.inventory.manager import InventoryManager from ansible.executor.playbook_executor import PlaybookExecutor Options = namedtuple( 'Options', [ 'connection', 'remote_user', 'ask_sudo_pass', 'verbosity', 'ask_pass', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'listhosts', 'listtasks', 'listtags', 'syntax', 'sudo_user', 'sudo', 'diff' ] ) ops = Options( connection='smart', remote_user=None, ask_pass=None, sudo_user=None, forks=5, sudo=None, ask_sudo_pass=False, verbosity=5, module_path=None, become=None, become_method=None, become_user=None, check=False, diff=False, listhosts=None, listtags=None, listtasks=None, syntax=None ) loader = DataLoader() passwords = dict() inventory = InventoryManager( loader=loader, sources=['myansi/hosts'] ) variable_manager = VariableManager( loader=loader, inventory=inventory ) def run_pb(pb_path): playbook = PlaybookExecutor( playbooks=pb_path, inventory=inventory, variable_manager=variable_manager, loader=loader, options=ops, passwords=passwords ) result = playbook.run() return result if __name__ == '__main__': run_pb(pb_path=['myansi/lamp.yml'])
自制ansible.copy模块:
#自制一个ansible.copy一样的模块
#!/usr/bin/env python import shutil from ansible.module_utils.basic import AnsibleModule #导入自定义的ansible制作模块 def main(): mokuai = AnsibleModule( #编译模块 argument_spec=dict( yuan=dict(required=True, type='str'), mudi=dict(required=True, type='str') ) ) #将上面定义的内容用shutil从源地址拷贝到目标地址 shutil.copy(mokuai.params['yuan'], mokuai.params['mudi']) mokuai.exit_json(change=True) #输出为json格式的 if __name__ == '__main__': main()
验证:ansible dbservers -m rcopy -a "yuan=/etc/hosts mudi=/opt"
后记:参考网址
--查找ansible API ,上面的内容绝大部分都是从这些地方去改模板,一点点调试
使用python写的脚本运行ansible大大简化了操作的繁杂程度,缩短了批量管理时写代码的时间,只需要修改固定的那几个地方,就可以完成了。
有些时候不需要重复的造轮子,但我们需要花更多的时间在研究自动化管理技术上,真正实现高效,可靠管理。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~