简介

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

  • 概述
    • 基于python语言开发的自动化软件
    • 基于SSH远程管理鼓舞实现远程主机批量管理
  • 意义
    • 提高工作效率
    • 提高工作准确度
    • 减少维护的成本
    • 减少重复性工作
  • 功能
    • 可以实现批量系统操作配置
    • 可以实现批量软件服务部署
    • 可以实现批量文件数据分发
    • 可以实现批量系统信息收集
  • 特点
    • 管理端不需要启动服务程序(no server)
    • 管理端不需要编写配置文件(/etc/ansible/ansible.cfg)
    • 受控端不需要安装软件程序(libselinux-python)
    • 受控端不需要启动服务程序(no agent)
    • 服务程序管理模块多(module)
    • 利用剧本编写来实现自动化

      基本组件

      image.png
  1. ansible:核心程序
  2. Modules:包括ansible自带的核心模块以及自定义模块
  3. Plugins:完成模块功能的补充,包括连接插件、邮箱插件
  4. Playbooks:剧本;定义Ansible多任务配置文件,由Ansible自动执行
  5. Inventory:定义Ansible管理主机的清单
  6. Connection Plugins:负责和被监控端实现通信

    特点

  7. 不需要在被管控主机上安装任何客户端

  8. 无服务器端,使用时直接运行命令即可
  9. 基于模块工作,可使用任意语言开发模块
  10. 使用yaml语言定制剧本playbook
  11. 基于SSH工作
  12. 可实现多级指挥
  13. 幂等性:一种操作重复多次结果相同

    安装和配置

  • pip安装
  • 二进制安装
  • yum安装

    常用命令集

  1. [root@node1 ~]# rpm ql ansible | grep bin
  2. /usr/bin/ansible
  3. /usr/bin/ansibleconfig
  4. /usr/bin/ansibleconnection
  5. /usr/bin/ansibleconsole
  6. /usr/bin/ansibledoc
  7. /usr/bin/ansiblegalaxy
  8. /usr/bin/ansibleinventory
  9. /usr/bin/ansibleplaybook
  10. /usr/bin/ansiblepull
  11. /usr/bin/ansiblevault
  12. [root@node1 ~]# rpm ql ansible | grep etc
  13. /etc/ansible
  14. /etc/ansible/ansible.cfg
  15. /etc/ansible/hosts
  16. /etc/ansible/roles
  • ansible:临时命令执行工具,常用于临时命令的执行
  • ansible-doc:Ansible模块功能查看工具
  • ansible-playbook:Ansible定制自动化的任务集编排工具
  • ansible.cfg:主配置文件
  • hosts:主机清单
  • roles:角色目录

    主配置文件

  1. [defaults]
  2. # some basic default values...
  3. #inventory = /etc/ansible/hosts 主机列表配置文件
  4. #library = /usr/share/my_modules/ 库文件存放位置
  5. #module_utils = /usr/share/my_module_utils/
  6. #remote_tmp = ~/.ansible/tmp 生成的临时py命令文件存放在远程主机的目录
  7. #local_tmp = ~/.ansible/tmp 本机的临时命令执行目录
  8. #forks = 5 默认的并发数
  9. #poll_interval = 15 默认的线程池
  10. #sudo_user = root 默认sudo用户
  11. #ask_sudo_pass = True
  12. #ask_pass = True
  13. #transport = smart
  14. #remote_port = 22
  15. #module_lang = C
  16. #module_set_locale = False
  17. 主机清单的定义方式:
  18. 1.直接指明主机地址或主机名
  19. 2.定义一个主机组,调用的时候指定该组即可
  20. 一般情况下我们的主配置文件保持默认即可。

基于ssh免密登录

  • 登录方
    • 生成一对公钥私钥文件
    • 将公钥文件发送给被登录方(私钥加密,公钥解密)
      • ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.80.20 # 方式一
      • 将公钥文件内容写到被登录方的/root/.ssh/authorized_keys文件中。
  • 被登录方

    ansible参数说明

  • -a MODULE_ARGS:指定模块的参数

  • -m MODULE_NAME:指定模块
  • -C:坚持执行结果
  • -e EXTRA_VARS:指明变量名
  • -f FORKS:指定并发进程数
  • -i INVENTORY:指定主机清单文件
  • —syntax-check:检查执行命令是否存在语法错误

    ansible执行过程

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

    常用模块

  • ansible的执行状态
    • 绿色:执行成功并且不需要做改变的操作
    • 黄色:执行成功并且对目标主机做变更
    • 红色:执行失败
    • 粉色:警告信息
    • 蓝色:显示ansible命令执行的过程
  1. ping 模块:主机连通性测试
  2. user 模块

    [root@node1 ~]# ansible‐doc ‐s user
    comment    # 用户的描述信息 
    createhom  # 是否创建家目录
    force      # 在使用`state=absent'是, 行为与`userdel ‐‐force'一致.  
    group      # 指定基本组  
    groups     # 指定附加组,如果指定为('groups=')表示删除所有组  
    home       # 指定用户家目录 
    name=           # 指定用户名
    password        # 指定用户密码 
    remove          # 在使用 `state=absent'时, 行为是与 `userdel ‐‐remove'一致.
    shell           # 指定默认shell 
    state           #设置帐号状态,不指定为创建,指定值为absent表示删除
    system          # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
    uid             #指定用户的uid     
    update_password  # 更新用户密码
    expires         #指明密码的过期时间
    
    1.添加系统用户,指定uid、家目录、主组及注释
    ansible -m user -a "system name=zhangsan home=/home/zhangsan uid=111 group=zhangsan comment='hello zhangsan'" nodes
    2.删除用户及家目录
    ansible -m user -a "name=zhangsan state=absent remove=yes"
    
  3. group

