Ansible自动化运维

一、三大自动化运维工具特点:
1、Puppet是早期的Linux自动化运维工具,是一种linux、unix、windows平台的集中配置管理系统,发展至今目前已经非常成熟,可以批量管理远程服务器,模块丰富,配置复杂,基于Ruby语言编写。最典型的C/S模式,需要安装服务端与客户端。
Puppet采用C/S星状的结构,所有的客户端和一个或几个服务器交互,每个客户端周期地(默认半小时)向服务器发送请求,获得最新的配置信息,保证和该配置信息同步。
每个Puppet客户端每半小时(可以设置)连接一次服务器端,下载最新的配置文件,并且严格按照配置文件来配置客户端。配置完成后,Puppet客户端可以反馈给服务端一个消息,如果出错也会给服务器端反馈一个消息。
Puppet适用于服务器管理的整个过程,比如初始安装、配置、更新以及系统下线。
2、SaltStack :
SaltStack 与Puppet均是C/S模式,需安装服务端与客户端,基于Python编写,加入MQ消息同步,可以使执行命令和执行结果高效返回,但其执行过程需等待客户端全部返回,如果客户端未及时返回或未响应的话,可能会导致部分机器没有执行结果。
3、Ansible :
Ansible与SaltStack均是基于Python语言开发,Ansible只需要在一台普通的服务器上运行即可,不需要在客户端上安装客户端。因为Ansible是基于SSH远程管理,而Linux 服务器大都离不开SSH,所以Ansible 不需要为配置工作添加额外的支持。
Ansible安装使用非常简单,而且基于上千个插件和模块,实现各种软件、平台、版本的管理,支持虚拟窗口多层级的部署。相对于SaltStack来说执行效率要慢一些,不是软件本身慢。是由于SSH服务慢,可以优化SSH连接速度及使用Ansible加速模块以满足成千上万台服务器的维护和管理。
 
二、Ansible 运维工具原理
Ansible是一款极为灵活的开源工具套件,能够大大简化UNIX管理员的自动化配置管理与流程控制方式。它利用推送方式对客户系统加以配置,这样所有的工作都可在主服务器端完成。其命令行机制同样非常强大,允许大家利用商业许可WebUI实现授权管理与配置,可以通过命令行或者GUI来使用Ansible 。运行Ansible 的服务器俗称”管理节点“,通过Ansible进行管理的服务器俗称”受控节点“。
Ansible 自动化运维管理工具优点:
•轻量级,更新时只需要在操作机上进行一次更新即可;
• 采用SSH协议;
• 不需要客户端安装agent;
•批量任务执行可以写成脚本,而且不用分发到远程客户端;
• 使用Python编写,维护更简单;
• 支持sudo普通用户命令;
• 去中心化管理。
 
三、Ansible 管理工具安装配置
Ansible可以工作在Linux、BSD、Mac OS X等平台,对Python环境版本最低要求为Python 2.6以上。
1、安装        
# yum inistall ansible-y
2、配置
Ansible工具默认主目录为/etc/ansible/,其中:
• hosts文件为管理机IP或者主机名列表;
•ansible.cfg为ansible主配置文件;
•roles为角色或者插件路径,默认该目录为空。
Ansible远程批量管理,其中执行命令是通过Ad-Hoc来完成,也即点对点执行命令,能够快速执行,而且不需要保存执行的命令。
默认hosts文件配置主机列表,可以配置分组,可以定义各种IP及规则。
Ansible基于多模块管理,常用的Ansible工具管理模块包括:command、shell、script、yum、copy、file、async、docker、cron、msyql_user、ping、sysctl、user、acl、add_host、easy_install、haproxy等。
各种模块使用方法可以使用:#ansible-docmodules_name
3、Ansible 工具参数详解:
Ansible自动化运维工具管理客户端案例操作,由于Ansible 管理远程服务器基于SSH,在登录远程服务器执行命令时需要远程服务器的用户名和密码,也可以加入-k参数手动输入密码或者基于ssh-keygen生成密钥。
Ansible 自动化批量管理工具主要参数:
•-v,-verbose                打印详细模式
• -iPATH,-inventory=PATH        指定host文件路径
• -fNUM,-forks=NUM                指定fork开户同步进行的个数,默认为5
• -mNAME,-module-anme=NAME        指定module名称,默认模块为command
• -aMODULE_ARGS        module模块的参数或者命令
•-k,-ask-pass                输入远程被管理端密码
•-sudo                        基于sudo用户执行
•-K,-ask-sudo-pass        提示输入sudo密码与sudo一起使用
• -uUSERNAME,-user=USERNAME        指定执行用户
•-C,--check                测试执行过程,不改变真实内容,相当于预演
• -TTIMEOUT                执行命令超时时间,默认为10s
•--version                查看Ansible软件版本信息
 
