ansible基础介绍①

前言

        Ansible是自动化运维的工具,基于Python开发,实现了批量系统配置、批量程序部署、批量运行命令等功能。
        Ansible是基于模块工作的,ansible提供一个框架,通过模块实现批量部署。

ansible架构图
ansible基础介绍①

    右边绿色部分是被管理的主机(虚拟机,物理机,云主机等)从以上架构图中可以看出
    ansible是由主机清单(配置),playbook(配置),以及各模块插件组成;
    简单的说就是,用户(管理员)通过ansible的主机清单配置或Playbook配置(一组任务),调用ansible的各种模块及参数来对
    清单中的主机进行统一管理;

1. ansible安装(epel源安装,或者下载以后编译安装)

    ①pm包安装: EPEL源
                yum install ansible
        ②编译安装:
                    yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
                    tar xf ansible-1.5.4.tar.gz
                    cd ansible-1.5.4
                    python setup.py build
                    python setup.py install
                    mkdir /etc/ansible
                    cp -r examples/* /etc/ansible
    ③Git方式:
                git clone git://github.com/ansible/ansible.git --recursive
                cd ./ansible
                source ./hacking/env-setup
        ④pip安装(pip是安装Python包的管理器,类似yum)
                 yum install python-pip python-devel
                 yum install gcc glibc-devel zibl-devel  rpm-bulid openssl-devel
                 pip install  --upgrade pip
                 pip install ansible --upgrade

确认安装: ansible --version
ansible基础介绍①


2. 配置文件相关

                        /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
                        /etc/ansible/hosts 主机清单
                        /etc/ansible/roles/ 存放角色的目录
**ansible主配置文件:/etc/ansible/ansible.cfg (一般保持默认) **
                    [defaults]
                    #inventory      = /etc/ansible/hosts    # 主机列表配置文件
                    #library  = /usr/share/my_modules/  # 库文件存放目录  
                    #remote_tmp  = $HOME/.ansible/tmp   # 临时py命令文件存放在远程主机目录
                    #local_tmp      = $HOME/.ansible/tmp    # 本机的临时命令执行目录
                    #forks          = 5                     # 并发进程并行执行5条命令(提高工作效率)
                    #sudo_user      = root                  # 可使用sudu命令切换身份执行命令
                    #ask_sudo_pass = True               # 每次执行ansible命令是否询问ssh密码
                    #ask_pass      = True                   #
                    #remote_port    = 22                #默认连接管理主机端口号22

ansible基础介绍①

#host_key_checking = False          # 检查对应服务器的host_key,建议开启
#log_path=/var/log/ansible.log          # 日志文件(默认不打开,建议开启便于管理)

ansible主机清单文件:/etc/ansible/hosts
管理IP地址存放位置(可分组)
如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机
列表名称
ansible基础介绍①


3. ansible系列命令

    ansible  ansible-doc  ansible-playbook ansible-vault  
    ansible-console   ansible-galaxy   ansible-pull  

ansible-doc命令: 显示模块帮助

            语法: ansible-doc [选项] [模块...]
            选项: -a 显示所有模块的文档
                                -l, --list 列出可用模块
                                -s, --snippet显示指定模块的playbook片段

ansible命令:

ansible通过ssh服务实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各被管理节点(主机)
                    语法:ansible <host-pattern> [-m 模块名称] [-a 命令参数]
                    选项:--version 显示版本
                                     -m module 指定模块,默认为command
                                     -v 详细过程 –vv -vvv更详细
                                     --list-hosts 显示主机列表,可简写—list
                                     -k, --ask-pass 提示输入ssh连接密码,默认Key验证
                                     -K, --ask-become-pass 提示输入sudo时的口令
                                     -C, --check 检查,并不执行
                                     -T, --timeout=TIMEOUT 执行命令的超时时间,默认10s
                                     -u, --user=REMOTE_USER 执行远程执行的用户
                                     -b, --become 代替旧版的sudo 切换

ansible命令中的Host-pattern匹配主机的列表
All: 表示所有Inventory中的所有主机

                  * :           通配符 
                 示例1: ansible 192.168.1.* -m ping       示例2: ansible “*srvs” -m ping
                    :           逻辑或  
                    示例1: ansible “websrvs:appsrvs” -m ping   
                    &           逻辑与
                    示例1: ansible “websrvs:&dbsrvs” –m ping(在websrvs组并且在dbsrvs组中的主机)
                     !          逻辑非 
                    示例1: ansible ‘websrvs:!dbsrvs’ –m ping (在websrvs组,但不在dbsrvs组中的主机)
                    注意:此处为单引号
                    正则表达式 
                     示例1: ansible “websrvs:&dbsrvs” –m ping
                     示例2: ansible “~(web|db).*\.magedu\.com” –m ping

ansible命令执行过程

  1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg
  2. 加载自己对应的模块文件,如command
  3. 通过ansible将模块或命令生成对应的临时py文件,并将该 文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
  4. 给文件+x执行
  5. 执行并返回结果
  6. 删除临时py文件,sleep 0退出

执行状态颜色:

        绿色:执行成功并且不需要做改变的操作 
        yellow:执行成功并且对目标主机做变更 
        红色:执行失败 

ansible基础介绍①

ansible-galaxy命令:(连接ansible网站下载相应的角色)
连接 https://galaxy.ansible.com/explore#/ 下载相应的roles

    列出所有已安装的galaxy
        示例:ansible-galaxy list
    安装galaxy
        示例:ansible-galaxy install geerlingguy.redis
    删除galaxy
        示例:ansible-galaxy remove geerlingguy.redis

ansible-pull命令

推送命令至远程,效率无限提升,对运维要求较高 

ansible-vault命令:(对playbook文件进行加密)

                        功能: 管理加密解密yml文件 
                        语法: ansible-vault [create|decrypt|edit|encrypt|rekey|view]
                选项示例: ansible-vault encrypt hello.yml 加密 
                                ansible-vault decrypt hello.yml 解密 
                                ansible-vault view hello.yml 查看 
                                ansible-vault edit  hello.yml 编辑加密文件 
                                ansible-vault rekey  hello.yml 修改口令 
                                ansible-vault create new.yml 创建新文件 

ansible-console命令:(交互式控制台,支持tab)

执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
                设置并发数: forks n          例: forks 10
                切换组: cd [主机组]           例: cd web
                列出当前组主机列表: list
                列出所有的内置命令: ?或help

ansible基础介绍①

ansible-playbook命令:(运行yml脚本文件)

后续会详细解答


4. ansible常用模块及选项

    此处只列举常用选项,如需更多骚操作,查看帮助: ansible-doc -s [模块名称]

setup模块: 查看远程主机的一些基本信息

            ansible -i /etc/ansible/hosts test -m setup

ping模块: 测试远程主机的运行状态
ansible基础介绍①
hostname模块:管理主机名

    name:修改的主机名
        ansible node1 -m hostname -a “name=websrv”  

command模块:在远程主机执行命令,默认模块,可忽略-m选项

    free_form:      #要执行的linux命令
    chdir:          #运行前切换目录
    此模块不支持 $VARNAME <  >  |  ; & 等,用shell模块实现 

ansible基础介绍①
shell模块:和command相似,用shell执行命令

    free_form:      #要执行的linux命令
    调用shell模块时:如果命令过于复杂,建议写在脚本里复制到远程,执行,再把需要的结果返回.否则可能会执行失败

ansible基础介绍①
script模块:在管理的主机上 运行脚本

    选项和command相似
    free_form:      #要执行的linux命令

ansible基础介绍①
file模块:设置文件属性 (创建文件)

    path:必选项,定义文件/目录的路径
    state:  #状态选项
    directory:#如果目录不存在,创建目录
    file:#即使文件不存在,也不会被创建
    link:#创建软链接
    hard:#创建硬链接
    touch:#如果文件不存在,(创建新的文件),如果文件或目录已存在,(更新其最后修改时间)
    absent:#删除目录、文件或者取消链接文件
    group:#定义文件/目录的属组
    mode:#定义文件/目录的权限
    owner:#定义文件/目录的属主

ansible基础介绍①

copy模块:复制文件到远程主机

    dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
    src:#要复制到远程主机的文件在本地的地址
    content:用于替代"src",可以直接设定指定文件的值
    backup:#在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
    force:#强制覆盖(默认为yes),有两个选项:yes|no 
    directory_mode:#递归的设定目录的权限,默认为系统默认权限

ansible基础介绍①
fetch模块:从远程主机拉取文件到本地,于copy相反,只能抓取文件,不能抓取目录

    选项和copy相似
    ansible websrvs -m fetch -a "src=/var/log/messages dest=/data/test"

cron模块:管理计划任务

        job:   #要执行的任务
        backup:#对远程主机上的原任务计划内容修改之前做备份
        state:#该计划任务是创建还是删除 present|absent
        disabled: #禁用或启用计划任务 true|false
        name:该任务的名称及描述
        user:#以哪个用户的身份执行
        cron_file:#如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
        special_time:#指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
        支持指定时间格式:minute(分钟),hour(小时),day(日),month(月),weekday(周)

ansible基础介绍①
yum模块:安装软件

    name:#软件包名称
    state:#状态选项(present,absent,latest)
    list:#查看包详细信息
    config_file:#yum的配置文件 
    updete_cache=yes #清理缓存

ansible基础介绍①
service模块:管理服务

    name:必选项,服务名称
    state:#对当前服务执行启动,停止、重启、重新加载等操作  
    (started,stopped,restarted,reloaded)
    enabled:#是否开机启动 yes|no
    ansible websrvs -m service -a "name=httpd state=started enabled=no"

user模块与group模块:管理用户,管理组

    name:必选项,用户名称
    password:设置密码(需要特别说明的是,password后面指定的密码不能是明文)
    home:#用户家目录
    groups: #指定组
    uid:        #指定id号
    createhome:
    system: #是否是系统账号 yes|no
    remove:#是否删除家目录 yes|no
    state: #是否删除账号present|absent
    shell: #shell类型

ansible基础介绍①


5. playbook介绍

    playbook是一个非常简单的配置管理和多主机部署系统。可作为一个适合部署复杂应用程序的基础。
    playbook可以定制配置,可以按指定的操作步骤有序执行,支持同步和异步方式。
    playbook是通过YAML格式来进行描述定义的,可实现多台主机应用的部署,对不同分组的主机执行特定指令步骤。
    Ansible-playbook(剧本)执行过程: 
    将已有编排好的任务集写入Ansible-Playbook
    通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行

Playbook工作流程图
ansible基础介绍①
YAML简介(是一种标记语言)

    YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。
     特性: YAML的可读性好
         YAML和脚本语言的交互性好
         YAML使用实现语言的数据类型
         YAML有一个一致的信息模型
         YAML易于实现
         YAML可以基于流来处理
         YAML表达能力强,扩展性好

更多YAML内容及规范参见http://yaml.org/


6. Playbook核心元素

    hosts   执行的远程主机列表 
    tasks   任务列表(任务集) 
    varniables 内置变量或自定义变量在playbook中调用 
    templates  模板,可替换模板文件中的变量并实现一些简单逻辑的文件 
    handlers  和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
    tags 标签  指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断

playbook基础组件

    Hosts: playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中
    remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
    tasks:play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可
            ①task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
            ②每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出

tasks应用:任务列表和action

    语法格式:   (1) action: module arguments
                        (2) module: arguments 建议使用
                    shell和command模块后面跟命令,而非key=value
    如果命令或脚本的退出状态码不为0,可使用如下方法
    任务执行失败会影响后续操作执行,即使当前任务执行失败后续任务继续执行
                     || /bin/true           #管道返回值为真
    或者使用ignore_errors来忽略错误信息: 
                     ignore_errors: True    #不论命令执行结果,继续执行后续命令 

handlers(触发器)和notify结合使用触发条件

    Handlers:是一些task的列表,通过名字来引用,它们和一般的task并没有什么区别。handlers是由通知者进行notify,如果没有被notify,handlers不会执行不管多少个通知者进行了notify,等到play中的所有task执行完成之后handlers也不会被执行一次
    Notify:此action可用于在每个task结束时被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作
        对应关系:notify中调用handler中定义的操作
    notify调用handlers定义的触发条件

ansible基础介绍①


7. 运行playbook的方式

        语法:ansible-playbook <filename.yml> ... [options]
        选项: --check 只检测可能会发生的改变,但不真正执行操作
                --list-hosts 列出运行任务的主机
                --limit 主机列表 只针对主机列表中的主机执行
                -v 显示过程 -vv -vvv 更详细

小结

    通过ansib-doc来获取模块信息及指定模块帮助信息;
    ansible通过常用模块在命令行就可以针对主机清单来管理配置远程主机,无需要代理客      户端程序,但需要目标主机有ssh和python2.4+;
    基于ssh协议既可以通过用户名和密码,也可以通过私钥,推荐使用私钥;
    ansible-playbook 基于YAML语法配置;可以对playbook文件进行测试,解析并执行应用于指定无端主机;非常方便我们统一编排分发管理远程主机;
    ①一个模块定义一个name,相同的模块,多个操作也必须定义多个name
    ②某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers
    ③任务可以通过"tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用

转载于:https://blog.51cto.com/13769014/2121794

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值