Python自动化运维Ansible应用

857 阅读16分钟

随着技术的进步、业务需求的快速增长,一个运维人员通常要管理上百、上千台服务器,运维工作也变的重复、繁杂。把运维工作自动化,能够把运维人员从服务器的管理中解放出来,让运维工作变得简单、快速、准确

1. 介绍及基础

1.1 需要掌握以下知识

  • 掌握基本的Liunx命令
  • 掌握Python基础语言
  • 了解运维基础知识
  • python2.7

1.2 运维分类

1.2.1 传统运维
  • 命令行

  • 批量脚本

  • 特点

    • 资源少
    • 业务结构简单
    • 运维工作简单
  • 缺点

    • 效率低
    • 无法夸平台
    • 资源分散
    • 无标准
1.2.2 自动化运维
  • 特点
    • 把运维日常需要登录机器的操作,完全Web化,以后只需要点-下鼠标就搞定(不正确)
    • 运维自动化是一组将静态的设备结构转化为根据IT服务 需求动态弹性响应的策略,目的就是实现IT运维的质量,降低成本
  • 优点
    • 高效率
    • 平台化
    • 标准化
    • 流程化
  • 缺点
    • 数据无法共享

    • 无法主动发现问题

    • 部署成本高

    • 标准不统一

1.2.3 云运维
  • 资源数据共享

  • 主动发现问题

  • 统一标准

  • 成本低

1.3 自动化运维工具

  • 部署类: jenkins
  • 环境类: ansible
  • 监控类: ngios

1.4 运维自动化设计思想

  • 管理体系化
  • 工作流程化
  • 人员专业化
  • 任务自动化

1.5 运维自动化一任务自动化

  • 环境定义自动化
  • 部署自动化
  • 监控自动化

1.6 自动化运维关心的问题

  • 自动化
  • 易实现
  • 跨平台
  • 轻量级

1.7 运维人员的技能

  • 编程能力偏弱
  • 熟悉运维
  • 算法能力偏弱

1.8 选择python语言原因

  • 《python简明教程》半天可学完
  • 丰富的库,如asible
  • 大量python编写的运维工具,如salt
  • 跨平台,安装python虚拟机即可运行

1.9 Python os模块介绍

  • os.system
    • 功能:执行命令
    • 返回:命令的返回值
    • 补充:命令的输出会输出到标准输出
  • raw_input()
    • 功能:暂停程序运行,等待用户输入
    • 返回:用户输入的内容

1.10 自动化运维脚本编写案例

  • 编写一个自动安装python的脚本

    1.下载只能版本Python源码

    2.安装Python需要的依赖库

    3.编译安装Python

# 判断root
# 等待用户输入Python版本
# 执行shell命令下载源码包
# 安装依赖开发包
# 编译安装Python
# --------------------正式代码如下----------------



#coding=utf-8
import os
import sys
if os.getuid() == 0:
    pass
else:
    print '当前用户不是root用户,请以root用户执行脚本'
    sys.exit(1)
 
version = raw_input('请输入你想安装的python版本(2.7/3.6)')
if version == '2.7':
    url = 'https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz'
elif version == '3.6':
    url = 'https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz'
else:
    print '您输入的版本号有误,请输入输入2.7或3.6'
    sys.exit(1)
 
cmd = 'wget '+url
res = os.system(cmd)
if res != 0:
    print '下载源码包失败,请检查网络'
    sys.exit(1)
 
if version == '2.7':
    package_name = 'Python-2.7.12'
 
else:
    package_name = 'Python-3.6.8'
cmd = 'tar xf ' + package_name+ '.tgz'
res = os.system(cmd)
if res != 0:
    os.system('rm '+package_name+'.tgz')
    print '解压源码包失败,请重新运行这个脚本下载源码'
    sys.exit(1)
 
cmd = 'cd '+ package_name+ ' && ./configure --prefix=/usr/local/python && make && make install'
res = os.system(cmd)
if res !=0:
    print '编译python源码失败,请检查是否缺少依赖库'
    sys.exit(1)

2. Ansible教程

