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基本架构如下图所示

    img

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

ansible工作原理如图

img

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

  2. 可以按应用类型等法师进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作,---单个模块,单条命令称为ad-hoc

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

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

  5. ansible执行过程大体过程如下图,其中暖色的代表模块化

    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/1863688

  2. 源码安装需要首先确保安装了git ,因为它的源码是保存在GitHub,我们需要利用git将其clone下来然后本地编译安装

    安装git yum install -y git

    安装ansible

    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中直接引用。
    
    2、设置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'
    
posted @ 2019-03-14 20:14  云丛  阅读(437)  评论(0编辑  收藏  举报