zoukankan      html  css  js  c++  java
  • ansible部署

    安装机器redhat 6.8 自带python2.6

    Ansible介绍

    一、基础介绍

    ==========================================================================================

    1、简介

    ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:

    (1)、连接插件connection plugins:负责和被监控端实现通信;

    (2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;

    (3)、各种模块核心模块、command模块、自定义模块;

    (4)、借助于插件完成记录日志邮件等功能;

    (5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

     

    2、总体架构

     

     

    3、特性

    (1)、no agents:不需要在被管控主机上安装任何客户端;

    (2)、no server:无服务器端,使用时直接运行命令即可;

    (3)、modules in any languages:基于模块工作,可使用任意语言开发模块;

    (4)、yaml,not code:使用yaml语言定制剧本playbook;

    (5)、ssh by default:基于SSH工作;

    (6)、strong multi-tier solution:可实现多级指挥。

     

    4、优点
    (1)、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
    (2)、批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
    (3)、使用python编写,维护更简单,ruby语法过于复杂;
    (4)、支持sudo。

     

    5、任务执行流程

     

     

    1、安装

     (1)python2.7安装

    https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz

    # tar xvzf Python-2.7.8.tgz

    # cd Python-2.7.8

    # ./configure --prefix=/usr/local-------报错1

    # make

    # make install

    报错1解决:

    安装epel

    下载epel.rpm ,安装,执行configure还是报错,缺少gcc

    更换centos6的yum源,参考网页

    安装:python-iniparse-0.3.1-2.1.el6.noarch.rpm,yum-3.2.29-81.el6.centos.noarch.rpm,yum-metadata-parser-1.1.2-16.el6.x86_64.rpm,yum-plugin-fastestmirror-1.1.30-40.el6.noarch.rpm

    更新yum.repo

     Yum clean all

    Yum install

    这样执行yum install gcc  ok

    执行完后,python 看下换成2.7版本

    (2)setuptools模块安装

    https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz

    # tar xvzf setuptools-7.0.tar.gz

    # cd setuptools-7.0

    # python setup.py install

     

    (3)pycrypto模块安装

    https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.1.tar.gz

    # tar xvzf pycrypto-2.6.1.tar.gz

    # cd pycrypto-2.6.1

    # python setup.py install

     

    (4)PyYAML模块安装

    http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz

    # tar xvzf yaml-0.1.5.tar.gz

    # cd yaml-0.1.5

    # ./configure --prefix=/usr/local

    # make --jobs=`grep processor/proc/cpuinfo | wc -l`

    # make install

     

    https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.11.tar.gz

    # tar xvzf PyYAML-3.11.tar.gz

    # cd PyYAML-3.11

    # python setup.py install

     

    (5)Jinja2模块安装

    https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.9.3.tar.gz

    # tar xvzf MarkupSafe-0.9.3.tar.gz

    # cd MarkupSafe-0.9.3

    # python setup.py install

     

    https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.3.tar.gz

    # tar xvzf Jinja2-2.7.3.tar.gz

    # cd Jinja2-2.7.3

    # python setup.py install

     

    (6)paramiko模块安装

    https://pypi.python.org/packages/source/e/ecdsa/ecdsa-0.11.tar.gz

    # tar xvzf ecdsa-0.11.tar.gz

    # cd ecdsa-0.11

    # python setup.py install

     

    https://pypi.python.org/packages/source/p/paramiko/paramiko-1.15.1.tar.gz

    # tar xvzf paramiko-1.15.1.tar.gz

    # cd paramiko-1.15.1

    # python setup.py install

     

    (7)simplejson模块安装

    https://pypi.python.org/packages/source/s/simplejson/simplejson-3.6.5.tar.gz

    # tar xvzf simplejson-3.6.5.tar.gz

    # cd simplejson-3.6.5

    # python setup.py install

     

    (8)ansible安装

    https://github.com/ansible/ansible/archive/v1.7.2.tar.gz

    # tar xvzf ansible-1.7.2.tar.gz

    # cd ansible-1.7.2

    # python setup.py install

     

    2、配置

    (1)SSH免密钥登录设置

    ## 生成公钥/私钥

    # ssh-keygen -t rsa -P ''

     

     

    ## 写入信任文件(将/root/.ssh/id_rsa.pub分发到其他服务器(10.158.42.236),并在所有服务器上执行如下指令):

    # cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

    # chmod 600 /root/.ssh/authorized_keys

     Ssh 10.158.42.236 –p 10022 登录下,成功

    2ansible配置

    把ansible这个源码包里面的examples文件夹拷贝到/etc/ansible下。/etc/ansible是ansible是默认配置文件路径,但是编译安装的时候没有生成这个路径,我们需要手动建立。而examples文件夹下面是ansible默认的配置文件,及例子。

    root@ansible:~/ansible# mkdir /etc/ansible

    root@ansible:~/ansible# cp -r examples/* /etc/ansible/

    root@ansible:~/ansible# ls /etc/ansible/

    ansible.cfg  DOCUMENTATION.yml  hosts  issues  playbooks  scripts

    root@ansible:~/ansible#

    这个ansible.cfg是ansible的主配置文件,装好之后随便看看。最新的版本是1.7

    root@ansible:~/ansible# ansible --version

    ansible 1.7

    root@ansible:~/ansible# ansible --help >/dev/null

    root@ansible:~/ansible#

    ansible管理主机,DNS域名,IP都可以,先弄个主机到到本地hosts里面

    root@ansible:~# echo   "10.158.42.236 zidonghua" >>/etc/hosts

    楼主定义了一个主机名,一个IP到/etc/ansible/hosts里面。 /etc/ansible/hosts是默认的hostfile路径

    lixc@ansible:~$ grep   hostfile  /etc/ansible/ansible.cfg 

    hostfile       = /etc/ansible/hosts

    root@ansible:/home# echo -e  "zidonghua 10.158.42.236" >/etc/ansible/hosts

    检查一下

    lixc@ansible:/home$ cat /etc/ansible/hosts 

    zidonghua

    10.158.42.236

    OK,和salt一样先看看机器是否连通。楼主这里用的是ssh key。所以不需要加用户密码了。通了,返回了一个json格式的结果

    lixc@ansible:/home$ ansible all -m  ping

    salt-master | success >> {

        "changed": false, 

        "ping": "pong"

    }

     

    10.240.162.112 | success >> {

        "changed": false, 

        "ping": "pong"

    }

    注意这个地方是有个坑的,由于ansible执行的时候需要把临时模块拷贝到客户端,而默认的拷贝方式是通过tftp来的方式拷贝的,如果你的客户端没有装sftp,那么执行ansible会出错的。

    lixc@salt-master:~$ dpkg -l sftp

    dpkg-query: no packages found matching sft

    看到没,楼主的就没装sftp。

    那楼主用咋传的呢,用的是scp。 下面的这一行本来是注释起来的,把注释去掉就OK了

    lixc@ansible:~$ grep "scp_if_ssh" /etc/ansible/ansible.cfg 

    scp_if_ssh = True

    还有个坑就是,即使装了tftp也不一定能用,咋回事呢,你的ssh要启用它才OK,看下面就知道了。

    root@salt-master:/home/lixc# grep "Subsystem"  /etc/ssh/sshd_config 

    Subsystem sftp /usr/lib/openssh/sftp-server

    还有个注意:需要把ansible.cfg 中的port 22改为对方服务器的端口10022

    OK

    拷贝个文件玩玩,

    lixc@ansible:/home$ ansible salt-master -m copy -a "src=./testfile dest=/tmp"

    salt-master | success >> {

        "changed": true, 

        "dest": "/tmp/testfile", 

        "gid": 1000, 

        "group": "lixc", 

        "md5sum": "d41d8cd98f00b204e9800998ecf8427e", 

        "mode": "0644", 

        "owner": "lixc", 

        "size": 0, 

        "src": "/home/lixc/.ansible/tmp/ansible-tmp-1403769668.42-75871571353467/source", 

        "state": "file", 

        "uid": 1000

    }

    查看一下,拷贝过去了没?

    lixc@ansible:/home$ ansible salt-master  -a "ls /tmp/testfile"

    salt-master | success | rc=0 >>

    /tmp/testfile

    下面说说ansible的工作流程吧,工作流程差不多是这样的

    1. ansible通过OPENSSH或者python的pramamiko连接客户端
    2. 把ansible module推送到客户端。推送到客户端哪里的呢,请看

    lixc@ansible:~$ grep "remote_tmp" /etc/ansible/ansible.cfg 

    remote_tmp     = $HOME/.ansible/tmp

    lixc@ansible:~$ ansible salt-master  -a "ls  ~/.ansible"

    salt-master | success | rc=0 >>

    tmp

    3.通过ssh执行客户端上的ansible module

    4.执行完毕

    5.删除刚刚推送过去的ansible module

     

     

    3、其他模块

    (1)setup

    ## 用来查看远程主机的一些基本信息

    Ansible all –m setup  或者ansible 10.158.42.236 -m setup

    (2)ping

    ## 用来测试远程主机的运行状态

    # ansible all -m ping

    (3)file

    ## 设置文件的属性

    相关选项如下:

    force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no

    group:定义文件/目录的属组

    mode:定义文件/目录的权限

    owner:定义文件/目录的属主

    path:必选项,定义文件/目录的路径

    recurse:递归设置文件的属性,只对目录有效

    src:被链接的源文件路径,只应用于state=link的情况

    dest:被链接到的路径,只应用于state=link的情况

    state:

           directory:如果目录不存在,就创建目录

           file:即使文件不存在,也不会被创建

           link:创建软链接

           hard:创建硬链接

           touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

           absent:删除目录、文件或者取消链接文件

     

    示例:

    ## 远程文件符号链接创建

    # ansible all -m file -a "src=/etc/resolv.conf dest=/tmp/resolv.conf state=link"

     

    ## 远程文件信息查看

    # ansible all -m command -a "ls -al /tmp/resolv.conf"

     

     

    ## 远程文件符号链接删除

    #  ansible all -m file -a "path=/tmp/resolv.conf state=absent"

     

     

    ## 远程文件信息查看

    # ansible all -m command -a "ls -al /tmp/resolv.conf"

     

    说明:如上显示,代表文件或链接已经删除。

     

    (4)copy

    ## 复制文件到远程主机

    相关选项如下:

    backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no

    content:用于替代“src”,可以直接设定指定文件的值

    dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录

    directory_mode:递归设定目录的权限,默认为系统默认权限

    force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes

    others:所有的file模块里的选项都可以在这里使用

    src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

     

    示例:

    ## 将本地文件“/etc/ansible/ansible.cfg”复制到远程服务器

    # ansible all -m copy -a "src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=root mode=0644"

     

    ## 远程文件信息查看

    # ansible all -m command -a "ls -al /tmp/ansible.cfg"

     

     

    (5)command

    ## 在远程主机上执行命令

    相关选项如下:

    creates:一个文件名,当该文件存在,则该命令不执行

    free_form:要执行的linux指令

    chdir:在执行指令之前,先切换到该目录

    removes:一个文件名,当该文件不存在,则该选项不执行

    executable:切换shell来执行指令,该执行路径必须是一个绝对路径

     

    示例:

    #  ansible all -m command -a "uptime"

     

     

    (6)shell

    ## 切换到某个shell执行指定的指令,参数与command相同。

    与command不同的是,此模块可以支持命令管道,同时还有另一个模块也具备此功能:raw

     

    示例:

    ## 先在本地创建一个SHELL脚本

    # vim /tmp/rocketzhang_test.sh

    #!/bin/sh

    date +%F_%H:%M:%S

     

    #chmod +x /tmp/rocketzhang_test.sh

     

    ## 将创建的脚本文件分发到远程

    # ansible all -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh owner=root group=root mode=755" 

    ## 远程执行

    # ansible all -m shell -a "/tmp/test.sh"

     

     

    (7)、更多模块

    其他常用模块,比如:service、cron、yum、synchronize就不一一例举,可以结合自身的系统环境进行测试。

    service:系统服务管理

    cron:计划任务管理

    yum:yum软件包安装管理

    synchronize:使用rsync同步文件

    user:系统用户管理

    group:系统用户组管理

     

    更多模块可以参考:

    #ansible-doc –l

     

     

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

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

    (国内的一个镜像站点,避免被墙 ^_^ )

    (2) 查看ansible的模块以及参数

    # ansible-doc

    -l 列出所有的ansible模块   
    -s 列出该模块的相关指令


    [root@master ~]# ansible-doc -l    
                 
    boundary_meter       Manage boundary meters                                      
    bzr                  Deploy software (or files) from bzr branches                
    campfire             Send a message to Campfire                                  
    capabilities         Manage Linux capabilities                                   
    cloudformation       create a AWS CloudFormation stack                           
    command              Executes a command on a remote node                         
    composer             Dependency Manager for PHP                                  
    copy                 Copies files to remote locations.                           
    cpanm                Manages Perl library dependencies.                          
    cron                 Manage cron.d and crontab entries.                          
    datadog_event        Posts events to DataDog  service                           


    [root@master ~]# ansible-doc -s command    
    - name: E x e c u t e s   a   c o m m a n d   o n   a   r e m o t e   n o d e    
      action: command    
          chdir                  # cd into this directory before running the command    
          creates                # a filename, when it already exists, this step will *not* be run.    
          executable             # change the shell used to execute the command. Should be an absolute path to the executable.    
          free_form=             # the command module takes a free form command to run.  There is no parameter actually named 'free form'. See the

    examples!   
          removes                # a filename, when it does not exist, this step will *not* be run.    
          warn                   # if command warnings are on in ansible.cfg, do not warn about this particular line if set to no/false.

     

     

    (8)、一些概念补充

    playbook的组成:playbook是由一个或多个“play”组成的列表,可以让它们联同起来按事先编排的机制执行;所谓task无非是调用ansible的一个module,而在模块参数中可以使用变量;模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致;

     

    执行模型:task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在顺序运行某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在修改playbook后重新执行一次即可;

     

    task组成:每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出;

     

    notify指定handler的执行机制:“notify”这个action可用于在每个play的最后被触发,在notify中列出的操作称为handler,仅在所有的变化发生完成后一次性地执行指定操作。

    Hosts中进行分组,分组操作实验

    1、ssh免密认证

    10.141.3.223上执行

    scp -P 10022 /root/.ssh/id_rsa.pub root@10.141.5.145:/root/.ssh

    5.145上执行

    [root@localhost .ssh]# cat id_rsa.pub >>authorized_keys

    [root@localhost .ssh]# chmod 600 authorized_keys

    223上登录验证

    ssh 10.141.5.145 -p 10022  ---ok

    2、修改223上/etc/ansible/hosts

    ansible通过读取默认的主机清单文件/etc/ansible/hosts,该文件在/etc/ansible/ansible.cfg文件中指定,可以自定义主机,支持IP,域名,支持分组,便于对某

    些主机或者某一组功能相同的主机进行操作,还有一个缺省的all组,代表Inventory中所有主机。

    # vi /etc/ansible/hosts

    [test]   
    192.168.10.191    
    192.168.10.192

    示例:可以指定端口与用户与密码:   
    192.168.10.191   ansible_ssh_port=2222  ansible_ssh_user=root ansible_ssh_pass=passwd     
    192.168.10.191:2222

    修改223上的hosts

    分组操作:

    Hosts中增加三个组

    Ansible test1 –m ping success         

    Ansible test2 –m ping success

    Ansible test3 –m ping failed

    原因145上python版本低,为2.4,需升级或安装python-simplejson

    安装python-simplejson

    安装成功后,再ping 下ok

    Ansible module

    Setup模块使用

    ansible-doc -s setup

    ansible test1 -m setup -a 'filter=ansible_processor'

    Ansible_api  setup------接口调用

  • 相关阅读:
    iOS客户端的gzip解压
    如何将应用打包成.ipa文件(越狱)
    手势UIGestureRecognizer
    ASIHTTPRequest下载数据
    ASIHTTPRequest下载示例(支持断点续传)
    ios与android设备即时语音互通的录音格式
    删除沙盒中文件夹下所有文件
    svn,静态库无法添加
    iOS 3D UI——CALayer的transform扩展解析
    自定义Tabbar实现push动画隐藏效果
  • 原文地址:https://www.cnblogs.com/zhxiaoxiao/p/9767218.html
Copyright © 2011-2022 走看看