四、Ansible 模块实战
1、Ansible ping 模块实战
Ansible 最基础的模块为ping模块,主要用于判断远程客户端是否在线,用于ping 本身服务器,返回值为changed、ping。
# ansible -k all -mping
135.tang.com | SUCCESS=> {
    "changed": false,
    "ping": "pong"
}
 
2、Ansible command 模块实战
Ansible command模块为Ansible 默认模块,主要用于执行Linux基础命令,可以执行远程服务器命令执行、任务执行等操作。
command 模块使用详解:
•Chdir                执行命令前,切换到目录
•Creates        当该文件存在时,则不执行该步骤
•Executable        换用shell环境执行命令
•Free_form        需要执行的脚本
•Removes        当该文件不存在时,则执行该步骤
•Warn                若在ansible.cfg中存在告警,如果设定了false,不会警告此行
••••••Ansible command模块远程执行date 命令:
# ansible -i/etc/ansible/hosts all -m command -a "date"
135.tang.com | CHANGED| rc=0 >>
Mon Dec  3 16:43:19 CST 2018
••••••Ansible command模块远程执行ping命令:
# ansible all -a"ping -c 1 www.baidu.com"
135.tang.com | CHANGED| rc=0 >>
PING www.a.shifen.com (112.80.248.75) 56(84)bytes of data.
64 bytes from112.80.248.75 (112.80.248.75): icmp_seq=1 ttl=128 time=20.5 ms
••••••Ansible hosts正则模式远程执行 df -h:
# ansible *.tang.com -a"df -h"
135.tang.com | CHANGED| rc=0 >>
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/centos_tang-root   17G 2.6G   15G  15% /
devtmpfs                      2.0G     0 2.0G   0% /dev
tmpfs                         2.0G     0 2.0G   0% /dev/shm
tmpfs                         2.0G   12M 2.0G   1% /run
tmpfs                         2.0G     0 2.0G   0% /sys/fs/cgroup
/dev/sda1                    1014M  159M 856M  16% /boot
tmpfs                         395M     0 395M   0% /run/user/0
 
3、Ansible copy 模块实战
Ansible copy模块主要用于文件或者目录复制,支持文件、目录、权限、用户组功能。
copy 模块使用详解:
•src                Ansible端源文件或者目录,空文件夹不复制
•content        用来替代src,用于将指定文件的内容复制到远程文件内
•dest                客户端目标目录或者文件,需要绝对路径
•backup        复制之前,先备份远程节点上的原始文件
•directory_mode        用于复制文件,新建的文件会被复制,而老旧的不会被复制
•follow                支持link文件复制
•force                覆盖远程主机不一致的内容
•group                设定远程主机文件夹的组名
•mode                指定远程主机文件及文件夹的权限
•owner                设定远程主机文件夹的用户名
Ansible copy 模块企业常用案例:
• • • • • • Ansiblecopy模块操作,src表示源文件,dest表示目标目录或者文件。owner指定拥有者:
# ansible all -m copy-a 'src=/etc/passwd dest=/tmp mode=755 owner=root'
• • • • • • Ansiblecopy模块操作,content表示文件内容,dest表示目标文件,owner指定拥有者:
# ansible all -m copy-a 'content="Hello World" dest=/tmp/test.txt mode=755 owner=root'
• • • • • • Ansiblecopy模块操作,content表示文件内容,dest表示目标文件,owner指定拥有者,bakcup=yes开记备份:
# ansible all -m copy-a 'content="Hello World" dest=/tmp/test.txt mode=755 owner=rootbackup=yes'
 