2.1 Ansible介绍

  • Ansible是一个自动化管理It资源的工具
    • 自动化
    • 管理
    • It资源
  • 功能
    • 系统环境配置(安装脚本、配置环境变量...)
    • 安装软件 (安装软件)
    • 持续集成(自动化部署工作)
    • 热回滚(执行脚本,恢复原始状态)
  • 优点
    • 基于ssh无客户端
    • 推送式消息
    • 丰富的第三工具(一万多个)列如下载Nginx,只需要下载个playbook,制定机器,部署即可
    • 基于YAML(语法格式)的Playbook(简单理解就是批量部署脚本)
    • 商业化支持
  • 缺点
    • 效率低、易挂起
    • 并发性能差
  • 与其他软件对比
对比项目PuppetChefSaltAnsible
客户端
通信方式scoketsshRabbitmqssh
Web页面
效率一般一般
易用
实现语言rubypythonpythonpython
API

Ansible主要是社区用户数最高,使用人数最广泛的

2.2 Ansible安装

  • 环境准备
    • python
    • Setuptools
    • pip
  • Ansible pip安装 目前Liunx 自带python2.7所以此处就不在讲解2.7安装方式,有需要的自行百度
    安装依赖包
    
    yum -y install libffi libffi-devel
    yum -y install gcc gcc-c++ python-devel python-simplejson
    
    
    安装Ansible需要的python模块
    
    pip2.7 install paramiko PyYAML Jinja2 httplib2 six
    
    升级pip2.7的setuptools版本
    pip2.7 install --upgrade setuptools
    pip2.7 install --upgrade pip
    
    安装Ansible
    pip2.7 install ansible
    
  • 安装Ansible: pip install ansible
    rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
    yum install -y gcc
    yum install python-paramiko -y
    yum install PyYAML -y
    yum install python-jinja2-26 -y
    yum install python-httplib2 -y
    yum install -y git
    git clone git://github.com/ansible/ansible.git
    source ./ansible/hacking/env-setup
    
  • 系统源安装
    Ansible系统源安装
    Centos
    yum install ansible
    
    Ubuntu
    apt-get install software-properties-common
    apt-add-repository ppa:ansible/ansible
    apt-get update
    apt-get install ansible
    

2.3 Ansible运行方式

  • Ansible配置文件路径
    export ANSIBLE_CONFIG
    ./ansible.cfg
    ~/.ansible.cfg
    /etc/ansible/ansible.cfg
    
  • Ansible配置文件获取
    /etc/ansible目录下  # 不设置上边的路径默认启动这个
    
    https://raw.github.com/ansible/ansible/devel/examp
    les/ansible.cfg # 可通过网址下载配置文件(放到其中一个目录即可)
    

2.4 Ansible配置项

  • defaults 默认配置项
  • privilege_escalation 执行命令的用户权限设置
  • paramiko_connection paramika 插件设置,Liunx一般都会启动该插件,高效
  • ssh_connection ssh连接设置
  • accelerate 防火墙
  • selinux & colors 输出文本日志颜色
2.4.1 配置详解
  • ask_pass :可以控制,Ansible剧本playbook是否会自动默认弹出弹出密码

  • ask_sudo_pass:用户使用的系统平台开启了sudo密码的话,应该开绿这一参数(客户机使用root用户执行)

  • gather_subset 设置收集的日志内容

    • all
    • network
    • hardware
    • virtual
    • facter
    • ohai
  • 客户机的设置

    • remote_port 登录端口
    • remote_tmp 临时目录
    • remote_user 登陆的用户
  • sudo 命令相关设置

    • sudo_exe sudo命令路径

    • sudo_flags sudo参数

    • sudo_user 能够使用sudo的user

  • 开发者中心的插件相关功能

    开发者可以开发相应的插件来完成自己的功能

    • action_plugins 激活事件
    • callback _plugins 回调
    • connection_plugins 连接
    • filter_plugins 过滤器
    • lookup_plugins 加载路径
    • vars_plugins 任何地方加载
  • forks

    • 最大开辟的进程数,这个数不易过大,过大性能耗费高不易过小,过小的话,并发性能低
    • 一般的设置方法是cpu核数*2
  • module_name

    • 这个是/usr/bin/ansible的默认模块名(-m),
    • 默认'command'模块,
    • command模块不支持shell变量、管道、配额,如果需要把参数改为'shell'
  • vault_password_file (自动填写密码)

    • 这个文件也可以称为一个脚本的形式
    • 如果你使用脚本而不是单纯文件的话,请确保它可以执行并且密码可以在标准输出上打印出来.如果你的脚本需要提示请求数据,请求 将会发到标准错误输出中.
    • pattern
    • 如果没有提供"hosts" 节点,这是playbook要通信的默 认主机组.默认值是对所有主机通信
    • 安全建议设置个选项,指定机器
  • inventory & library

    • 分别为存放可通信主机的目录和Ansible默认搜寻模块路径
    • 不建议修改
  • 配置 (1)[defaults]

