zoukankan      html  css  js  c++  java
  • Ansible常用模块使用


    Ansible

    除了使用pssh做批量主机操作外,进阶选择就是使用Saltstack、Ansible、Puppet了。

    Ansible基于Python开发,集合了众多优秀运维工具的优点,实现了批量运行命令、部署程序、配置系统等功能。默认通过SSH协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,从而使得自动化环境部署变得更加简单。可同时支持多台主机并行管理,使得管理主机更加便捷

    1 特性

    1. 模块化:调用特定的模块完成特定任务,支持自定义模块,可使用任何编程语言写模块
    2. Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块
    3. 基于Python语言实现
    4. 部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖PKI(无需ssl)
    5. 安全,基于OpenSSH
    6. 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对
    7. 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
    8. 较强大的多层解决方案 role

    2 组成

    1. Ansible 核心执行工具;一次性或临时执行的操作都是通过该命令执行
    2. INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
    3. MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
    4. PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等
    5. API:供第三方程序调用的应用程序编程接口

    3 安装

    #1 yum install epel-release
    yum install ansible
    
    #rpm -qa ansible
    ansible-2.9.21-1.el7.noarch
    #rpm -qc ansible
    /etc/ansible/ansible.cfg   # 主配置文件
    /etc/ansible/hosts         # 默认的管理主机清单
    
    #2 pip install 
    pip3 install ansible==
    

    主配置文件

    hostfile    = /etc/ansible/hosts   		##hosts文件的位置
    library      = /usr/share/ansible		##ansible默认搜寻模块的位置
    pattern     = *  					##如果没有提供hosts节点,这是playbook要通信的默认主机组.默认值是对所有主机通信
    remote_tmp  = $HOME/.ansible/tmp   	##Ansible通过远程传输模块到远程主机,然后远程执行,执行后在清理现场.在有些场景下,你也许想使用默认路径希望像更换补丁一样使用
    forks   = 5    						##在与主机通信时的默认并行进程数 ,默认是5d
    poll_interval  = 15  					##当具体的poll interval 没有定义时,多少时间回查一下这些任务的状态, 默认值是5秒 
    sudo_user  = root   					##sudo使用的默认用户 ,默认是root
    #ask_sudo_pass = True   				##用来控制Ansible playbook 在执行sudo之前是否询问sudo密码.默认为no
    #ask_pass    = True   				##控制Ansible playbook 是否会自动默认弹出密码
    transport   = smart   				##通信机制.默认 值为’smart’。如果本地系统支持 ControlPersist技术的话,将会使用(基于OpenSSH)‘ssh’,如果不支持将使用‘paramiko’.其他传输选项‘local’,‘chroot’,’jail’等等
    #remote_port  = 22    				##远程SSH端口。 默认是22
    module_lang   = C   				##模块和系统之间通信的计算机语言,默认是C语言
    #host_key_checking = False    			##检查主机密钥
    timeout = 10    						##SSH超时时间
    #log_path = /var/log/ansible.log     	##日志文件存放路径
    #module_name = command     		##ansible命令执行默认的模块
    #private_key_file = /path/to/file     	##私钥文件存储位置
    

    相关工具

    1. /usr/bin/ansible 主程序,临时命令执行工具
    2. /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man
    3. /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
    4. /usr/bin/ansible-pull 远程执行命令的工具
    5. /usr/bin/ansible-vault 文件加密工具
    6. /usr/bin/ansible-console 基于Console界面与用户交互的执行工具
    7. /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
    • 利用ansible实现管理的主要方式

      1. Ad-Hoc 即利用ansible命令,主要用于临时命令使用场景
      2. Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程
    • ansible-doc 显示模块帮助

    ansible-doc [options] [module...]
    -l, --list    #列出可用模块
    -s, --snippet #显示指定模块的playbook片段
    
    #列出所有模块
    ansible-doc -l 
    #查看指定模块帮助用法
    ansible-doc ping 
    #查看指定模块帮助用法
    ansible-doc -s  ping
    

    4 ansible命令执行过程

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

    执行状态

    # grep -A 14 '[colors]' /etc/ansible/ansible.cfg
    #highlight = white
    #verbose = blue
    #warn = bright purple
    #error = red
    #debug = dark gray
    #deprecate = purple
    #skip = cyan
    #unreachable = red
    #ok = green
    #changed = yellow
    #diff_add = green
    #diff_remove = red
    #diff_lines = cyan
    

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

    5 ansible-playbook

    此工具用于执行编写好的 playbook 任务

    ansible-playbook hello.yml

    6 其他命令

    # ansible-vault  加密解密yml文件
    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 可交互执行命令
    # ansible-galaxy 连接 https://galaxy.ansible.com 下载相应的roles
    

    5 常用模块

    ansible模块众多,但最常用的模块也就几十个,针对特定业务只用10几个模块

    ansible-doc -s ping # 查看模块帮助

    1 ping模块

    检测主机存活状态

    # cat /etc/ansible/hosts
    [webservers]
    192.168.1.101
    192.168.1.102
    192.168.1.102:2222
    www[1:100].example.com
    
    [dbserver]
    192.168.1.102 ansible_ssh_user=root ansible_ssh_port=2222
    
    # ansible all -m ping
    #ansible -i hosts webservers -om ping
    # ansible 192.168.1.111 -m ping
    
    ###
    --version              #查看ansible的版本信息
    -i 文件位置              #指定hosts文件的存放位置
    -f 进程数量              #指定fork出的进程数量值
    -a 模块的参数或命令       #指定module模块的参数或者命令
    -sudo                   #基于sudo用户指定
    -T 指定命令超时时间单位为秒  #超时时间,默认是10s
    -m module   #指定模块,默认为command
    -v          #详细过程 –vv -vvv更详细
    --list-hosts #显示主机列表,可简写 --list
    -C, --check  #检查,并不执行,预演
    -T, --timeout=TIMEOUT #执行命令的超时时间,默认10s
    -k, --ask-pass   #提示输入ssh连接密码,默认Key验证
    -u, --user=REMOTE_USER #执行远程执行的用户
    -b, --become   #代替旧版的sudo 切换
    --become-user=USERNAME  #指定sudo的runas用户,默认为root
    -K, --ask-become-pass  #提示输入sudo时的口令
    

    2 command模块

    ansible all  -a 'uptime'
    ansible all -m command -a 'uptime'
    ansible all -a 'chdir=/tmp ls'
    ansible all -a 'creates=/tmp ls'
    ansible all -a 'removes=/root/a cat a' cv
    
    ###
    chdir			##执行命令前,切换到该目录
    creates			##当该文件存在时,则不执行该步骤
    executable		##换用其他shell环境执行命令
    free_form		##需要执行的脚本
    removes			##当该文件不存在时,则不执行该步骤
    

    3 shell模块

    用于执行远端主机上的shell命令或脚本,支持比command更多的指令

    ansible all -m shell -a 'hostname -i >> /tmp/ip; cat /tmp/ip'
    
    
    ###
    chdir						##执行命令前,切换到此位置
    creates						##当该文件存在时,不执行该步骤
    removes						##当该文件不存在时,不执行该步骤
    warn						##不显示警告
    

    4 Script 模块

    在远程主机上运行ansible服务器上的脚本(无需执行权限)

    ansible all -m  script -a agent.sh
    

    5 copy模块

    ansible all -m copy -a 'src=/root/agent.sh dest=/tmp/ mode=700 owner=2049'
    
    ###
    src					#源文件位置
    content				#手动编写源文件内容
    dest				#目标主机上的目标文件位置
    mode				#设置文件权限
    owner				#设置文件属主
    group				#设置文件属组
    force				#强制覆盖文件
    

    6 yum/apt模块

    ansible all -m yum -a "name=tmux state=installed"
    ansible all -m apt -a 'name=bb,sl,cowsay,cmatrix,oneko,hollywood,boxes,libaa-bin,x11-apps'
    
    ###
    name		     	#软件包名称
    state			    #软件包状态,installed表示安装、absent表示卸载
    update_cache		#安装软件包前更新缓存
    enablerepo			#指定yum源名称
    conf_file			#指定yum安装时所加载的yum配置文件
    

    7 file模块

    ansible all -m file -a 'path=/tmp/direct state=directory mode=755'
    ansible all -m file -a 'path=/tmp/text state=touch mode=700'
    
    ###
    path                   #目标位置
    state                  #状态,directory为目录、touch为文件、link为软链接
    mode                   #文件权限
    owner                  #属主
    group                  #属组
    

    8 user模块

    ansible all -m user -a 'name=www home=/app/nginx shell=/sbin/nologin uid=2048 state=present'
    ansible all -a 'id www'
    
    ###
    name					#用户名
    home					#家目录位置
    shell					#指定登陆shell
    uid						#指定用户uid
    state					#状态,present为新建、absent为删除
    force					#强制删除
    

    9 corn模块

    ansible all -m cron -a "minute=1 hour=0 day=* month=* weekday=* name=test_cron job='echo a > /tmp/text'"
    ansible all  -a "crontab -l"
    ansible all -m cron -a "name=test_cron state=absent"
    
    ###
    name					#计划任务名称
    minute					#分钟数
    hour					#小时数
    day						#日
    month					#月
    weekday					#周
    job						#任务内容
    user					#任务计划的用户
    state					#状态,present是新建,absent是删除
    

    10 synchronize模块

    ansible all -m synchronsize -a 'src=/root/ dest=/tmp/ compress=yes'
    
    ###
    用于管理节点与被管理节点之间的文件目录数据同步;
    compress 				#开启压缩,默认为开启
    archive					#是否采用归档模式同步,保证源文件与目标文件属性一致
    links					#是否同步链接文件
    recursive				#是否开启递归
    delete					#删除源位置没有,而目标位置有的文件
    src						#源位置
    dest					#目标位置
    --exclude=.log			#排除,忽略同步.log
    

    11 Service 模块

    ansible all -m service -a 'name=httpd state=started enabled=yes'
    ansible all -m service -a 'name=httpd state=stopped'
    ansible all -m service -a 'name=httpd state=reloaded'
    

    12 Lineinfile 模块

    ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,存在问题,无法正常进行替换 。其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换
    一般在ansible当中去修改某个文件的单行进行替换的时候需要使用lineinfile模块

    regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除

    如果想进行多行匹配进行替换需要使用replace模块

    ansible websrvs -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen' line='Listen 80'"
    ansible all -m  lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"
    ansible all -m lineinfile  -a 'dest=/etc/fstab state=absent regexp="^#"'
    

    13 unarchive 模块

    解包解压缩
    实现有两种用法:
    1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes
    2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no

    ansible all -m unarchive -a 'src=/data/foo.tgz dest=/var/lib/foo owner=user group=bin'
    ansible all -m unarchive -a 'src=/tmp/foo.zip dest=/data copy=no mode=0777'
    ansible all -m unarchive -a 'src=https://example.com/example.zip dest=/data copy=no' ansible websrvs -m unarchive -a 'src=https://releases.ansible.com/ansible/ansible-2.1.6.0-0.1.rc1.tar.gz dest=/data/ owner=mysql remote_src=yes'
    
    ###
    copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为
    copy=no,会在远程主机上寻找src源文件
    remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible
    主机上
    src:源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果
    是远程主机上的路径,则需要设置copy=no
    dest:远程主机上的目标路径
    mode:设置解压缩后的文件权限
    

    14 Setup 模块

    setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度,可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息

    ansible all -m setup
    ansible all -m setup -a "filter=ansible_nodename"
    ansible all -m setup -a "filter=ansible_hostname"
    ansible all -m setup -a "filter=ansible_domain"
    ansible all -m setup -a "filter=ansible_memtotal_mb"
    ansible all -m setup -a "filter=ansible_memory_mb"
    ansible all -m setup -a "filter=ansible_memfree_mb"
    ansible all -m setup -a "filter=ansible_os_family"
    ansible all -m setup -a "filter=ansible_distribution_major_version"
    ansible all -m setup -a "filter=ansible_distribution_version"
    ansible all -m setup -a "filter=ansible_processor_vcpus"
    ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
    ansible all -m setup -a "filter=ansible_architecture"
    ansible all -m setup -a "filter=ansible_processor*"
    

    PS

    Ansible常用模块
    ansible太慢解决
    ansible-playbook 使用
    https://www.cnblogs.com/www233ii/p/11997368.html

  • 相关阅读:
    第一次 实习笔记
    docker 提示 Drive has not been shared 错误
    使用matplotlib画出log的图像
    python基础实现tcp文件传输
    django简单实现注册登录模块
    python使用消息队列RabbitMq(进阶)
    scrapy爬虫值Items
    redis常见配置redis.conf
    js实现往数组中添加非存在的对象,如果存在就改变键值。
    CSS之user-select——设置标签中的文字是否可被复制
  • 原文地址:https://www.cnblogs.com/firewalld/p/12161643.html
Copyright © 2011-2022 走看看