4、Ansible yum 模块实战
AnsibleYUM模块主要用于软件的安装、升级、卸载,支持红帽rpm软件的管理。
YUM模块使用详解:
•conf_file                设定远程YUM执行时所依赖的YUM配置文件
•disable_gpg_check        安装软件包之前是否检查gpg key
•name                        需要安装的软件名称,支持软件组安装
•update_cache                安装软件前更新缓存
•enablerepo                指定repo源名称
•skip_broken                跳过异常软件节点
•state                        软件包状态,包括installed、present、latest、absent、removed。
Ansible YUM模块常用案例:
• • • • • • AnsibleYUM模块操作,name 表示需要安装的软件名称,state表示状态,state=installed 表示安装软件:
# ansible all -m yum -a'name=sysstat,screen state=installed'
• • • • • • AnsibleYUM模块操作name 表示需要安装的软件名称,state表示状态,state=absent 表示安装软件:
# ansible all -m yum -a'name=sysstat,screen state=absent'
• • • • • • AnsibleYUM模块操作,name 安装的软件名称,state状态,state=installed 安装软件,disable_gpg_check=no不检查key:
# ansible all -m yum -a'name=sysstat,screen state=installed disable_gpg_check=no'
 
5、Ansible file 模块实战
Ansible file模块主要用于对文件创建、删除、修改、权限、属性的维护和管理。
file 模块使用详解:
•src                Ansible端源文件或者目录
•follow                支持link文件复制
•force                覆盖远程主机不一致的内容
•group                设定远程主机文件夹的组名
•mode                指定远程主机文件及文件夹的权限
•owner                设定远程主机文件及文件夹的用户名
•path                目标路径,也可以用dest,name代替
•state                状态包括file、link、directory、hard、touch、absent
•attributes        文件或者目录特殊属性
Ansible file模块企业常用案例:
• • • • • • Ansiblefile模块操作,path表示目录的名称和路径,state=directory表示创建目录:
# ansible *.tang.com -mfile -a "path=/tmp/`date +%F` state=directory mode=755"
• • • • • • Ansiblefile模块操作,path表示目录的名称和路径,state=touch 表示创建文件:
# ansible *.tang.com -mfile -a "path=/tmp/tang.txt state=touch mode=755"
 
6、Ansible user 模块实战
Ansible user模块主要用于操作系统用户、组、权限、密码等操作。
user 模块使用详解:
•system        默认创建为普通用户,为yes则创建系统用户
•append        添加一个新的组
•comment        新增描述信息
•createhome        给用户创建家目录
•force                强制删除用户
•group                创建用户主组
•groups        将用户加入组或者附属组添加
•home                指定用户的家目录
•name                表示状态,是否create、remove、modify
•password        指定用户的密码,此处为加密密码
•remove        删除用户
•shell                设置用户的shell登录环境
•uid                设置用户ID
•update_password        修改用户密码
•state                用户状态,默认为present,表示新建用户
Ansible user 模块常用案例:
• • • • • • Ansibleuser 模块操作,name 表示用户名称,home表示其家目录:
# ansible *.tang.com -muser -a "name=tang home=/tmp/"
• • • • • • Ansibleuser 模块操作,name 表示用户名称,home表示其家目录并且指定其shell:
# ansible *.tang.com -muser -a "name=tang home=/tmp/ shell=/sbin/nologin"
• • • • • • Ansibleuser 模块操作,name 表示用户名称,state=absent表示删除用户:
# ansible *.tang.com -muser -a "name=tang state=absent force=yes"
 
7、Ansible cron 模块实战
Ansible cron模块主要用于添加、删除、更新操作系统crontab任务计划。
cron模块使用详解:
•name                任务计划名称
•cron_file        替换客户端该用户的任务计划的文件
•minute        分(0-59,*,*/2)
•hour                时(0-23,*,*/2)
•day                日(1-31,*,*/2)
•month        月(1-12,*,*/2)
•weekday        周(0-6或1-7,*)
•job                任何计划执行的命令,state要等于present
•backup        是否备份之前的任务计划
•user                新建任务计划的用户
•state                指定任务计划present、absent
Ansible cron 模块常用案例:
• • • • • • Ansiblecron 模块操作,基于cron模块,创建crontab任务计划:
# ansible all -m cron-a "minute=0 hour=0 day=* month=* weekday=* name='Ntpdate server for synctime' job='/usr/sbin/ntpdate 139.224.227.121'"
• • • • • • Ansiblecron 模块操作,基于cron模块,备份crontab任务计划,backup=yes 表示开启备份,备份文件存放于客户端/tmp/:
# ansible all -m cron-a "minute=0 hour=0 day=* month=* weekday=* name='Ntpdate server for synctime' backup=yes job='/usr/sbin/ntpdate pool.ntp.org'"
• • • • • • Ansiblecron 模块操作,基于cron模块,删除crontab任务计划:
# ansible all -m cron-a "name='Ntpdate server for sync time' state=sbsent"
 