[defaults]

# inventory = /etc/ansible/hosts        # 定义Inventory  
# library = /usr/share/my_modules/      # 自定义lib库存放目录  
# remote_tmp = $HOME/.ansible/tmp       # 临时文件远程主机存放目录  
# local_tmp = $HOME/.ansible/tmp        # 临时文件本地存放目录  
# forks = 5                  # 默认开启的并发数  
# poll_interval = 15         # 默认轮询时间间隔  
# sudo_user  = root          # 默认sudo用户  
# ask_sudo_pass = True       # 是否需要sudo密码  
# ask_pass  = True           # 是否需要密码  
# roles_path = /etc/ansible/roles   # 默认下载的Roles存放的目录  
# host_key_checking = False         # 首次连接是否需要检查key认证,建议设为False  
# timeout = 10               # 默认超时时间  
# timeout = 10               # 如没有指定用户,默认使用的远程连接用户  
# log_path = /var/log/ansible.log   # 执行日志存放目录  
# module_name = command             # 默认执行的模块  
# action_plugins = /usr/share/ansible/plugins/action     # action插件的存放目录  
# callback_plugins = /usr/share/ansible/plugins/callback # callback插件的存放目录  
# connection_plugins = /usr/share/ansible/plugins/connection    # connection插件的存放目录  
# lookup_plugins = /usr/share/ansible/plugins/lookup     # lookup插件的存放目录  
# vars_plugins = /usr/share/ansible/plugins/vars         # vars插件的存放目录  
# filter_plugins = /usr/share/ansible/plugins/filter     # filter插件的存放目录  
# test_plugins = /usr/share/ansible/plugins/test         # test插件的存放目录  
# strategy_plugins = /usr/share/ansible/plugins/strategy # strategy插件的存放目录  
# fact_caching = memory                      # getfact缓存的主机信息存放方式  
# retry_files_enabled = False 
# retry_files_save_path = ~/.ansible-retry   # 错误重启文件存放目录  

上述是日常可能用到的配置,这些多数保持默认即可。

(2)[privilege_escalation] 出于安全角度考虑,部分公司不希望直接以root的高级管理员权限直接部署应用,往往会开放普通用户权限并给予sudo的权限,该部分配置主要针对sudo用户提权的配置。

[privilege_escalation]  
# become=True          # 是否sudo  
# become_method=sudo   # sudo方式  
# become_user=root     # sudo后变为root用户  
# become_ask_pass=False # sudo后是否验证密码 

(3)[paramiko_connection] 定义paramiko_connection配置,该部分功能不常用,了解即可。

[paramiko_connection]     # 该配置不常用到  
# record_host_keys=False  # 不记录新主机的key以提升效率  
# pty=False               # 禁用sudo功能 

(4)[ssh_connection] Ansible默认使用SSH协议连接对端主机,该部署是主要是SSH连接的一些配置,但配置项较少,多数默认即可。

[ssh_connection]  
# pipelining = False    # 管道加速功能,需配合requiretty使用方可生效 

(5)[accelerate] Ansible连接加速相关配置。因为有部分使用者不满意Ansible的执行速度,所以Ansible在连接和执行速度方面也在不断地进行优化,该配置项在提升Ansibile连接速度时会涉及,多数保持默认即可。


[accelerate]  
# accelerate_port = 5099            # 加速连接端口  
# accelerate_timeout = 30           # 命令执行超时时间,单位秒  
# accelerate_connect_timeout = 5.0  # 连接超时时间,单位秒  
# accelerate_daemon_timeout = 30        # 上一个活动连接的时间,单位分钟  
# accelerate_multi_key = yes 

(6)[selinux] 关于selinux的相关配置几乎不会涉及,保持默认配置即可。

[selinux]  
# libvirt_lxc_noseclabel = yes 
# libvirt_lxc_noseclabel = yes 

(7)[colors] Ansible对于输出结果的颜色也进行了详尽的定义且可配置,该选项对日常功能应用影响不大,几乎不用修改,保持默认即可。

