ansible工具

ansible运维

ansible简介

  • 官方的title是:Ansible is Simple IT Automation 即 简单的自动化it工具
  • ansible跟其余it自动化技术的区别在于其关注点并不是是配置管理,应用部署或it流程工做流,而是提供一个统一的界面来协调全部的it自动化功能,所以ansible的系统更加易用,部署更快。
  • ansible可让用户避免编写脚本或代码来管理应用,同事还能搭建工做流实现it任务的自动化执行,it自动化能够下降技术门槛及对传统it的依赖,从而加快项目的交付速度

ansible的优缺点

  • 优势
    • 轻量级,他不须要去客户端安装agent(代理),更新是,只须要在主控机(操做机)上记性一次更新便可
    • 批量任务执行能够写成脚本,并且不用发布到远程就能够执行
    • 使用python编写,维护更简单
    • 支持sudo
  • 缺点
    • 由于不须要代理,直接基于ssh执行,因此执行效率相对较低
    • 对window备管节点须要增强

ansible架构及工做原理

  • ansible基本架构以下图所示html

    img

    • ansible core: ansible自身核心模块
    • host inventory: 主机库,定义可管控的主机列表
    • connection plugins:链接插件,通常默认基于ssh协议链接
    • modules: core modules (自带模块), custome models(自定义模块)
    • playbooks: 剧本,按照所设定编排的顺序执行完成安排任务

ansible工做原理如图

img

  1. 主控端支持local,ssh,zeromq三种方式链接被控端,默认使用基于ssh的链接--------这部分对应基本架构架构图中的链接模块;node

  2. 能够按应用类型等法师进行Host Inventory(主机群)分类,管理节点经过各种模块实现相应的操做,---单个模块,单条命令称为ad-hocpython

  3. 管理节点统一经过playbooks实现多个task的集合实现一类功能,如web服务的安装部署,数据库服务端的批量备份等,palybooks咱们能够理解为剧本,经过组合多条ad-hoc操做的配置文件c++

  4. ansible默认是经过ssh通道来管理的,也就是它所说的免客户端方式来管理,底层是经过paramiko来实现的git

  5. ansible执行过程大致过程以下图,其中暖色的表明模块化github

    img

部署安装

名称 IP 操做系统 用途
ansible-server 192.168.11.17 centos7 管理端
client-1 192.168.11.18 centos7
client-2 192.168.11.19 centos7

1. yum安装

须要先配置epel源,能帮助咱们解决软件包的依赖关系
yum install http://mirrors.163.com/centos/7.4.1708/extras/x86_64/Packages/epel-release-7-9.noarch.rpm
# epel源 并安装ansible
    ll /etc/yum.repos.d/epel*
    
# 安装
yum install ansible -y

2. 源码安装

  1. 参考博客: https://blog.51cto.com/tengxiansheng/1863688web

  2. 源码安装须要首先确保安装了git ,由于它的源码是保存在GitHub,咱们须要利用git将其clone下来而后本地编译安装shell

    安装git yum install -y git数据库

    安装ansiblecentos

    git clone https://github.com/ansible/ansible.git -recursive
    cd ./ansible
    source ./hacking/env-setup

    具体安装过程本身能够尝试哦,这里就不截图展现了。

    验证安装是否安装OK能够参考上面的ansible --version

3. pip安装

  1. 解决依赖

    yum install python-pip python-devel gcc gcc-c++ glibc-devel zlib-devel openssl-devel -y
  2. pip 安装ansible

    pip install ansibele --upgrade
    
    验证安装是否安装OK能够参考上面的ansible --version    
    
    ansible --version  查看版本

ansible配置文件

  • 两个核心文件:ansible.cfg和hosts文件,默认都存放在/etc/ansible目录下。

  • ansible.cfg:主要设置一些ansible初始化的信息,好比日志存放路径、模块、插件等配置信息
  • hosts:机器清单,进行分组管理

