zoukankan      html  css  js  c++  java
  • python-ansible

    http://sofar.blog.51cto.com/353572/1579894

    http://www.aikaiyuan.com/6299.html

    http://docs.ansible.com/modules_by_category.html

    http://www.ansible.cn/docs/

    http://zh.wikipedia.org/wiki/Cowsay

    http://www.poluoluo.com/server/201409/303039.html

    http://www.kiratechblog.com/?p=476

    自从CFEngine 在1993年被Mark Burgess开发出来之后,配置管理工具就层出不穷了。像puppet 和chef,系统管理员可以有很多选择。Ansible 是一个新的配置管理工具,与其他工具不同的是,其他管理工具注重的是完整性和可配置性,而Ansible注重的是简单性和易用性。

    官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。这个工具的目标有这么几项:让我们自动化部署APP;自动化管理配置项;自动化的持续交付;自动化的(AWS)云服务管理。
    那么fabric和ansible有什么差别呢?简单来说fabric像是一个工具箱,提供了很多好用的工具,用来在Remote执行命令,而Ansible则是提供了一套简单的流程,你要按照它的流程来做,就能轻松完成任务。这就像是库和框架的关系一样。
    当然,它们之间也是有共同点的——都是基于 paramiko 开发的。这个paramiko是什么呢?它是一个纯Python实现的ssh协议库。因此fabric和ansible还有一个共同点就是不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。

    ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
    (1)、连接插件connection plugins:负责和被监控端实现通信;
    (2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
    (3)、各种模块核心模块、command模块、自定义模块;
    (4)、借助于插件完成记录日志邮件等功能;
    (5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

    ansible是一个python package,是个完全的unpack and play软件,对客户端唯一的要求是有ssh有python,并且装了python-simplejson包,部署上简单到发指。

    ansible.cfg。ansible执行的时候会按照以下顺序查找配置项:
    * ANSIBLE_CONFIG (环境变量)
    * ansible.cfg (当前目录下)
    * .ansible.cfg (用户家目录下)
    * /etc/ansible/ansible.cfg

    在ansible中还有一个Module(模块)的概念,这个模块可以理解为一个库,所有的命令都需要通过模块来执行
    这是一条ad-hoc命令——临时执行命令,ad-hoc是ansible里的一个概念, 在上面命令中就是 -a
    ad hoc——临时的,在ansible中是指需要快速执行,并且不需要保存的命令。说白了就是执行简单的命令——一条命令。对于复杂的命令后面会说playbook。
    上面的ad hoc是指执行一条临时的不需要保存的命令,那么复杂的命令怎么执行呢?因此也就有了playbook这个命令: ansible-playbook 。

    playbook的组成:playbook是由一个或多个“play”组成的列表,可以让它们联同起来按事先编排的机制执行;所谓task无非是调用ansible的一个module,而在模块参数中可以使用变量;模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致;
    执行模型:task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在顺序运行某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在修改playbook后重新执行一次即可;
    task组成:每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出;
    notify指定handler的执行机制:“notify”这个action可用于在每个play的最后被触发,在notify中列出的操作称为handler,仅在所有的变化发生完成后一次性地执行指定操作。

    默认playbook是进行客户端fact搜集,一般如果你配置里没有使用fact的话,可以关闭这样就能减少运行时间

    Intro to Playbooks
    Introduction To Ad-Hoc Commands
    ad hoc     adj 特别的,临时

    [root@084-monitor bin]# cat /var/www/html/scripts/newmonitor/aa.yml
    ---
    - hosts: 192.168.2.225
      remote_user: root
      gather_facts: False
      tasks:
      - name: pong
        ping:
      - name: free
        command : free

    ---
    - hosts: web
      remote_user: root
      tasks:
      - name: ping host
        ping:
      - name: write the apache config file
        template: src=/srv/httpd.j2 dest=/etc/httpd.conf
        notify:
        - restart apache
      - name: ensure apache is running
        service: name=httpd state=started
      handlers:
        - name: restart apache
          service: name=httpd state=restarted

    可以用下面的time测试加与不加gather_facts的效果,
    [root@084-monitor ~]# time ansible-playbook shell.yml

    从本地到远程是copy模块
    从远程到本地是fetch模块
    [root@084-monitor ~]# ansible 192.168.2.222 -m fetch -a "src=/usr/local/src/jdk1.6.tar.gz dest=/root/"
    192.168.2.222 | success >> {
        "changed": true,
        "dest": "/root/192.168.2.222/usr/local/src/jdk1.6.tar.gz",
        "md5sum": "321b6121ff8d59f802dd64cef2452d14",
        "remote_md5sum": "321b6121ff8d59f802dd64cef2452d14"
    }

    [root@084-monitor ~]# ansible web -m shell -a "ss -ln|grep 80"

    如果你有多台服务器的话,想并发运行,可以使用-f参数,默认是并发5
    sudo esay_install ansible
    # 或者
    sudo pip install ansible

    -m 模块
    shell,        默认是此模块,会处理一些变量,管道,重定向
    command,    只能执行单个命令

    Python 2.6 或更高版本
    Paramiko(Python的SSH模块)
    PyYAML(Python的YAML解析器)
    Jinja2(Python的模板引擎)

    更多模块可以参考:
    #ansible-doc –l

    受控节点如果是Python 2.4 或 Python 2.5 ,则需额外安装 Simplejson 模块。到Python的2.6或以上版本,就则内置了 Simplejson模块,不需要额外安装任何其它依赖。值得欣慰的是,目前主流的服务器上内置的Python版本绝多数都是 Python 2.6 以上版本。

    各自不同的实现
    java yaml
    python yaml
    ruby yaml
    Ruby和YAML的联系,甚至比Java与XML的联系还要紧密。Ruby把YAML用到了和数据相关的方方面面。配置文件的约定格式是YAML。同时YAML还是Ruby的文本序列化格式,就像XML是SDO的文本序列化格式一样。
    不夸张的说,YAML是Ruby中流动的血液。
    由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用。列一下现有的语言实现:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript。除了Java,其他都是脚本语言.
    YAML比较适合做序列化。因为它是宿主语言数据类型直转的。
    YAML做配置文件也不错。比如Ruby on Rails的配置就选用的YAML。对ROR而言,这很自然,也很省事.
    由于兼容性问题,不同语言间的数据流转建议现在不要用YAML.

    We use YAML because it is easier for humans to read and write than other common data formats like XML or JSON. Further, there are libraries available in most programming languages for working with YAML.

    默认情况下Ansible会读取 /etc/ansible 文件里的主机列表,内容为ini格式的
    ini格式
    xml格式
    json格式

    ini文件(Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。
    为什么要用INI文件?如果我们程序没有任何配置文件时,这样的程序对外是全封闭的,一旦程序需要修改一些参数,必须要修改程序代码本身并重新编译,这样很不好,所以要用配置文件,让程序出厂后还能根据需要进行必要的配置;配置文件有很多如INI配置文件,XML配置文件,还有就是可以使用系统注册表等。
    本文主要是为读者在实现读写INI配置文件模块之前,提供有关INI文件的格式信息。
    “.INI ”就是英文 “initialization”的头三个字母的缩写;当然INI file的后缀名也不一定是".ini"也可以是".cfg",".conf ”或者是".txt"。
    INI文件的格式很简单,最基本的三个要素是:parameters,sections和comments。
    INI所包含的最基本的“元素”就是parameter;每一个parameter都有一个name和一个value,name和value是由等号“=”隔开。name在等号的左边。

    yaml在python上的具体实现:PyYaml
    YAML被很多人认为是可以超越xml和json的文件格式。对比xml,除了拥有xml的众多优点外,它足够简单,易于使用。而对于json,YAML可以写成规范化的配置文件(这我认为是高于json很多的优点,用json写配置文件会让人发疯)。

    任何转义失效的地方都可能发生注入。幸运的是,许多框架(至少有Pyramid和Flask)使用了markupsafe库,它能智能地帮助避免这个问题。
    markupsafe提供一个单一的类, Markup ,继承自 unicode . Markup(u'Hello!') ,会产生一个行为上相当像字符串的对象。类方法 Markup.escape 工作方式相同,但会转义经过包裹的字符串中的任意HTML字符。

    Jinja2是基于python的模板引擎,功能比较类似于于PHP的smarty,J2ee的Freemarker和velocity。 它能完全支持unicode,并具有集成的沙箱执行环境,应用广泛。jinja2使用BSD授权。
    果然,还是需要用到模板,不能总是直接在Response中写上长串的html代码。
    python中的模板引擎主要有mako, genshi, jinjia等。
        mako 主要特点在于模板里面 可以比较方便的嵌入Python代码,而且执行效率一流;
        genshi 的特点在于基于 xml, 非常简单易懂的模板语法,对于热爱xhtml的朋友来说是很好的选择,同时也可以嵌入Python 代码,实现一些复杂的展现逻辑;
        jinja 和 genshi 一样拥有很简单的模板语法,只是不 依赖于 xml 的格式,同样很适合设计人员直接进行模板的制作,同时也可以嵌入Python 代码实现一些复杂的展现逻辑。

    Python 中使用SSH需要用到OpenSSH,而OpenSSH依赖于paramiko模块,而paramiko模块又依赖于pycrypto模块,因此要在 Python中使用SSH,则需要先安装模块顺序是:pycrypto -> ecdsa -> paramiko
    看很多博客没有提到这个库,但我执行paramiko时,提示找不到ecdsa模块。

    在python中,我理解的simplejson模块就是主要用于将python数据类型转换为json类型。
    控制服务器(Master)需要安装Python2.6/7,windows上无法使用ansible。被管理的服务器(Managed Node)需要安装Python2.4以上的版本,如果低于2.5,需要安装python-simplejson。
    yum -y install python-simplejson

    对于连接多台服务器,进行复杂的连接操作特别有帮助。批量操作机器
    安装paramiko有两个先决条件,python和另外一个名为PyCrypto的模块。
    通常安装标准的python模块,只需要在模块的根目录下运行:
    python setup.py build
    python setup.py install

    ansible Site01 -u root -k -m ping
    回车后会提示你输入root密码,然后会打印如下结果:
    如果你使用密钥方式登录SSH,去掉 -k 参数即可。可以为Ansible设置一个特定的用户,所有操作均以此用户来执行。甚至可以为每个“受控节点”设置各自不同的用户。
    
    [root@084-monitor ~]# ansible test -m file -a 'path=/tmp/ksops state=directory mode=0755 owner=nobody'
    192.168.2.250 | success >> {
        "changed": true,
        "gid": 0,
        "group": "root",
        "mode": "0755",
        "owner": "nobody",
        "path": "/tmp/ksops",
        "size": 4096,
        "state": "directory",
        "uid": 99
    }
    
    [root@084-monitor ~]# ansible test -m copy -a 'src=/root/ssh-conn dest=/tmp/ mode=0755 owner=root'
    192.168.2.250 | success >> {
        "changed": true,
        "dest": "/tmp/ssh-conn",
        "gid": 0,
        "group": "root",
        "md5sum": "dbdff0f3ef913dd399cd52608c27cdf0",
        "mode": "0755",
        "owner": "root",
        "size": 1148,
        "src": "/root/.ansible/tmp/ansible-tmp-1421140306.4-262938535704591/source",
        "state": "file",
        "uid": 0
    }


     

    先做免密码登录,有几台机器就scp几次公钥
    ssh-keygen -t rsa -P ''
    scp id_rsa.pub 192.168.2.84:/root/.ssh/authorized_keys
    
    [root@084-monitor ansible]# bash ansib
    [root@084-monitor ansible]# cat ansib
    wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz
    tar zxvf setuptools-7.0.tar.gz
    cd setuptools-7.0
    python setup.py install
    cd ../
    
    
    wget --no-check-certificate https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz
    tar zxvf pycrypto-2.6.1.tar.gz
    cd pycrypto-2.6.1
    yum install python-devel
    python setup.py install
    cd ../
    
    
    wget --no-check-certificate http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
    tar zxvf yaml-0.1.5.tar.gz
    cd yaml-0.1.5
    ./configure --prefix=/usr/local
    make --jobs=`cat /proc/cpuinfo|grep processor|wc -l`
    cd ../
    
    
    wget --no-check-certificate https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz
    tar zxvf PyYAML-3.11.tar.gz
    cd PyYAML-3.11
    python setup.py install
    cd ../
    
    
    wget --no-check-certificate https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz
    tar zxvf MarkupSafe-0.9.3.tar.gz
    cd MarkupSafe-0.9.3
    python setup.py install
    cd ../
    
    
    wget --no-check-certificate https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz
    tar zxvf Jinja2-2.7.3.tar.gz
    cd Jinja2-2.7.3
    python setup.py install
    cd ../
    
    
    wget --no-check-certificate https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz
    tar zxvf ecdsa-0.11.tar.gz
    cd ecdsa-0.11
    python setup.py install
    cd ../
    
    
    wget --no-check-certificate https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz
    tar zxvf paramiko-1.15.1.tar.gz
    cd paramiko-1.15.1
    python setup.py install
    cd ../
    
    
    wget --no-check-certificate https://pypi.python.org/packages/source/s/simplejson/simplejson-3.6.5.tar.gz
    tar zxvf simplejson-3.6.5.tar.gz
    cd simplejson-3.6.5
    python setup.py install
    cd ../
    
    
    wget --no-check-certificate  https://github.com/ansible/ansible/archive/v1.7.2.tar.gz
    tar zxvf v1.7.2.tar.gz
    cd ansible-1.7.2/
    python setup.py install
    cd ../
    
    mkdir -p /etc/ansible
    
    
    cat <<EOF > /etc/ansible/ansible.cfg
    [defaults]
    hostfile=/etc/ansible/hosts
    EOF
    
    cat <<EOF > /etc/ansible/hosts
    [aa]
    192.168.2.220
    192.168.2.221
    192.168.2.222
    192.168.2.223
    192.168.2.224
    EOF
    [root@084-monitor ansible]# ansible aa -m command -a 'free'
    192.168.2.224 | success | rc=0 >>
                 total       used       free     shared    buffers     cached
    Mem:       1020132     953112      67020          0     134156     541024
    -/+ buffers/cache:     277932     742200
    Swap:      1675256       6260    1668996
    
    192.168.2.223 | success | rc=0 >>
                 total       used       free     shared    buffers     cached
    Mem:       7999632    7717876     281756          0     219012    6540924
    -/+ buffers/cache:     957940    7041692
    Swap:      3145720      32772    3112948
    
    192.168.2.220 | success | rc=0 >>
                 total       used       free     shared    buffers     cached
    Mem:       3923760    3818168     105592          0     239264    2671504
    -/+ buffers/cache:     907400    3016360
    Swap:      3145720     132888    3012832
    
    192.168.2.221 | success | rc=0 >>
                 total       used       free     shared    buffers     cached
    Mem:       1019820     723684     296136          0     138636     104360
    -/+ buffers/cache:     480688     539132
    Swap:      1675256        736    1674520
    
    192.168.2.222 | success | rc=0 >>
                 total       used       free     shared    buffers     cached
    Mem:       1020296     951344      68952          0      69916     218880
    -/+ buffers/cache:     662548     357748
    Swap:      1675256     161188    1514068

    批量部署  在有很多服务器,并且需要相同环境时,批量部署就很简单与方便了。不用专门每次都去下载wget,直接使用自带的curl就可以了

    [root@84-monitor ~]# vi /etc/ansible/hosts
    [root@84-monitor ~]# ansible mfs -m shell -a "curl 'http://ppa.moosefs.com/RPM-GPG-KEY-MooseFS' > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS"
    192.168.2.233 | success | rc=0 >>
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    105  1796  105  1796    0     0   1677      0  0:00:01  0:00:01 --:--:--  7741
    
    192.168.2.232 | success | rc=0 >>
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    105  1796  105  1796    0     0    905      0  0:00:01  0:00:01 --:--:--  7610
    
    [root@84-monitor ~]# ansible mfs -m shell -a "curl 'http://ppa.moosefs.com/MooseFS-stable-rhsysv.repo' > /etc/yum.repos.d/MooseFS.repo"
    192.168.2.232 | success | rc=0 >>
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    169   169  169   169    0     0    254      0 --:--:-- --:--:-- --:--:--   725
    
    192.168.2.233 | success | rc=0 >>
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    169   169  169   169    0     0    253      0 --:--:-- --:--:-- --:--:--   725

    [root@84-monitor ~]# ansible wo -m shell -a "sed -i '/ntpdate/d' /var/spool/cron/root"

    [root@84-monitor ~]# ansible wo -m shell -a "echo '0 20 * * * /usr/sbin/ntpdate 192.168.2.1 && /sbin/clock -w > /dev/null 2>&1' >>/var/spool/cron/root"

  • 相关阅读:
    【产品干货】经典营销模型的产品化介绍
    阿里云力夺FewCLUE榜首!知识融入预训练+小样本学习的实战解析
    云上资源编排的思与悟
    储留香:一个智能运维系统就是一个中枢神经系统,我说的!
    企业网管软件之SOLARWINDS实战-制作拓扑图
    企业网管软件之SOLARWINDS实战-基于浏览器的网络流量监控
    企业网管软件实战之看视频学装Cisco Works 2000
    轻松学习Linux之Shell预定义变量
    oracle的监听日志太大,正确的删除步骤
    MVC 使用HandleErrorAttribute统一处理异常
  • 原文地址:https://www.cnblogs.com/createyuan/p/4218838.html
Copyright © 2011-2022 走看看