[colors]  
# highlight = white 
# verbose = blue 
# warn = bright purple  
# error = red 
# debug = dark gray  
# deprecate = purple 
# skip = cyan 
# unreachable = red 
# ok = green 
# changed = yellow 
# diff_add = green 
# diff_remove = red 
# diff_lines = cyan 

上面尽可能全地介绍了运维工作中可能需要修改的配置选项,除了在关闭首次连接提示(host_key_checking=False)或提速调整([accelerate]区域块配置调整)时可能会稍做调整,其中绝大多数选项默认即可,Ansible安装好后无需任何改动即可使用。

3. Ansible使用

3.1 入门

  • 添加一台机器

    首先确保两台机器能够ping通,并且能够知道客户机的IP地址

    1. 编辑/etc/ansible/hosts
    mkdir /etc/ansible
    sudo touch /etc/ansible/hosts
    vim /etc/ansible/hosts
    
    

    2. 添加本机的public SSH key到目标机器的authorized_keys

    [root@izj6c25p95hhdir03i3l50z ~]# ssh-keygen   
    Generating public/private rsa key pair.  # 回车
    Enter file in which to save the key (/root/.ssh/id_rsa): # 回车
    /root/.ssh/id_rsa already exists.
    Overwrite (y/n)?  # 回车
    [root@izj6c25p95hhdir03i3l50z ~]# 
    [root@izj6c25p95hhdir03i3l50z ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@124.70.134.3 # 后边改成目标IP
    [root@izj6c25p95hhdir03i3l50z ~]# cat ~/.ssh/authorized_keys
    
    1. 添加本机的私钥到Ansible

    2. 运行ansible all -m ping测试是否添加成功

    报错提示
    
    /usr/lib/python2.7/site-packages/requests/__init__.py:80: RequestsDependencyWarning: urllib3 (1.21.1) or chardet (2.2.1) doesn't match a supported version!
    
    RequestsDependencyWarning)
    
    原因:
    
    python库中urllib3 (1.21.1) or chardet (2.2.1) 的版本不兼容
    
    
    
    解决方法:
    
    pip2.7 uninstall urllib3
    
    pip2.7 uninstall  chardet
    
    pip2.7 install requests
    

    成功显示

    [root@izj6c25p95hhdir03i3l50z ~]# ansible all -m ping
    124.70.134.3 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": false, 
        "ping": "pong"
    }
    

3.2 Ansible命令格式一ansible all -m ping

  • ansible命令主体:ansible/ansible-playbook
  • 被操作的目标机器的正则表达式:all
  • 指定要使用的模块:-m ping
  • 传入的参数:-a
[root@izj6c25p95hhdir03i3l50z ~]# ansible all -a 'ls'
124.70.134.3 | CHANGED | rc=0 >>
2020-06-11~09-33-26_landwar_BACKUP.tar.gz  # 客户机的文件
2020-06-11~09-36-47_landwar_BACKUP.tar.gz  # 客户机的文件
  • 执行ping模块流程
    1. 唤起Ansbile
    2. 查询hosts,获取指定的目标机器
    3. 调用指定模块
    4. 传入hosts参数
    5. 返回执行结果

3.3 Ansible命令详解

  • -a指定传入模块的参数

  • -C -D两个一起使用,检查hosts规则文件的修改

  • -I 限制匹配规则的主机数

  • --list-hosts显示所有匹配规则的主机数

    [root@izj6c25p95hhdir03i3l50z ~]# ansible all -a 'ls' --list-host
      hosts (1):
        124.70.134.3
    
  • -m -M指定所使用的模块和模块的路径

  • --syntax-check检查语法

    [root@izj6c25p95hhdir03i3l50z ~]# ansible alll -a 'ls' --syntax-check
    [WARNING]: Could not match supplied host pattern, ignoring: alll
    [WARNING]: No hosts matched, nothing to do
    
  • -v显示详细的日志

    # 需要配置,这里没有配置选择默认配置
    [root@izj6c25p95hhdir03i3l50z ~]# ansible all -a 'ls' -v
    No config file found; using defaults
    124.70.134.3 | CHANGED | rc=0 >>
    landwar_demo_ais.zip
    navy_demo_ais.zip
    
    

3.4 使用Ansible Inventory(分组)

管理大量机器,不同机器不同功能,如何管理?

3.4.1 Inventory介绍
  • Ansible可同时操作属于一个组的多台主机
  • 组和主机之间的关系通过inventory文件配置
  • 默认的文件路径为/etc/ansible/hosts