8、Ansible synchronize 模块实战
Ansible synchronize模块主要用于目录、文件同步,主要基于rsync命令工具同步目录和文件。
synchronize 模块使用详解:
•compress        开启压缩,默认为开启
•archive        是否采用归档模式同步,保证源和目标文件属性一致
•checksum        是否校验
•dirs                以非递归的方式传输目录
•links                同步链接文件
•recursive        是否递归 yes/no
•rsync_opts        使用rsync的参数
•copy_links        同步的时候是否复制链接
•delete                删除源中没有而目标存在的文件
•src                源目录及文件
•dest                目标目录及文件
•dest_port        目标接受的端口
•rsync_path        服务的路径,指定rsync命令来在远程服务器上运行
•rsync_timeout        指定rsync操作的IP超时时间
•set_remote_user        设置远程用户名
•--exclude=.log                忽略同步.log结尾的文件
•mode                同步的模式,rsync同步的方式push、pull,默认都是推送push
Ansible synchronize模块常用案例:
• • • • • • Ansiblesynchronize 模块操作,src为源目录,dest为目标目录:
# ansible all -msynchronize -a 'src=/tmp/ dest=/tmp/'
• • • • • • Ansiblesynchronize模块操作,src为源目录,dest为目标目录、compress=yes表示开户压缩,delete=yes表示数据一致,rsync_opts为同步参数,--exclude表示排除文件:
# ansible all -msynchronize -a 'src=/tmp/ dest=/tmp/ compress=yes delete=yesrsync_opts=--no-motd,--exclude=.txt'
 
9、Ansible shell 模块实战
Ansibleshell模块主要用于远程客户端上执行各种shell命令或者运行脚本,远程执行命令通过/bin/sh 环境来执行,支持比command更多的指令。
shell模块使用详解:
•Chdir                执行命令前,切换到目录
•Creates        当该文件存在时,则不执行该步骤
•Executable        换用shell环境执行命令
•Free_form        需要执行的脚本
•Removes        当该文件不存时,则不执行该步骤
•Warn                如果在ansible.cfg中存在告警,如果设定了False,不会警告此行
Ansible shell 模块常用案例:
• • • • • • Ansibleshell 模块操作,-m shell 指定模块为shell,远程执行shell脚本,远程执行脚本也可采用script模块。并把执行结果追加至客户端服务器/tmp/var.log文件:
# ansible all -m shell-a "/bin/sh /tmp/variables.sh >> /tmp/var.log"
• • • • • • Ansibleshell 模块操作,远程执行创建目录命令,执行之前切换在/tmp目录,屏蔽警告信息:
# ansible all -m shell-a "mkdir -p `date +%F chdir=/tmp/ warn=no`"
• • • • • • Ansibleshell 模块操作,-m shell 指定模块为shell,远程客户端查看http进程是否启动:
# ansible all -m shell-a "ps -ef |grep http"
• • • • • • Ansibleshell 模块操作,-m shell 指定模块为shell,远程客户端查看crontab任务计划:
# ansible all -m shell-a "crontab -l"
 
10、Ansible service 模块实战
Ansible service模块主要用于远程客户端各种服务管理,包括启动、停止、重启、重新加载等。
service 模块使用详解:
•enabled        是否开机启动服务
•name                服务名称
•runlevel        服务启动级别
•arguments        服务命令行参数传递
•state                服务操作状态,状态包括satarted、stopped、restarted、reloaded

Ansible service 模块常用案例:
• • • • • • Ansibleservice 模块操作,远程重启httpd服务:
# ansible all -mservice -a "name=httpd state=restarted"
• • • • • • Ansibleservice 模块操作,远程重启网卡服务,指定参数eth0:
# ansible all -mservice -a "name=network args=eth0 state=restarted"
• • • • • • Ansibleservice 模块操作,远程开机启动nfs服务,设置3,5级别自动启动:
# ansible all -mservice -a "name=nfs enabled=yes runlevel=3,5"
 
