Ansible源码获取

Ansible Github:https://github.com/ansible

Ansible目录结构

  1. $ tree -L 2 ansible-2.0.0.0
  2. ansible-2.0.0.0
  3. |-- bin # 可执行程序存放目录
  4. | |-- ansible
  5. | |-- ansible-doc -> ansible
  6. | |-- ansible-galaxy -> ansible
  7. | |-- ansible-playbook -> ansible
  8. | |-- ansible-pull -> ansible
  9. | `-- ansible-vault -> ansible
  10. |-- CHANGELOG.md # 更新日志
  11. |-- contrib
  12. | |-- inventory
  13. | `-- README.md
  14. |-- COPYING
  15. |-- docs # 文档
  16. | `-- man
  17. |-- examples # 主配置文件及hosts文件
  18. | |-- ansible.cfg
  19. | `-- hosts
  20. |-- lib
  21. | |-- ansible
  22. | `-- ansible.egg-info
  23. |-- Makefile
  24. |-- MANIFEST.in
  25. |-- packaging
  26. | |-- arch
  27. | |-- debian
  28. | |-- gentoo
  29. | |-- macports
  30. | |-- port
  31. | `-- rpm
  32. |-- PKG-INFO
  33. |-- README.md
  34. |-- setup.cfg
  35. |-- setup.py
  36. `-- VERSION # 版本信息

setup.py解读

  1. #!/usr/bin/env python
  2.  
  3. import os
  4. import sys
  5.  
  6. sys.path.insert(0, os.path.abspath('lib')) # 将lib目录添加进环境变量 类似的方法sys.path.append() 两者区别:追加和插入第一个位置
  7. from ansible import __version__, __author__
  8. try:
  9. from setuptools import setup, find_packages
  10. except ImportError:
  11. print("Ansible now needs setuptools in order to build. Install it using"
  12. " your package manager (usually python-setuptools) or via pip (pip"
  13. " install setuptools).")
  14. sys.exit(1)
  15.  
  16. setup(name='ansible',
  17. version=__version__,
  18. description='Radically simple IT automation',
  19. author=__author__,
  20. author_email='support@ansible.com',
  21. url='http://ansible.com/',
  22. license='GPLv3',
  23. # Ansible will also make use of a system copy of python-six if installed but use a
  24. # Bundled copy if it's not.
  25. install_requires=['paramiko', 'jinja2', "PyYAML", 'setuptools', 'pycrypto >= 2.6'],
  26. package_dir={ '': 'lib' },
  27. packages=find_packages('lib'),
  28. package_data={
  29. '': ['module_utils/*.ps1', 'modules/core/windows/*.ps1', 'modules/extras/windows/*.ps1', 'galaxy/data/*'],
  30. },
  31. classifiers=[
  32. 'Development Status :: 5 - Production/Stable',
  33. 'Environment :: Console',
  34. 'Intended Audience :: Developers',
  35. 'Intended Audience :: Information Technology',
  36. 'Intended Audience :: System Administrators',
  37. 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)',
  38. 'Natural Language :: English',
  39. 'Operating System :: POSIX',
  40. 'Programming Language :: Python :: 2.6',
  41. 'Programming Language :: Python :: 2.7',
  42. 'Topic :: System :: Installation/Setup',
  43. 'Topic :: System :: Systems Administration',
  44. 'Topic :: Utilities',
  45. ],
  46. scripts=[
  47. 'bin/ansible',
  48. 'bin/ansible-playbook',
  49. 'bin/ansible-pull',
  50. 'bin/ansible-doc',
  51. 'bin/ansible-galaxy',
  52. 'bin/ansible-console',
  53. 'bin/ansible-vault',
  54. ],
  55. data_files=[],
  56. )

Python源码包中的setup.py功能

setup.py功能:setup.py是python的一个项目发布管理工具。我们常常安装别人的代码也是借助setup.py

假设你要分发一个叫hello的模块,文件名hello.py,那么setup.py内容如下

  1. #!/usr/bin/env python
  2. # coding: utf-8
  3.  
  4. from distutils.core import setup
  5.  
  6. setup(name='hello',
  7. version="1.0",
  8. py_modules=['hello'],
  9. )

然后,运行python setup.py sdist为模块创建一个源码包

  1. C:\Users\Administrator\PycharmProjects\untitled>python setup.py sdist
  2. running sdist
  3. running check
  4. warning: check: missing required meta-data: url
  5. warning: check: missing meta-data: either (author and author_email) or (maintainer and maintainer_email) must be supplied
  6. warning: sdist: manifest template 'MANIFEST.in' does not exist (using default file list)
  7. warning: sdist: standard file not found: should have one of README, README.txt
  8. writing manifest file 'MANIFEST'
  9. creating hello-1.0
  10. copying files to hello-1.0...
  11. copying hello.py -> hello-1.0
  12. copying setup.py -> hello-1.0
  13. creating 'dist\hello-1.0.zip' and adding 'hello-1.0' to it
  14. adding 'hello-1.0\hello.py'
  15. adding 'hello-1.0\PKG-INFO'
  16. adding 'hello-1.0\setup.py'
  17. removing 'hello-1.0' (and everything under it)

  在当前目录下,会创建dist目录,里面有个文件名为hello-1.0.zip,这个就是可以分发的包。使用者拿到这个包后,解压,到hello-1.0目录下执行:python setup.py install,那么,hello.py就会被拷贝到python类路径下,可以被导入使用。

  1. C:\Users\Administrator\PycharmProjects\untitled\dist\hello-1.0>python setup.py install
  2. running install
  3. running build
  4. running build_py
  5. creating build
  6. creating build\lib
  7. copying hello.py -> build\lib
  8. running install_lib
  9. copying build\lib\hello.py -> C:\Python27\Lib\site-packages
  10. byte-compiling C:\Python27\Lib\site-packages\hello.py to hello.pyc
  11. running install_egg_info
  12. Writing C:\Python27\Lib\site-packages\hello-1.0-py2.7.egg-info

  对于Windows,可以执行python setup.py bdist_wininst生成一个exe文件;若要生成RPM包,执行python setup.py bdist_rpm,但系统必须有rpm命令的支持。可以运行下面的命令查看所有格式的支持:

  1. C:\Users\Administrator\PycharmProjects\untitled\dist\hello-1.0>python setup.py bdist --help-formats
  2. List of available distribution formats:
  3. --formats=rpm RPM distribution
  4. --formats=gztar gzip'ed tar file
  5. --formats=bztar bzip2'ed tar file
  6. --formats=ztar compressed tar file
  7. --formats=tar tar file
  8. --formats=wininst Windows executable installer
  9. --formats=zip ZIP file
  10. --formats=msi Microsoft Installer

setup函数还有一些参数:
1、packages
告诉Distutils需要处理那些包(包含__init__.py的文件夹)
2、package_dir
告诉Distutils哪些目录下的文件被映射到哪个源码包。一个例子:package_dir = {'': 'lib'},表示“root package”中的模块都在lib目录中。
3、ext_modules
是一个包含Extension实例的列表,Extension的定义也有一些参数。
4、ext_package
定义extension的相对路径
5、install_requires
定义依赖哪些模块
6、provides
定义可以为哪些模块提供依赖
7、scripts
指定python源码文件,可以从命令行执行。在安装时指定--install-script
8、package_data
通常包含与包实现相关的一些数据文件或类似于readme的文件。如果没有提供模板,会被添加到MANIFEST文件中。
9、data_files
指定其他的一些文件(如配置文件)

  1. setup(...,
  2. data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
  3. ('config', ['cfg/data.cfg']),
  4. ('/etc/init.d', ['init-script'])]
  5. )

规定了哪些文件被安装到哪些目录中。如果目录名是相对路径,则是相对于sys.prefix或sys.exec_prefix的路径。如果没有提供模板,会被添加到MANIFEST文件中。
执行sdist命令时,默认会打包哪些东西呢?
    所有由py_modules或packages指定的源码文件
    所有由ext_modules或libraries指定的C源码文件
    由scripts指定的脚本文件
    类似于test/test*.py的文件
    README.txt或README,setup.py,setup.cfg
    所有package_data或data_files指定的文件
还有一种方式是写一个manifest template,名为MANIFEST.in,定义如何生成MANIFEST文件,内容就是需要包含在分发包中的文件。一个MANIFEST.in文件如下:

  1. include *.txt
  2. recursive-include examples *.txt *.py
  3. prune examples/sample?/build

distutils模块讲解:https://docs.python.org/2/distutils/

相关知识扩展

setup.cfg

  setup.cfg提供一种方式,可以让包的开发者提供命令的默认选项,同时为用户提供修改的机会。对setup.cfg的解析,是在setup.py之后,在命令行执行前。
setup.cfg文件的形式类似于

  1. [command]
  2. option=value
  3. ...

  其中,command是Distutils的命令参数,option是参数选项,可以通过python setup.py --help build_ext方式获取。需要注意的是,比如一个选项是--foo-bar,在setup.cfg中必须改成foo_bar的格式

符合Distutils2的setup.cfg有些不同。包含一些sections:
1、global
定义Distutils2的全局选项,可能包含commands,compilers,setup_hook(定义脚本,在setup.cfg被读取后执行,可以修改setup.cfg的配置)
2、metadata
3、files
    packages_root:根目录
    packages
    modules
    scripts
    extra_files
4、command sections

setuptools

  上面的setup.py和setup.cfg都是遵循python标准库中的Distutils,而setuptools工具针对Python官方的distutils做了很多针对性的功能增强,比如依赖检查,动态扩展等。

内容还有很多,后期用到再进行扩展

ansible源码解读的更多相关文章

  1. SDWebImage源码解读之SDWebImageDownloaderOperation

    第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...

  2. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

  3. SDWebImage源码解读 之 UIImage+GIF

    第二篇 前言 本篇是和GIF相关的一个UIImage的分类.主要提供了三个方法: + (UIImage *)sd_animatedGIFNamed:(NSString *)name ----- 根据名 ...

  4. SDWebImage源码解读 之 SDWebImageCompat

    第三篇 前言 本篇主要解读SDWebImage的配置文件.正如compat的定义,该配置文件主要是兼容Apple的其他设备.也许我们真实的开发平台只有一个,但考虑各个平台的兼容性,对于框架有着很重要的 ...

  5. SDWebImage源码解读_之SDWebImageDecoder

    第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...

  6. SDWebImage源码解读之SDWebImageCache(上)

    第五篇 前言 本篇主要讲解图片缓存类的知识,虽然只涉及了图片方面的缓存的设计,但思想同样适用于别的方面的设计.在架构上来说,缓存算是存储设计的一部分.我们把各种不同的存储内容按照功能进行切割后,图片缓 ...

  7. SDWebImage源码解读之SDWebImageCache(下)

    第六篇 前言 我们在SDWebImageCache(上)中了解了这个缓存类大概的功能是什么?那么接下来就要看看这些功能是如何实现的? 再次强调,不管是图片的缓存还是其他各种不同形式的缓存,在原理上都极 ...

  8. AFNetworking 3.0 源码解读 总结(干货)(下)

    承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...

  9. AFNetworking 3.0 源码解读 总结(干货)(上)

    养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...

随机推荐

  1. java自定义注解学习(一)_demo小练习

    自定义注解 现在大家开发过程中,经常会用到注解. 比如@Controller 等等,但是有时候也会碰到自定义注解,在开发中公司的记录日志就用到了自定义注解.身为渣渣猿还是有必要学习下自定义注解的. 这 ...

  2. Java之资源文件读取

    ClassLoaderWrapper.java package org.utils.resource; import java.io.InputStream; import java.net.URL; ...

  3. spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql

    spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql

  4. 洛谷SP16549 QTREE6 - Query on a tree VI(LCT)

    洛谷题目传送门 思路分析 题意就是要维护同色连通块大小.要用LCT维护子树大小就不说了,可以看看蒟蒻的LCT总结. 至于连通块如何维护,首先肯定可以想到一个很naive的做法:直接维护同色连通块,每次 ...

  5. Redis连接的客户端(connected_clients)数过高或者不减的问题解决方案

    最近的项目上使用ServiceStack.Redis上了redis缓存,其中遇到了很多问题.. 比如说 某一天发现redis做的缓存竟然失效了,然后查了下日志  报错max number of cli ...

  6. 关闭ubuntu dash 方法

    因为ubuntu默认的sh是连接到dash的,又因为dash跟bash的不兼容所以出错了.执行时可以把sh换成bash 文件名.sh来执行.成功.dash是什么东西,查了一下,应该也是一种shell, ...

  7. [应用篇]第二篇 JSP自带标签介绍

    JSP 有以下三类标签: 指令:JSP Directive 指令标签用于设置与整个 JSP 页面相关的属性,非常常用. 下面的三种标签是我们使用频率最高的 标签 jsp标签 描述 <%@ pag ...

  8. Hadoop源码阅读-HDFS-day1

    HDFS声明及构造函数 @InterfaceAudience.Private @InterfaceStability.Evolving public class Hdfs extends Abstra ...

  9. Spring Boot 源码分析 数据源 + Mybatis 配置

    公司今年开始使用 Spring Boot 开发,当然使用 Spring Boot 也是大势所趋,尤其是现在微服务的趋向,当然是选择基于Spring Boot 的 Spring Cloud.(所谓的 S ...

  10. [iOS]Xcode+GitHub远程代码托管(GIT, SVN)

    先来看看什么是代码远程托管: 其实就是将我们的代码上传到GitHub的服务器上, 供别人下载, 当然了也可以在团队开发的时候, 使用GitHub进行代码合并工作, 下面我们进入正题 (已经有远程仓库的 ...