3.4.2 定义分组
 one.example.com
 [webservers]
 two.example.com
 three.example.com
 
 方括号[]中是组名
 two.example.com和three.example.com归属于[webservers]组
 
 一个主机可以属于不同的组,比如一台服务器可以同时属于webserver组和vim组这时,指定webserver或者
 vim组,都可以操作这台主机
 
 
 [root@izj6c25p95hhdir03i3l50z ~]# ansible caichen -a 'ls'
 121.37.166.111 | CHANGED | rc=0 >>
 Python-3.7.0
 Python-3.7.0.tgz
 
 # 与上边相同
 [root@izj6c25p95hhdir03i3l50z ~]# ansible 124.70.134.3 -a 'ls'
 124.70.134.3 | CHANGED | rc=0 >>
 landwar_demo_ais.zip
 navy_demo_ais.zip

 ----------------------------------------------------------
 [root@izj6c25p95hhdir03i3l50z ~]# ansible all -a 'ls'
 121.37.166.111 | CHANGED | rc=0 >>
 Python-3.7.0
 Python-3.7.0.tgz
 124.70.134.3 | CHANGED | rc=0 >>
 landwar_demo_ais.zip
 navy_demo_ais.zip
 
  • 自定义连接端口

    假如连接的ssh不是22端口这时候我们该如何处理?

    • 修改配置文件改端口
    • hosts文件修改,指定端口号
    在编写hosts文件是,在域名或者ip后,加上冒号端口号,例如这样:
    192.168.1.1:5000
    one.example.com:6000
    
  • IP域名写起来太长?起个别名吧

    jumper ansible_ssh. port= 5555 ansible_ssh_ host=192.168.1.50
    
  • 不想以ROOT用户登录

    例如: jumper ansible_ssh_port=5555 ansible_ssh_host-192.168.1.50 ansible_ssh_user=papa
    
  • 机器太多,但是连续的,写起来好麻烦

    [vim] 域名或IP连续的机器
    
    vim[1:50].example.com # 1到50
    vim[a-f].example.com # a到f字母
    
  • Inventory参数选项

    ansible_ssh_host
    ansible_ssh_port
    ansible_ssh_user
    ansible_ssh_pass     # ssh 密码
    ansible_sudo_pass    # sudo 密码
    ansible_sudo_exe     # 指定sudo的路径
    ansible_connection  # 与主机的连接类型.比如:local,ssh或者paramiko(纯python实现ssh库).
    ansible_ssh_private_key_file # 指定私钥文件
    ansible_shell_type # 目标系统的shell类型.
    ansible_python_interpreter # 指定python版本
    
  • 分文件管理(解决组多了难以维护)

    # group_vars 组存放目录
    # group_vars 不分组的目标机器
    
    例如:    
    /etc/ansible/group_vars/vim
    /etc/ansible/group_vars/webservers
    /etc/ansible/host_vars/foosball
    vim文件中的内容大致这样:
    ntp_ server: acme.example.org
    database server: storage.example.org
    
    vim文件中的内容大致这样:
        ---
        ntp_server:acme.example.org
        database_server:storage.example.org
    这时候文件名就是vim、webservers组名
    
  • 分文件夹管理(解决分文件多了难以管理)

    例如:
    /etc/ansible/group_vars/vim/install
    /etc/ansible/group_vars/vim/init
    /etc/ansible/host_vars/foosball
    install|文件中的内容大致这样: .
        ---
        ntp_server:acme.example.org
        database_server:storage.example.org
        这时候文件夹名vim就是组名
    

3.5 Ansible--Patterns

  • Patterns介绍

    在Ansible中,Patterns是指我们通过类正则表达式的方式,决定与哪台主机进行交互,不完全支持正则

1.所有hosts机器: al或者星号(*)

例如:
ansible all -m ping

2.通过域名或者IP指定一台特定的机器

例如: 
ansible one.example.com -m ping
ansible 192.168.1.2 -m ping

3.指定一组连续机器

例如: 
ansible 192.168.1.*- m ping指定192.168.1/24段的所有

机器

4.指定一组不相关的机器

例如: ansible one.example.com:two.example.com -m ping
指定one two两台机器

5.组也支持Patterns

Webservers----指定WebserversWebservers:Nginx----指定WebserversNginx两个组

2.是也可以不是

webservers:!phoenix----指定在webserver组但不在phoenix组
webservers:&nginx----指定同时在webserver和nginx组   