五、Ansible PlayBook
playbooks是一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。
1、YAML语言特性:
• 可读性强;
• 和脚本语言的交互性好;
• 使用实现语言的数据类型;
• 一致的信息模型;
• 易于实现;
• 可以基于流来处理;
• 可扩展性强。
2、PlayBook组件包括内容:
•target                定义PlayBook的远程主机组
•variable        定义PlayBook使用的变量
•task                定义远程主机上执行的任务列表
•handler        定义task执行完成以后需要调用的任务,例如配置文件被改动,刚启动handler任务重启相关联的服务
3、target 常用参数详解:
•hosts                定义远程主机组
•user                执行该任务的用户
•sudo                设置为yes的时候,执行任务的时候使用root权限
•sudo_user        指定sudo普通用户
•connection        默认基于SSH连接客户端
•gather_facks        获取远程主机facks基础信息
4、variable 常用参数详解:
vars                定义格式,变量名:变量值
vars_files        指定变量文件
vars_prompt        用户交互模式自定义变量
setup                模块取远程主机的值
5、task 常用参数详解:
name                任务显示名称也即屏幕显示信息
action                定义执行的动作
copy                复制本地文件到远程主机
template        复制要地文件到远程主机,可以引用本地变量
service                定义服务的状态
Ansible PlayBook 案例演示:
• • • • • • 远程主机安装Nginx Web 服务,PlayBook yaml文件代码如下:
# vimnginx_install.yaml
- hosts: all
  remote_user: root
  tasks:
  - name: install pcre zlib
     yum: name=pcre-devel,pcre,zlib-develstate=installed
  - name: install nginx
    shell: cd /tmp;rm -rfnginx-1.12.0.tar.gz;wget http://nginx.org/download/nginx-1.12.0.tar.gz;tar xzf nginx-1.12.0.tar.gz;cd nginx-1.12.0;./configure--prefix=/usr/local/nginx;make;make install
# ansible-playbooknginx_install.yaml
• • • • • • 检测远程主机Nginx目录是否存在,不存在则安装Nginx Web服务,安装完并启动Nginx,PlayBook yaml文件代码如下:
# vim nginx.yaml
- hosts: all
  remote_user: root
  tasks:
    - name: Nginx server install 2018
      file: path=/usr/local/nginx/state=directory
      notify:
        - nginx install
        - nginx start
  handlers:
    - name: nginx install
      shell: cd /tmp;rm -rfnginx-1.12.0.tar.gz;wget http://nginx.org/download/nginx-1.12.0.tar.gz;tar xzf nginx-1.12.0.tar.gz;cd nginx-1.12.0;./configure--prefix=/usr/local/nginx;make;make install
    - name: nginx start
      shell: /usr/local/nginx/sbin/nginx
# ansible-playbooknginx.yaml
• • • • • •检测远程主机内核参数配置文件是否更新,如果更新则执行命令sysctl -p 使内核参数生效:
# vim sysctl.yaml
- hosts: all
  remote_user: root
  tasks:
    - name: linux kernel concfig
      copy: src=/data/sh/sysctl.conf dest=/etc/
      notify:
        - source sysctl
  handlers:
    -name: source sysctl
      shell: sysctl -p
# ansible-playbooksysctl.yaml
• • • • • •基于列表items多个值创建用户,通过{{ }}定义列表变量,with_items选项传入变量的值:
# vim user.yaml
- hosts: all
  remote_user: root
  tasks:
    - name: linux system add user list
      user: name={{item}} state=present
      with_items:
        - tang1
        - tang2
        - tang3
        - tang4
