美文网首页我的专题python自动化运维Ansible
Ansible基本配置以及使用示例

Ansible基本配置以及使用示例

作者: 9c46ece5b7bd | 来源:发表于2017-04-23 22:16 被阅读291次

    Ansible基本使用以及模块详解

    准备条件:注意:前提是ansible已经正常安装,并且可以使用

    1.在ansible主机上创建ssh公私钥对

    ansible-sh-4.1sh-4.1# ssh-keygen 
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    de:74:be:8b:2e:a2:9f:03:78:a2:4a:40:27:ee:c5:3e root@JXQ-23-200-36.h.chinabank.com.cn
    The key's randomart image is:
    +--[ RSA 2048]----+
    |                 |
    |                 |
    | o .             |
    |o +              |
    |.. +    S . .    |
    |o = o  . o o     |
    | + E .  . . .    |
    |o   . o..  . .   |
    |o   .ooo oo o.   |
    +-----------------+
    一切采用默认就行
    

    2.在目标机添加ansible主机的公钥 (当然也可以使用密码验证的方式):

    注意:需要在目标主机的对应用户家目录下有.ssh目录以及authorized_keys文件,若无可以自行创建.ssh目录权限必须为0700,authorized_keys文件的权限必须为0644
    将ansible主机的公钥内容拷贝到目标主机,多种方式:

    ansible-sh-4.1# ssh-copy-id /root/.ssh/id_rsa.pub 目标IP:       #默认就是将当前用户的公钥(id_rsa.pub)传到目标主机并且存入认证文件
    target-sh-4.1#curl pd.api.com/host_key >> /root/.ssh/authorized_keys  #可以将ansible主机的公钥文件存入公共存储,然后追加到目标主机的认证文件中
    

    3.测试连接

    ansible-sh-4.2# ansible target-sh -m ping
    target-sh | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    

    Ansible目录结构介绍以及配置介绍

    1. Ansible目录结构

    使用rpm包或者apt包安装会默认创建目录结构,但是使用pip或者源码包需要对基本的目录结构进行构建

    • 主配置文件:/etc/ansible/ansible.cfg
    • 主机信息配置文件: /etc/ansible/hosts
    • roles规则目录: /etc/ansible/roles/

    2.优化后的配置配置:

    ansible-sh-4.1#cat /etc/ansible/ansible.cfg
    [defaults]                                    #常规连接类配置
    inventory      = /etc/ansible/hosts           #定义主机信息配置文件,默认路径
    forks          = 5                            #定义默认开启的并发数
    poll_interval  = 15                           #定义轮询时间间隔
    sudo_user      = root                         #定义默认sudo用户
    #ask_sudo_pass  = True                        #是否需要sudo密码
    #ask_pass      = True                         #是否需要密码
    remote_port    = 51899                        #定义ssh端口
    roles_path    = /etc/ansible/roles            #默认的role规则路径
    host_key_checking = False                     #首次连接检查key认证(record_host_keys协作使用)
    timeout = 10                                  #默认超时时间
    log_path = /var/log/ansible.log               #默认日志路径
    deprecation_warnings = Flase                  #该参数在使用playbooks操作的时候sudo权限不会进行提示
    nocows = 1                                    #关闭cowsay功能,如果需要启用的话必须首先安装了cowsay才可以
    nocolor = 0                                   #开启颜色,下面的colors设置相关的颜色
    [privilege_escalation]                        #权限管理
    #become    = True                             #是否sudo
    #become_method  = True                        #sudo方式
    #become_user    = root                        #sudo后变成root用户
    #become_ask_pass= False                       #sudo后是否验证密码  
    
    [paramiko_connection]                         #连接配置
    record_host_keys=Flase                        #记录新主机的key.在host_key_checking 被禁用时候,设置为False时,性能将会提升
    
    [ssh_connection]                              #ssh协议连接配置
    ssh_args = -C -o ControlMaster=auto -o ControlPersist=1800s    #传递一组选项给Ansible,而不是使用以前的默认值.ControlPersist的值提高会提高性能,30分钟会比较合适
    
    [accelerate]                                  #加速配置
    #accelerate_port = 5099                       #加速连接端口
    #accelerate_timeout = 30                      #命令执行超时时间,单位秒
    #accelerate_connect_timeout = 5.0             #连接超时时间
    #accelerate_daemon_timeout = 30               #上一个活动连接的时间,单位分钟
    
    [selinux]                                     #该参数一般不会使用
    [colors]                                      #配置常用的颜色
    highlight = white
    verbose = blue
    warn = bright purple
    error = red
    ok = green
    changed = yellow
    diff_add = green
    diff_remove = red
    diff_lines = cyan
    pipelining=true
    

    Ansible 模块使用指南:

    使用Ad-Hoc模式(在命令行中定义任务并执行)来测试模块
    格式如下:

    ansible <host-pattern> -m module -a 'args' options
    

    ansible的Ad-Hoc模式特殊选项options:可以在后面加上-C参数,这样将预览未来要做的操作,但是不会真正执行;
    --sudo表示使用sudo去执行相关的操作

    1. copy模块使用详情

    相关选项如下:
    backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no
    content:用于替代“src”,可以直接设定指定文件的值
    dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
    directory_mode:递归设定目录的权限,默认为系统默认权限
    force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
    others:所有的file模块里的选项都可以在这里使用
    src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

    示例1:使用copy模块进行远程拷贝文件,并赋予相关的权限。默认使用sudo切换到root执行

    ansible jrm -m copy -a 'src=env.sh dest=/export/Domains/jrmcalendar.jd.local/server1/bin/ owner=admin group=admin mode=0755' --sudo
    

    注意:copy模块中:
    backup=yes 会在目标路径下备份一份文件出来
    如下命令会预览在目标主机执行的操作,但是不会真正执行

    ansible jrm -m copy -a 'src=start.sh dest=/export/Domains/jrmcalendar.jd.local/server1/bin/start.sh owner=admin group=admin mode=0755 backup=yes' --sudo -C
    

    2. fetch模块使用详情

    注意:fetch和copy模块都是作为文件拷贝的,fetch是将远程的文件拷贝到ansible本机
    相关选项如下:
    src: 远程主机上需要拷贝过来的文件,必须是文件哦
    dest: ansible主机本地的文件存储目录。需要注意的是如果dest/backup,远程主机的src文件为在host.example.com主机上的/etc/profile文件,那么最终保存到ansible主机是上的地址就是/backup/host.example.com/etc/profile
    flat: 可选项(yes|no) 允许你去覆盖你ansible主机本地的/dir/hostname/path/to/file文件,dest如果以/结尾,filename将以basename的值为准
    fail_on_missing: 可选项(yes|no) 当设置为yes,如果源文件不存在,任务会显示fail
    示例:

    默认将所有的主机的文件都拷贝到/tmp/sms,并且进行差异化覆盖,以最后一个host为准,如果源文件不存在,则对应的host任务失败
    ansible -i sms all -m fetch -a 'src=/export/servers/nginx/conf/domains/sms dest=/tmp/ flat=yes fail_on_missing=yes' --sudo
    

    3. file模块使用详情

    相关选项如下:
    force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
    group:定义文件/目录的属组
    mode:定义文件/目录的权限
    owner:定义文件/目录的属主
    path:必选项,定义文件/目录的路径
    recurse:递归设置文件的属性,只对目录有效
    src:被链接的源文件路径,只应用于state=link的情况
    dest:被链接到的路径,只应用于state=link的情况
    state

    directory:如果目录不存在,就创建目录
    file:即使文件不存在,也不会被创建
    link:创建软链接
    hard:创建硬链接
    touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
    absent:删除目录、文件或者取消链接文件

    示例2:使用file模块在源文件不存在的情况下强制创建软链:

    ansible jrapp-h5 -m file -a "src=/export/Instances/licai.base.fundredempt/runtime dest=/export/App/sc.licai.base.jd.local/fund state=link force=yes " --sudo
    
    

    4. command模块使用详情

    相关选项如下:
    creates:一个文件名,当该文件存在,则该命令不执行
    free_form:要执行的linux指令
    chdir:在执行指令之前,先切换到该目录
    removes:一个文件名,当该文件不存在,则该选项不执行
    executable:切换shell来执行指令,该执行路径必须是一个绝对路径

    5. shell模块详情

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

    示例:
    ## 先在本地创建一个SHELL脚本
    # vim /tmp/rocketzhang_test.sh
    #!/bin/sh
    date +%F_%H:%M:%S
    
    #chmod +x /tmp/rocketzhang_test.sh
    
    ## 将创建的脚本文件分发到远程
    # ansible storm_cluster -m copy -a "src=/tmp/rocketzhang_test.sh dest=/tmp/rocketzhang_test.sh owner=root group=root mode=0755"
    
    ##然后远程执行该脚本
    #ansible storm_cluster -m shell -a '/tmp/rocketzhang_test.sh'
    

    需要注意的是:command,shell都是进行执行远程命令的,如果想要在远程执行脚本,就得像上面一样,先去copy脚本到远端,然后在使用shell或者command模块去执行。但其实ansible本身还有另外一个模块,就是script

    # vim test_disk.sh
    net=`ifconfig eth0 | grep 255 | awk -F ':' '{print $2}' | awk '{print $1}'`
    disk=` df -h | grep /export`
    echo "Host:"$net "disk usage info"
    echo "##"$disk"##"
    
    直接执行脚本
    # ansible -i abc all[0] -m script -a 'test.sh'  --sudo
    10.0.0.1 | SUCCESS => {
        "changed": true,
        "rc": 0,
        "stderr": "",
        "stdout": "Host:10.240.55.89 disk usage info\r\n##/dev/vda5 56G 2.1G 51G 4% /export##\r\n",
        "stdout_lines": [  执行结果如下:
            "Host:10.0.0.1 disk usage info",
            "##/dev/vda5 56G 2.1G 51G 4% /export##"
        ]
    }
    

    5. lineinfile模块详情

    lineinfile模块会使用正则匹配,替换文件中的目标行为替换值
    相关选项如下:
    dest:目标配置文件
    regexp:正则匹配表达式
    line:替换行的内容
    backup(yes|no):该参数表示会将远程文件备份一份,并带有时间戳
    注意:默认如果不加正则表达式,只有dest和line参数的话,会自动在文件末尾行追加内容

    $ cat docker.conf
    # /etc/sysconfig/docker
    other_args='-s overlay -g /data/docker/ -b br0 -H tcp://0.0.0.0:5555'
    
    #注意,line中的内容需要用转义字符,否则文本中的引号无法替换
    $ ansible -i pe-test 正式[2] -m lineinfile -a 'dest=docker.conf regexp="^other.*$" line="OPTIONS=\"--selinux-enabled --log-driver json-file --log-opt max-size=50m\"" '
    10.0.0.1 | SUCCESS => {
        "backup": "",
        "changed": true,
        "msg": "line replaced"
    }
    $ cat docker.conf
    # /etc/sysconfig/docker
    OPTIONS="--selinux-enabled --log-driver json-file --log-opt max-size=50m"
    

    示例3:使用yum模块进行安装服务

    #ansible bigdata -m yum -a "name=ntp state=present"
    #ansible bigdata -m copy -a 'src=ntp.conf dest=/etc/ntp.conf backup=yes'
    

    示例4:使用service模块进行管理服务

    # ansible bigdata -m service -a "name=ntpd state=restarted"
    

    示例5:使用pip模块安装python依赖包

    # ansible bigdata -m pip -a 'name=docker state=present'
    

    示例6:使用setup获取系统信息

    # ansible -i abc all[0] -m setup -a 'filter=ansible_distribution_version'
    10.0.0.1 | SUCCESS => {
        "ansible_facts": {
            "ansible_distribution_version": "6.5"
        },
        "changed": false
    }
    
    # ansible -i abc all[0] -m setup -a 'filter=ansible_hostname'
    10.0.0.1 | SUCCESS => {
        "ansible_facts": {
            "ansible_hostname": "10-0-0-1"
        },
        "changed": false
    }
    

    注意:ansible 的facts中会保存很多目标服务器的状态值,合理的使用该值可以快速的进行目标服务器的管理,而facts的获取可以使用setup模块
    经常使用的facts:

    #ansible_all_ipv4_addresses是单纯的取主机上的iPv4地址,很有可能有多个。所以一般会使用ansible_default_ipv4这个值来查找目标主机的ip:
           "ansible_default_ipv4": {
                "address": "10.0.0.1", 
                "alias": "eth0", 
                "broadcast": "10.0.0.255", 
                "gateway": "10.0.0.254", 
                "interface": "eth0", 
                "macaddress": "f0:00:ac:18:d4:e0", 
                "mtu": 1500, 
                "netmask": "255.255.255.0", 
                "network": "172.24.212.0", 
                "type": "ether"
            }, 
    # ansible_devices 获取目标主机的设备,可以根据具体指标来判断磁盘使用率
            "ansible_devices": {
                "vda": {
                    "holders": [], 
                    "host": "SCSI storage controller: Red Hat, Inc Virtio block device", 
                    "model": null, 
                    "partitions": {
                        "vda1": {
                            "holders": [], 
                            "sectors": "409600", 
                            "sectorsize": 512, 
                            "size": "200.00 MB", 
                            "start": "2048", 
                            "uuid": "3898e489-a18c-4a66-94c7-a7122382cd38"
                        }
                    }, 
                    "removable": "0", 
                    "rotational": "1", 
                    "sas_address": null, 
                    "sas_device_handle": null, 
                    "scheduler_mode": "noop", 
                    "sectors": "167772160", 
                    "sectorsize": "512", 
                    "size": "80.00 GB", 
                    "support_discard": "0", 
                    "vendor": "6900"
                }
            }, 
    
    # ansible_distribution 相关指标获取目标主机的发行版本以及主版本信息
    # ansible_hostname 获取目标主机名前缀
    # ansible_nodename 获取完整的主机名
    # ansible_kernel 获取目标主机内核版本
    # ansible_memtotal_mb 获取目标主机总内存
    # ansible_mounts 相关指标获取目标主机所有挂载点信息
    # ansible_os_family 主机操作系统发行版本(RedHat,Ubuntu,Centos)
    # ansible_processor 相关指标获取处理器相关
    
    

    示例7:使用get_url下载远程包

    ansible -i abc all[0] -m get_url -a 'url=http://pd.andy.com/snmpd.sh dest=/tmp force=yes'
    10.0.0.1 | SUCCESS => {
        "changed": true,
        "checksum_dest": null,
        "checksum_src": "5809167609254db2e94d8f96116a16187e2b681f",
        "dest": "/tmp/deploy_snmpd.sh",
        "gid": 510,
        "group": "pe",
        "md5sum": "6e26ee627240d071cf1ac908f988ab4a",
        "mode": "0664",
        "msg": "OK (1345 bytes)",
        "owner": "pe",
        "size": 1345,
        "src": "/tmp/tmpuKr70_",
        "state": "file",
        "uid": 510,
        "url": "http://pd.andy.com/snmpd.sh"
    }
    

    相关文章

      网友评论

        本文标题:Ansible基本配置以及使用示例

        本文链接:https://www.haomeiwen.com/subject/wltuzttx.html