1. ansible.cfg文件

  • 文件配置经常使用参数

    使用化境变量方式来配置
    
    大多数的Ansible参数能够经过设置带有ANSIBLE_开头的环境变量进行配置,参数名称必须都是大写字母,以下配置:
    
    export ANSIBLE_SUDO_USER=root
    
    设置了环境变量以后,ANSIBLE_SUDO_USER就能够在playbook中直接引用。
    
    二、设置ansible.cfg配置参数
    
    Ansible有不少配置参数,下面列出经常使用的配置参数:
    
    1)inventory
    
    该参数表示资源清单inventory文件的位置,资源清单就是一些Ansible须要链接管理的主机列表
    
    inventory = /root/ansible/hosts
    
    2)library
    
    Ansible的操做动做,不管是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录
    
    library = /usr/share/ansible
    
    3)forks
    
    设置默认状况下Ansible最多能有多少个进程同时工做,默认设置最多5个进程并行处理。具体须要设置多少个,能够根据控制主机的性能和被管理节点的数量来肯定。
    
    forks = 5
    
    4)sudo_user
    
    这是设置默认执行命令的用户,也能够在playbook中从新设置这个参数
    
    sudo_user = root
    
    5)remote_port
    
    这是指定链接被关节点的管理端口,默认是22,除非设置了特殊的SSH端口,否则这个参数通常是不须要修改的
    
    remote_port = 22
    
    6)host_key_checking
    
    这是设置是否检查SSH主机的密钥。能够设置为True或False
    
    host_key_checking = False
    
    7)timeout
    
    这是设置SSH链接的超时间隔,单位是秒。
    
    timeout = 20
    
    8)log_path
    
    Ansible系统默认是不记录日志的,若是想把Ansible系统的输出记录到人i治稳健中,须要设置log_path来指定一个存储Ansible日志的文件
    
    log_path = /var/log/ansible.log
    
    另外须要注意,执行Ansible的用户须要有写入日志的权限,模块将会调用被管节点的syslog来记录,口令是不会出现的日志中的
    
    9)host_key_checking
    
    若是有台被管节点从新安装系统并在known_hosts中有了与以前不一样的密钥信息,就会提示一个密钥不匹配的错误信息,直到被纠正为止,在使用Ansible时,若是有台被管理节点没有在known_hosts中被初始化,将会在使用Ansible或定时执行Ansible时提示对key信息的确认。
    
    若是你不想出现这种状况,而且你明白禁用此项行为的含义,只要修改该参数为False便可
    
    host_key_checking = False

2. ansible hosts配置

  • 配置被控端主机地址的配置
    1. 编辑/etc/ansible/hosts
    2. 添加本机的public SSH key到目标机器的authorized_keys #ssh-copy-id
    3. 添加本机的私钥到Ansible
    4. 运行ansible all -m ping 测试是否添加成功
  • lnventory 分组

    • Ansible可同时操做属于一个组的多台主机,组和主机之间的关系经过inventory文件配置,默认文件路径为/etc/ansible/hosts
  • 常见参数配置

    ansible_ssh_host                    # 目标主机地址
        ansible_ssh_port                    # 目标主机端口,默认22
        ansible_ssh_user                    # 目标主机用户
        ansible_ssh_pass                    # 目标主机ssh密码
        ansible_sudo_pass                 # sudo密码
        ansible_sudo_exe                    
        ansible_connection               # 与主机的链接类型,好比:local,ssh或者paramiko
        ansible_ssh_private_key_file  # 私钥地址
        ansible_shell_type                 # 目标系统的shell类型
        ansible_python_interpreter   # python版本

    详细参数:https://www.cnblogs.com/LuisYang/p/5960660.html

  • 格式

    [test]     # 组名  
    10.0.0.1  # 主机ip  或者10.0.0.1:65522 自定义端口
  • 简单配置

    [defaults]
    inventory      = /etc/ansible/hosts
    sudo_user=root
    remote_port=22
    host_key_checking=False
    remote_user=root
    log_path=/var/log/ansible.log
    module_name=command
    private_key_file=/root/.ssh/id_rsa
    no_log:True
  • 参数

ansible经常使用模块

经常使用参数:

  • -m 模块
  • -i PYTH , -i 后面跟库存主机文件的路劲,默认为/etc/ansible/hosts
  • -a (arguments) 命令行参数

实例:

ansible tests1 -m copy -a 'src=/tmp/test.txt dest=/tmp/test/test.txt"

AAsWYF.png

ansible <host-pattern> [-f forks] [-m module_name] [-a args] [options]
  • host-pattern:此次的命令对哪些主机生效;
  • -f forks:启动的并发线程数,就是一次并行处理多少主机;
  • -m module_name:要使用的模块;
  • -a args:模块特有的参数。