# ansible-playbookuser.yaml
• • • • • • AnsiblePlayBook可以定义template模板文件,模板文件主要用于服务器需求不一致、需要独立定义的情况。例如两台服务器安装了nginx,安装完毕之后将服务器A的HTTP端口改成80,服务器B的HTTP端口改成81,基于tempalte模块可以轻松实现,方法步骤如下:
• Ansible hosts文件指定不同服务器不同httpd_port端口:
[web]
192.168.10.9httpd_port=80
192.168.10.10httpd_port=81
• Ansible 创建nginx.confjinja2模板文件,cp nginx.conf nginx.conf.j2,并修改listen 80为listen{{httpd_port}},Nginx基本配置项不变:
cp nginx.confnginx.conf.j2
listen {{httpd_port}};
• AnsiblePlayBook剧本yaml文件创建:
# vimnginx_template.yaml
- hosts: all
  remote_user: root
  tasks:
    - name: Nginx server install 2018
      file: path=/usr/local/nginx/state=directory
      notify:
        - nginx install
        - nginx config
  handlers:
    - name: nginx install
      shell: cd /tmp;rm -rfnginx-1.12.0.tar.gz;wget http://nginx.org/download/nginx-1.12.0.tar.gz;tar xzf nginx-1.12.0.tar.gz;cd nginx-1.12.0;./configure--prefix=/usr/local/nginx;make;make install
    - name: nginx config
      template: src=/data/sh/nginx.conf.j2dest=/usr/local/nginx/conf/nginx.conf
# ansible-playbooknginx_template.yaml
 
六、Ansible 配置文件详解
Ansible默认配置文件为/etc/ansible/ansible.cfg,配置文件中可以对Ansible进行各项参数的调整,包括并发线程、用户、模块路径、配置优化等。
ansible.cfg常用参数详解:
[defaults]                                                 ##通用默认配置
inventory =/etc/ansible/hosts                    ##被控制端IP或者DNS列表
library  = /usr/share/my_modules/                    ##默认搜寻模块的位置
remote_tmp =~/.ansible/tmp                           ##远程执行临时文件
local_tmp =~/.ansible/tmp
plugin_filters_cfg =/etc/ansible/plugin_filters.yml
forks = 5                                             ##并行线程数
poll_interval = 15                                    ##回频率或轮询间隔时间
sudo_user = root                                      ##sudo远程执行用户名
ask_sudo_pass =True                               ##使用sudo,是否需要输入密码
ask_pass = True                                       ##是否需要输入密码
transport = smart                                     ##通信机制
remote_port = 22                                        ##远程SSH端口
module_lang = C                                         ##模块和系统之间通信的语言
module_set_locale =False
gathering =implicit                               ##控制默认facts收集(远程系统变量)
gather_subset = all
gather_timeout = 10
roles_path  = /etc/ansible/roles                     ##使用playbook搜索Ansibleroles
host_key_checking =False                              ##是否检查远程主机密钥
sudo_exe = sudo                                        ##sudo远程执行命令
sudo_flags = -H -S-n                              ##传递sudo之外的参数
timeout = 10                                           ##SSH超时时间
remote_user = root                                     ##远程登录用户名
log_path =/var/log/ansible.log                    ##日志文件存放路径
module_name =command                              ##Ansible命令默认执行的模块
executable =/bin/sh                               ##执行的shell环境,用户shell模块
hash_behaviour =replace                           ##特定的优先级覆盖变量
jinja2_extensions =jinja2.ext.do,jinja2.ext.i18           ##允许开启jinja2扩展模块
private_key_file =/path/to/file                           ##私钥文件存储位置
display_skipped_hosts =True                       ##显示跳过任何任务的状态
system_warnings =True                             ##禁用系统运行Ansible潜在问题警告
deprecation_warnings =True                            ##PlayBook输出禁用“不建议使用”警告
command_warnings =False                           ##command模块Ansible默认发出警告
nocolor = 1                                        ##输出带上颜色区别,0表示开启,1表示关闭
pipelining = False                                     ##开启pipeSSH通道优化
 
[accelerate]                                       ##accelerate缓存加速
accelerate_port =5099                             ##加速连接端口5099
accelerate_timeout =30                            ##命令执行超过时间,单位为s
accelerate_connect_timeout= 5.0                   ##上一个活动连接的时间,单位为min
accelerate_daemon_timeout= 30                     ##允许多个私钥被加载到daemon
accelerate_multi_key =yes                             ##任何客户端想要连接daemon都要开启这个选项
 