[root@node1 ~]# ansible‐doc ‐s group  
‐ name: 添加或删除组    
action: group      
gid       # 设置组的GID号      
name=     # 管理组的名称      
state     # 指定组状态,默认为创建,设置值为absent为删除      
system    # 设置值为yes,表示为创建系统组
ansible -m group -a "name=eagles gid=111 system=yes" nodes
ansible -m group -a "name=eagles gid=111 state=absent" nodes
  1. command
1.默认使用的模块  
2.不支持管道,变量及重定向等  
[root@node1 ~]# ansible‐doc ‐s command  ‐ name: Executes a command on a remote node
  1. shell
1.调用bash执行命令  
2.但是某些复杂的操作即使使用shell也可能会失败      
解决方法:将操作写到脚本中,通过script模块
  1. script
free_form参数 :必须参数,指定需要执行的脚本,脚本位于 ansible 管理主机本地,并没有具体的一个参数名叫 free_form,具体解释请参考 command 模块。
chdir参数 : 此参数的作用就是指定一个远程主机中的目录,在执行对应的脚本之前,会先进入到 chdir 参数指定的目录中。
creates参数 :使用此参数指定一个远程主机中的文件,当指定的文件存在时,就不执行对应脚本,可参考 command 模块中的解释。
removes参数 :使用此参数指定一个远程主机中的文件,当指定的文件不存在时,就不执行对应脚本,可参考 command 模块中的解释。
  1. copy
[root@node1 ~]# ansible‐doc ‐s copy  
‐ name: Copies files to remote locations    
        copy:      
            backup:在覆盖之前,将源文件备份,备份文件包含时间信息。      
        content:用于替代“src”,可以直接设定指定文件的值      
        dest:必选项。要将源文件复制到的远程主机的绝对路径      
        directory_mode:递归设定目录的权限,默认为系统默认权限      
        force:强制覆盖目的文件内容,默认为yes      
        others:所有的file模块里的选项都可以在这里使用      
        src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归 复制
      ansible -m copy -a "src=/本地文件 dest=/远程文件" nodes

image.png
image.png

  1. file
[root@node1 ~]# ansible‐doc ‐s file  
‐ name: Sets attributes of files    
    file:      
      force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软 链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no      
    group:定义文件/目录的属组      
    mode:定义文件/目录的权限      
    owner:定义文件/目录的属主      
    path:必选项,定义文件/目录的路径      
    recurse:递归设置文件的属性,只对目录有效      
    src:被链接的源文件路径,只应用于state=link的情况      
    dest:被链接到的路径,只应用于state=link的情况      
  state:         
    directory:如果目录不存在,就创建目录         
    file:即使文件不存在,也不会被创建         
    link:创建软链接         
    hard:创建硬链接         
    touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其后修改时间
ansible -m file -a "path=/需要创建的文件 owner=root group=root mode=777" nodes

image.png

  1. cron
  2. yum
[root@node1 ~]# ansible‐doc ‐s yum  
‐ name: Manages packages with the yum package manager    
    yum:      
      conf_file         #设定远程yum安装时所依赖的配置文件。如配置文件没有在默认的位置。      
    disable_gpg_check    #是否禁止GPG checking,只用于`present' or `latest'。 
    disablerepo   #临时禁止使用yum库。 只用于安装或更新时。      
    enablerepo    #临时使用的yum库。只用于安装或更新时。      
    name=            #所安装的包的名称      
    state               #present安装, latest安装新的, absent 卸载软件。      
    update_cache  #强制更新yum的缓存
ansible -m yum -a "name=httpd state=latest" nodes
  1. service
[root@node1 ~]# ansible‐doc service  
> SERVICE    (/usr/lib/python2.7/site‐packages/ansible/modules/system/service.py) 
        Controls services on remote hosts. Supported init systems include BSD init, OpenRC,  SysV, Solaris          
        SMF, systemd, upstart. For Windows targets, use the [win_service] module instead. 
  * note: This module has a corresponding action plugin.      
  arguments         #命令行提供额外的参数      
  enabled           #设置开机启动。      
  name=             #服务名称      
  runlevel          #开机启动的级别,一般不用指定。      
  sleep             #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。      
  state     #started启动服务, stopped停止服务, restarted重启服务, reloaded重载配置
ansible -m service -a "name=httpd state=started" nodes
  1. selinux
[root@node1 ~]# ansible‐doc ‐s selinux  
‐ name: Change policy and state of SELinux    
selinux:        
    conf:                  # path to the SELinux configuration file, if non‐standard        
  policy:                # name of the SELinux policy to use       
  state:                 # (required) The SELinux mode
  1. setup

ansible -m setup nodes #获取远程主机的详细信息

ansible-doc -l # 可以查询ansible具有的所有模块
https://docs.ansible.com/ansible/latest/index.html # 官方文档