1. command 执行模块

  • 做为ansible的默认模块,能够容许远程主机范围内的全部shell命令。

    注意: 在command的命令中含有像$ HOME'这样的变量和像``<“',”>“, `“”“”,“”;“”和“”&“'将没法正常工做(若是须要这些功能,请使用[shell]模块)

    ansible 192.168.168.11* -m command -a 'ip addr show dev eth0'
    
    参数:
    – chdir:在运行命令以前,切换到此目录。

2. shell 执行模块

  • 功能:执行远程主机的shell脚本文件

    ansible all -m shell -a "/home/test.sh"
    
    
    参数:
    – chdir:在运行命令以前,切换到此目录。
    – executable:更改用于执行命令的shell(bash,sh)。 应该是可执行文件的绝对路径。

3. copy复制模块

  • 功能: 实现主控端向目标主机copy文件。

    ansible all -m copy -a "src=/home/test.sh dest=/tmp/ owner=root group=root mode=0755" 
    
    #src 主控端文件位置
    #dest 被控端目标位置
    #owner 文件复制过去后的全部者
    #group 文件复制过去后的所属组
    #mode  文件的权限设定,执行a+x这种方式

4. Fetch 抓取模块

  • 用途:用于从被控端 中拷贝文件到主控端

  • 注意: 不能拷贝目录

    ansible pythonserver -m fetch -a "src=/root/123 dest=/root"
    
    SSH password:
    - fetch:
        src: 在远程拉取的文件,而且必须是一个file,不能是目录
        dest: 用来存放文件的目录,例如存放目录为backup,源文件名称为/etc/profile在主机pythonserver中,那么保存为/backup/pythonserver/etc/profile

5. yum 安装模块

  • 功能:安装 软件包

    ansible all -m yum -a "name=httpd state=latest disable_gpg_check=yes enablerepo=epel"
    #name 包名
    #state (Choices: present, installed, latest, absent, removed)[Default: present]
    #disable_gpg_check:禁止gpg检查
    #enablerepo:只启动指定的repo

6. cron 计划模块

  • 功能: 被控端的crontab配置,用于管理计划任务的

  • 参考博客: https://blog.51cto.com/noodle/1769528

    ansible all -m cron -a "name='test' hour='2-5' minute='*/5' day='1' month='3,4' weekday='1' job='ls -l' user=tom"
    
    
    backup:对远程主机上的原任务计划内容修改以前作备份
     cron_file:若是指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
     minute分,hour时,day日,month月,weekday周
     job: 要执行的任务,依赖于state=present
     name: 该任务的描述
     special_time: 指定何时执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
     state: 确认该任务计划是建立仍是删除
     user: 以哪一个用户身份执行

7. service 服务模块

  • 功能: 服务管理,

    [root@localhost ~]# ansible all -m service -a "name=httpd state=restarted"    #启动服务
    [root@localhost ~]# ansible all -m service -a "name=httpd state=running"      #查看服务状态
    [root@localhost ~]# ansible all -m service -a "name=httpd state=stoped"       #中止服务
    
    
    
    参数:
    enabled=:是否开机自动启动,取值为true或false;
    name=:服务名字;
    state=:状态,取值有started,stoped,restarted。

8. template 模板模块

  • 基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式做为文件模版,进行文档内变量的替换的模块。它的每次使用都会被ansible标记为”changed”状态。)

    - template:
        src: /mytemplates/foo.j2   
        dest: /etc/file.conf   
        owner: bin
        group: wheel
        mode: 0644
    
    
    – backup: 若是原目标文件存在,则先备份目标文件 
    – src:在ansible控制器上的Jinja2格式化模板的路径。 这能够是相对或绝对的路径。 
    – dest:将模板渲染到远程机器上的位置。 
    force:是否强制覆盖,默认为yes 
    – owner:目标文件属主 
    – group:目标文件属组 
    – mode:目标文件的权限模式,模式能够被指定为符号模式(例如,u + rwx或u = rw,g = r,o = r)

9. file 文件模块

  • 功能:用于远程主机上的文件操做,对文件的全部权,组合模式进行更改

    # 更改文件全部权,组和模式。 当使用八进制数指定模式时,第一个数字应始终为0。
    - file:
        path: /etc/foo.conf
        owner: foo
        group: foo
        mode: 0644
    
    # touch建立文件,使用符号模式设置权限(至关于0644)
    - file:
        path: /etc/foo.conf
        state: touch
        mode: "u=rw,g=r,o=r"
    
    # touch建立文件,添加/删除一些权限
    - file:
        path: /etc/foo.conf
        state: touch
        mode: "u+rw,g-wx,o-rwx"
    
    # 建立一个目录,若是它不存在
    - file:
        path: /etc/some_directory
        state: directory
        mode: 0755
    
    
    
    – force:须要在两种状况下强制建立软连接,一种是源文件不存在但以后会创建的状况下;另外一种是目标软连接已存在,须要先取消以前的软链,而后建立新的软链,有两个选项:yes|no 
    – group:定义文件/目录的属组 
    – mode:定义文件/目录的权限 
    – owner:定义文件/目录的属主 
    – path:必选项,定义文件/目录的路径 
    – recurse:递归的设置文件的属性,只对目录有效 
    – src:要被连接的源文件的路径,只应用于state=link的状况 
    – dest:被连接到的路径,只应用于state=link的状况 
    – state: 
       directory:若是目录不存在,建立目录 
       file:即便文件不存在,也不会被建立 
       link:建立软连接 
       hard:建立硬连接 
       touch:若是文件不存在,则会建立一个新的文件,若是文件或目录已存在,则更新其最后修改时间 
       absent:删除目录、文件或者取消连接文件

10 user 用户模块

  • 功能: 远程主机用户管理

    [root@localhost ~]# ansible all -m user -a "name=jerry comment=' doubi jerry'"   #添加用户 详细参数参考ansible-doc user
    [root@localhost ~]# ansible all -m user -a "name=jerry state=absent remove=yes"  #删除用户

11 ping 模块

  • 功能: 检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机若是在线,则回复pong

  • 还用个hping 模块,

    ansible erp -m ping

13 raw 执行原始命令模块

  • 执行原始的命令,而不是经过模块子系统。在任何状况下,使用shell或命令模块是合适的。给定原始的参数直接经过配置的远程shell运行。可返回标准输出、错误输出和返回代码。此模块没有变动处理程序支持。

    这个模块不须要远程系统上的Python,就像脚本模块同样。此模块也支持Windows目标。

14 pip 管理python库依赖 模块

  • 用于管理Python库依赖项,为了使用pip模块,必须提供参数name或者requirements

    # 安装bottle python包。
    - pip:
        name: bottle
    
    # 在0.11版安装bottle python包。
    - pip:
        name: bottle
        version: 0.11
    
    # 使用远程协议(bzr +,hg +,git +,svn +)安装MyApp。 您没必要在extra_args中提供'-e'选项。
    - pip:
        name: svn+http://myrepo/svn/MyApp#egg=MyApp
    
    # 使用远程协议(bzr +,hg +,git +)安装MyApp。
    - pip:
        name: git+http://myrepo/app/MyApp
    
    # 从本地压缩包安装MyApp
    - pip:
        name: file:///path/to/MyApp.tar.gz
    
    # 将bottle安装到指定的virtualenv中,继承全局安装的模块
    - pip:
        name: bottle
        virtualenv: /my_app/venv
        virtualenv_site_packages: yes
    
    # 使用Python 2.7将bottle安装到指定的virtualenv中
    - pip:
        name: bottle
        virtualenv: /my_app/venv
        virtualenv_command: virtualenv-2.7
    
    # 在用户主目录中安装bottle。
    - pip:
        name: bottle
        extra_args: --user
    
    # 安装指定的python requirements
    - pip:
        requirements: /my_app/requirements.txt
    
    # 在指定的virtualenv中安装指定的python requirements。
    - pip:
        requirements: /my_app/requirements.txt
        virtualenv: /my_app/venv
    
    # 安装指定的python requirements和自定义pip源URL
    - pip:
        requirements: /my_app/requirements.txt
        extra_args: -i https://example.com/pypi/simple
    
    # 专门为Python 3.3安装bottle,使用'pip-3.3'可执行文件。
    - pip:
        name: bottle
        executable: pip-3.3
    
    # 安装 bottle,若是已安装,强制从新安装
    - pip:
        name: bottle
        state: forcereinstall
  • 参数

    – chdir: 执行pip命令前cd进入的目录 
    – name:要安装的Python库的名称或远程包的URL。 
    – requirements:一个pip requirements.txt文件的路径,它应该是远程系统的本地文件,若是使用chdir选项,则能够将文件指定为相对路径。 
    – version:指定的Python库的安装版本。 
    – extra_args:额外的参数传递给pip。 
    – executable:显式可执行文件或可执行文件的路径名,用于为系统中安装的特定版本的Python运行pip。 例如pip-3.3,若是系统中安装了Python 2.7和3.3,而且想要为Python 3.3安装运行pip。 它不能与“virtualenv”参数一块儿指定(在2.1中添加)。 默认状况下,它将采用适用于python解释器的版本。 pip3在python 3上,pip2或pip在python 2上。 
    – virtualenv:要安装到的virtualenv目录的可选路径。 它不能与’executable’参数一块儿指定(在2.1中添加)。 若是virtualenv不存在,则将在安装软件包以前建立它。 可选的virtualenv_site_packages,virtualenv_command和virtualenv_python选项会影响virtualenv的建立。 
    – virtualenv_command:用于建立虚拟环境的命令或路径名。 例如pyvenv,virtualenv,virtualenv2,~/bin /virtualenv,/usr/local/bin/virtualenv。 
    – virtualenv_python:用于建立虚拟环境的Python可执行文件。 例如python3.5,python2.7。 未指定时,将使用用于运行ansible模块的Python版本。 当virtualenv_command使用pyvenv或-m venv模块时,不该使用此参数。 
    – state:状态(present,absent,latest, forcereinstall),表示是安装还卸载 
       present:默认的,表示为安装 
       lastest: 安装为最新的版本 
       absent:表示删除 
       forcereinstall:“forcereinstall”选项仅适用于可ansible 2.1及更高版本。

15 group 组模块

  • 功能: 分组

    ansible web -m group -a 'name=g1 gid=666 state=present system=yes'
    
    – gid:指定用的gid。 
    – name:指定用户名。 
    – state:是建立仍是删除。(present,absent) 
    – system:若是是,则表示建立的组是系统组。

16 get_url模块(相似wget下载)

  • 模块主要用于从http、ftp、https服务器上下载文件(相似于wget),主要有以下选项:

    - name: Download foo.conf
      get_url:
        url: http://example.com/path/file.conf
        dest: /etc/foo.conf
        mode: 0440
    
    - name: Download file with custom HTTP headers
      get_url:
        url: http://example.com/path/file.conf
        dest: /etc/foo.conf
        headers: 'key:value,key:value'
    
    - name: Download file with check (sha256)
      get_url:
        url: http://example.com/path/file.conf
        dest: /etc/foo.conf
        checksum: sha256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c
    
    
    
    – sha256sum:下载完成后进行sha256 check; 
    – timeout:下载超时时间,默认10s 
    – url:下载的URL 
    – url_password、url_username:主要用于须要用户名密码进行验证的状况 
    – dest:将文件下载到哪里的绝对路径。若是dest是目录,则使用服务器提供的文件名,或者若是没有提供,将使用远程服务器上的URL的基本名称。 
    – headers:以格式“key:value,key:value”为请求添加自定义HTTP标头。

17 unarchive 解压模块

  • 功能: 用于解压文件

    - name: 将foo.tgz解压缩到/var/lib/foo中
      unarchive:
        src: foo.tgz
        dest: /var/lib/foo
    
    - name: 解压远程计算机上已存在的文件
      unarchive:
        src: /tmp/foo.zip
        dest: /usr/local/bin
        remote_src: yes
    
    - name: 解压文档须要下载的文件(2.0中添加)
      unarchive:
        src: https://example.com/example.zip
        dest: /usr/local/bin
        remote_src: yes
    
    参数:
    – copy:在解压文件以前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。 
    – creates:指定一个文件名,当该文件存在时,则解压指令不执行 
    – dest:远程主机上的一个路径,即文件解压的绝对路径。 
    – group:解压后的目录或文件的属组 
    – list_files:若是为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项 
    – mode:解压后文件的权限 
    – src:若是copy为yes,则须要指定压缩文件的源路径 
    – owner:解压后文件或目录的属主
    ---------------------

18 script 复制并执行 模块

  • 功能: script模块将本地脚本复制到远程主机并运行之

    ansible web -m script -a 'time.sh'

19 setup 模块

  • 相似saltstack的grains静态信息收集,收集一些主机硬件信息或者以及其余如fqdn等等

  • 使用setup获取ip地址以及主机名使用filter过滤等等

    获取内存信息
    ansible db -m setup -a 'filter=ansible_memory_mb'
    
    
    获取主机名
    ansible db -m setup -a 'filter=ansible_nodename'
相关文章
相关标签/搜索