七、Ansible 命令参数详解
ansible 命令参数详解:
Options:
  -a MODULE_ARGS, --args=MODULE_ARGS   模块的参数,如果执行默认COMMAND的模块,即是命令参数,如:“date”,"pwd"等等
                        module arguments    模块参数
  -k, --ask-pass        ask for SSH password  登录密码,提示输入SSH密码而不是假设基于密钥的验证
  --ask-su-pass         ask for su password    su切换密码
  -K, --ask-sudo-pass   ask for sudo password  提示密码使用sudo,sudo表示提权操作
  --ask-vault-pass      ask for vault password
  -B SECONDS, --background=SECONDS     后台运行超时时间
                        run asynchronously,failing after X seconds
                        (default=N/A)
  -C, --check           don't make any changes; instead, tryto predict some   只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化
                        of the changes that mayoccur
  -c CONNECTION, --connection=CONNECTION  连接类型使用。可能的选项是paramiko(SSH),SSH和地方。当地主要是用于crontab或启动。
                        connection type to use(default=smart)
  -f FORKS, --forks=FORKS   并行任务数。NUM被指定为一个整数,默认是5
                        specify number ofparallel processes to use
                        (default=5)
  -h, --help            show this help message andexit   打开帮助文档API
  -i INVENTORY, --inventory-file=INVENTORY    指定库存主机文件的路径,默认为/etc/ansible/hosts
                        specify inventory hostfile
                       (default=/etc/ansible/hosts)
  -l SUBSET, --limit=SUBSET    进一步限制所选主机/组模式  --limit=192.168.91.135 只对这个ip执行
                        further limit selectedhosts to an additional pattern
  --list-hosts          outputs a list of matching hosts;does not execute
                        anything else
  -m MODULE_NAME,--module-name=MODULE_NAME   执行模块的名字,默认使用command 模块,所以如果是只执行单一命令可以不用 -m参数
                        module name to execute(default=command)
  -M MODULE_PATH,--module-path=MODULE_PATH   要执行的模块的路径,默认为/usr/share/ansible/
                        specify path(s) tomodule library
                       (default=/usr/share/ansible/)
  -o, --one-line        condense output      压缩输出,摘要输出.尝试一切都在一行上输出。
  -P POLL_INTERVAL, --poll=POLL_INTERVAL    调查背景工作每隔数秒。需要- b
                        set the poll intervalif using -B (default=15)
  --private-key=PRIVATE_KEY_FILE    私钥路径,使用这个文件来验证连接
                        use this file toauthenticate the connection
  -S, --su              run operations with su    用 su 命令
  -R SU_USER, --su-user=SU_USER      指定SU的用户,默认是root用户
                        run operations with suas this user (default=root)
  -s, --sudo            run operations with sudo(nopasswd)   
  -U SUDO_USER, --sudo-user=SUDO_USER    sudo到哪个用户,默认为 root 
                        desired sudo user(default=root)
  -T TIMEOUT, --timeout=TIMEOUT    指定SSH默认超时时间,  默认是10S
                        override the SSHtimeout in seconds (default=10)
  -t TREE, --tree=TREE  log output to this directory     将日志内容保存在该输出目录,结果保存在一个文件中在每台主机上。
  -u REMOTE_USER, --user=REMOTE_USER    远程用户, 默认是root用户
                        connect as this user(default=root)
 --vault-password-file=VAULT_PASSWORD_FILE 
                        vault password file
  -v, --verbose         verbose mode (-vvv for more, -vvvv toenable    详细信息
                        connection debugging)
  --version             show program's version number andexit   输出ansible的版本
 
ansible-doc 命令参数详解:
Options:
  --version             show program's version number andexit    显示ansible-doc的版本号
  -h, --help            show this help message andexit  显示命令参数API文档
  -M MODULE_PATH,--module-path=MODULE_PATH  查询模块,--module-path=MODULE_PATH 指定模块的路径
                        Ansible modules/directory
  -l, --list            List available modules   显示已存在的所有模块列表
  -s, --snippet         Show playbook snippet for specifiedmodule(s)   显示playbook制定模块的用法
  -v                    Show version number andexit   显示ansible-doc的版本号
 