问题: webservers:nginx:&vim:!lpython:!mysql

如.上的语句是什么意思? 温馨提示:匹配时从左到右一次匹配!

指定同时在webserver和nginx组,但不在 python、mysql中

3.6 Ansible--Ad-Hoc

  • Ad-Hoc介绍 临时运行命令

这其实是- -个概念性的名字,是相对于写Ansible playbook来说的. 类似于在命令行敲入shell命令和写shell scripts两者之间的关系)... 如果我们敲入些命令去比较快的完成一些事情,而不需要将这些执行 的命令特别保存下来,这样的命令就叫做ad-hoc命令

  • 执行Shell命令

    ansible atlanta -a "/sbin/reboot" -f 10

    • atlanta是一个组,这个组里面有很多服务器,
    • "/sbin/reboot"命令会在atlanta组下的所有机器上执行。
    • ssh-agent会fork出10个子进程(bash)以并行的方式执行 reboot命令.如前所说“每次重启10个”即是以这种方式实现。
  • 指定用户执行shell命令

    ansible atlanta -a "/usr/bin/foo" -u username
    使用sudo
    ansible atlanta -a "/usr/bin/foo" -u username --sudo [-
    -ask-sudo-pass]
    
  • 文件管理

    • 创建文件夹:
    # 通过file模块创建权限,所属用户、用户组
    ansible webservers -m file -a "dest=/path/to/c
    mode=755 owner=mdehaan group=mdehaan state=directory"
    
    • 拷贝文件:
    ansible atlanta -m copy -a "src=/etc/hosts
    dest= /tmp/hosts"
    
  • 软件包管理

    确认一个软件包已经安装,但不去升级它: 
    ansible webservers -m yum -a "name=acme state=present"
    
    确认一个软件包的安装版本: 
    ansible webservers -m yum -a "name=acme-1.5 state=present"
    
    确认-个软件包还没有安装: 
    ansible webservers -m yum -a “name=acme state=absent"
    
  • 其他模块

    git模块: git相关

    service模块:系统服务相关

    setup模块:系统环境相关

  • 如何执行一个耗时的任务

    ansible all -B 3600 -P 0 -a "/usr/bin/long_running_operation --
    do-stuff"
    
    -B 1800表示最多运行60分钟, -P 0表示不获取状态
    
    ansible all -B 1800 -P 60 -a "/usr/bin/long_running_operation
    --do-stuff"
    
    -B 1800表示最多运行30分钟, -P 60表示每隔一分钟获取一-次状态
    
    ansible web1.example.com -m async_status -a "jid=488359678239.2844"
    

3.7 Ansible--Playbook

  • 介绍
    • 简单来说,playbooks是-种简单的配置管理系统与多机器部署系统 的基础.与现有的其他系统有不同之处,且非常适合于复杂应用的部署.
    • Playbooks可用于声明配置,更强大的地方在于,在playbooks中可 以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特 别指定的步骤.并且可以同步或异步的发起任务.

3.8 Ansible--API

3.8.1 Ansible API的使用
  • API提供功能

    1. 调用Ansible的模块
    2. 开发动态的Inventory数据源
    3. 更好的控制playbook等功能的运行
  • 如何调用Ansible模块

    1.引入Ansible runner库

    2.初始化runner对象,传入相关参数

    3.运行runner对象的run函数

    示例代码
    import ansible.runner 
    
    runner = ansible.runner. Runner(
        module_name= "ping", # 指定模块名
        module_args="", # 传入参数
        pattern="web*", # 匹配机器以web开头
        forks=10 # 指定10个进程,并发控制
    )
    datastructure = runner.run()
    

运行不了,是否是ansible 2.0以后

  • 如何调用Ansible2.0 API

    1、定义-个结果对象

    2、初始化Ansible节 点对象

    3、初始化结果对象

    4、创建一个任务

    5、运行ansible节点

import json
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.vars import Vari abl eManager
from ansible.inventory import Inventory
from ansible.playbook.play import Play
from ansible.executor.task_queue_manager import TaskQueueManager 
from ansible. plugins. callback import CallbackBase


class ResultCallback(CallbackBase):

    def v2_runner on_ok(self, result, **kwargs ) :
        host = result.host
        print json.dumps({host.name: result_result}, indent=4)

未完待续~

编写自定义Ansible Module

如何开发Ansible Plugin