八、Ansible 性能调优
Ansible企业实战环境中,如果管理的服务器越来越多,Ansibe执行效率会变得比较慢,可以通过优化Ansible提供工作效率,由于Ansible基于SSH协议通信,SSH连接慢会导致整个基于Ansible执行变得缓慢,也需要对Openssh进行优化,具体优化的方法如下:
1、关闭Ansible的SSH密钥检测
ansible默认是以ssh来实现远程推送执行的,是基于ssh秘钥检测,会检测远程主机的公钥,并记录在本地中known_host文件中,下次访问主机时,会核对公钥,如果公钥不同,openssh会发出警告,如果相同,会提示输入密码
SSH对主机的public_key的检查等级是根据StrictHostKeyChecking变量来设定的,StrictHostKeyChecking检查级别包括:no(不检查)、ask(询问)、yes(每次都检查)、False(关闭检查)。
# vim  /etc/ansible/ansible.cfg
host_key_checking =False    #关闭StrictHostKeyChecking检查
2、Openssh链接优化
使用OpenSSH服务时,默认服务器端配置文件UseDNS=YES状态,该选项会导致服务器根据客户端的IP地址进行DNSPTR反向解析,得到客户端的主机名,然后根据获取到的主机名进行DNS正向A记录查询,并验证该IP是否与原始IP一致。关闭DNS解析代码如下:
# sed  -i '/^GSSAPI/s/yes/no/g;/UseDNS/d;/Protocol/aUseDNS no'/etc/ssh/sshd_config
3、SSHpipelining加速Ansible
SSH pipelining是一个加速Ansible 执行速度的简单方法,SSH pipelining 默认是关闭的,关闭是为了兼容不同的 sudo 配置,主要是requiretty 选项。
如果不使用Sudo建议开启该选项,打开此选项可以减少Ansible执行没有文件传输时,SSH在被控机器上执行任务的连接数。使用Sudo操作的时候,必须在所有被管理的主机上将配置文件/etc/sudoers中requiretty选项禁用。
# sed    -i   '/^pipelining/s/False/True/g'   /etc/ansible/ansible.cf
4、Ansible Facts缓存优化
Ansible-playbook在执行过程中,默认会执行Gatherfacts,如果不需要获取客户端的fact数据的话,可以关闭获取fact数据功能,关闭之后可以加快ansible-playbook的执行效率。如需关闭fact功能,在playbookyaml文件中加入如下代码即可:
gather_facts:nogather_facts: no
5、Ansiblefacts组件主要用于收集客户端设备的基础静态信息,这些信息可以在做配置管理的时候方便引用。Facts信息直接当做AnsiblePlaybook变量信息进行引用,通过定制facts以便收集我们想要的信息,同时可以通过Facter和Ohai来拓展facts信息,也可以将facts信息存入Redis缓存中,如下为Facts使用Redis缓存的步骤:
• • 部署Redis服务
# wget      http://download.redis.io/releases/redis-2.8.13.tar.gz
# tar    zxf    redis-2.8.13.tar.gz
# cd     redis-2.8.13
# make     PREFIX=/usr/local/redis  install
# cp       redis.conf     /usr/local/redis/
# exportPATH=/usr/local/redis/bin:$PATH   #将/usr/local/redis/bin/目录加入至环境变量配置文件/etc/profile末尾,然后Shell终端执行source/etc/profile让环境变量生效。
# nohup/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf  &
• • 安装Python Redis模块
easy_install pip
pip install redis
• • Ansible整合Redis配置
在配置文件/etc/ansible/ansible.cfg中defaluts段中加入代码,如果redis密码为admin,则开启admin密码行:
gathering = smart
fact_caching = redis
fact_caching_timeout =86400
fact_caching_connection= localhost:6379
#fact_caching_connection= localhost:6379:0:admin
• • 测试
Ansible-playbook执行nginx_wget.yaml剧本文件,测试Redis缓存
# ansible-playbook    nginx_wget.yaml
检查Redis服务器,factskey已存入Redisk中:
#redis-cli                >KEYS*        查看存入缓存的KEYS信息
6、ControlPersist SSH 优化
ControlPersist特性需要高版本的SSH支持,CentOS 6默认是不支持的,如果需要使用,需要自行升级OpenSSH。
ControlPersist即持久化的socket,一次验证多次通信。并且只需要修改SSH客户端配置,也即Asible被管理的主机。可使用YUM或者源码编译升级OpenSSH服务,升级完毕ControlPersist的设置办法如下,在其用户的家目录创建config文件,如果Ansible以root用户登录客户端,只需要在客户端的/root/.shh/config目录在添加如下代码即可:
Host *
    Compression yes
    ServerAliveInterval 60
    ServerAliveCountMax 5
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h-%p
    ControlPersist 4h
开启ControlPersist特性后,SSH在建立sockets后,节省了每次验证和创建的时间,对Ansible 执行速度提升是非常明显的。