Ansible的***个版本是0.0.1,发布于2012年3月9日,其作者兼创始人是Michael DeHaan。Michael DeHaan曾经供职于Puppet Labs、RedHat、Michael,在配置管理和架构设计方面有丰富的经验。其在RedHat任职期间主要开发了Cobble,经历了各种系统简化、自动化基础架构操作的失败和痛苦,在尝试了Puppet、Chef、Cfengine、Capistrano、Fabric、Function、Plain SSH等各式工具后,决定自己打造一款能结合众多工具优点的自动化工具,Ansible由此诞生。Ansible版本更新速度非常快,有时会一天推出多个Dev版本,7天推出一个稳定版本。所以使用Ansible的过程中也需多留意官网的更新。
ansible的组成------>Ansible主要由一下6部分组成 Ansible Playbooks:任务集,编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是json格式的YML文件。Inventory:Ansible管理主机的清单。Modules:Ansible执行命令的功能模块,多数为内置的核心模块,也支持自定义Plugins:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,改功能不常用。API:供第三方程序调用的应用程序编程接口;Ansible:此处指的是组合nventory、Modules、Plugins、API的Ansible命令工具,其为核心执行工具
使用Ansible或Ansible-playbooks时,在服务器终端输入Ansible的Ad-Hoc命令集或palybook后,Ansible会遵循预先编排的规则将Playbooks逐条拆解为Play,再将paly组织成Ansible可识别的任务(Task),随后调用任务涉及的所有模块(modules)和插件(plugins),根据Inventory中定义的主机列表通过SSH将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果是临时文件,则执行完毕后自动删除。
4台虚拟机:(ansible 192.168.200.10) (node1 192.168.200.11)(node2 192.168.200.12)(node3 192.168.200.13)所有机器都必须是免密登陆4台主机上面配置/etc/hosts,以ansible主机为例vim /etc/hosts192.168.100.10 ansible192.168.100.11 node1192.168.100.12 node2192.168.100.13 node3 for i in {10…13}; do scp /etc/hosts 192.168.200.$i:/etc/hosts; done apt install -y ansible
主机清单vim /etc/ansible/hosts[web]node1node2 [db]node3 结果测试ansible all -m pingnode2 | SUCCESS => { “changed”: false, “ping”: “pong”}node1 | SUCCESS => { “changed”: false, “ping”: “pong”}node3 | SUCCESS => { “changed”: false, “ping”: “pong”} ansible web -m pingnode2 | SUCCESS => { “changed”: false, “ping”: “pong”}node1 | SUCCESS => { “changed”: false, “ping”: “pong”}
简单的批量执行ping模块ansible all -m ping #查看ping客户端组情况 command命令模块ansible all -m command -a “uptime” #查看客户端负载信息ansible all -m command -a “useradd uostest” #在客户端添加用户ansible all -m command -a “touch /uostest” #在客户端建立文件 shell模块让远程主机在shell进程下执行命令,从而支持shell的特性,如管道等ansible all -m shell -a "echo “uostest:uostest” | chpasswd"chdir:在运行命令之前,切换到此目录。 executable:更改用于执行命令的shell(bash,sh)。 应该是可执行文件的绝对路径。 script模块将uos1上的脚本在uos2、uos3和uos4上运行vim /tmp/uosscript.sh#!/bin/bashtouch /tmp/uosscriptuseradd uosscriptecho “uosscript:uosscript” | chpasswd ansible all -m script -a “/tmp/uosscript.sh” copy模块ansible all -m copy -a "src=/etc/fstab dest=/tmp/ owner=uostest group=root mode=0600"ansible all -m copy -a “src=/var/log/apt/ dest=/tmp/ owner=uostest group=root mode=0750”#src主控端文件位置,dest被控端目标位置,owner文件复制过去后的所有者,group文件复制过去后的所属组,mode文件的权限设定 user模块ansible all -m user -a "name=uosuser state=present groups=uostest uid=2000 createhome=yes home=/tmp/uosuser password=uosuser shell=/bin/bash comment=‘The user for uos’ append=yes"ansible all -m user -a "name=uosuser state=absent remove=yes"name:用户名password:为用户设置登陆密码,此密码是明文密码加密后的密码update_password:always/on_create always:只有当密码不相同时才会更新密码(默认) on_create:只为新用户设置密码shell:用户的shell设定groups:用户组设定home:指定用户的家目录state:present/absentappend:yes/no yes:增量添加group no:全量变更group,只设置groups指定的group组(默认)remove:配合state=absent使用,删除用户的家目录->remove=yesexpires:设置用户的过期时间,值是一个时间戳 file模块ansible all -m file -a "src=/etc/fstab dest=/tmp/uosfstab state=link"ansible all -m file -a "path=/tmp/uosfile state=touch owner=uostest group=root mode=0600"force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|nogroup:定义文件/目录的属组mode:定义文件/目录的权限owner:定义文件/目录的属主path:必选项,定义文件/目录的路径recurse:递归设置文件的属性,只对目录有效src:被链接的源文件路径,只应用于state=link的情况dest:被链接到的路径,只应用于state=link的情况state: directory:如果目录不存在,就创建目录 file:即使文件不存在,也不会被创建 link:创建软链接 hard:创建硬链接 touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间 absent:删除目录、文件或者取消链接文件 mount模块ansible all -m mount -a "src=/dev/sr0 path=/mnt/cdrom fstype=iso9660 opts=ro state=mounted"ansible all -m mount -a "src=/dev/sr0 path=/mnt/cdrom fstype=iso9660 opts=ro state=absent"fstype:必选项,挂载文件的类型 path:必选项,挂载点 opts:传递给mount命令的参数src:必选项,要挂载的文件 state: present 添加到fstab中,不挂载 absent 删除fstab,并卸载资源 mounted 添加到fstab中,并自动挂载 umounted 不删除fstab信息,只卸载资源 service模块ansible all -m service -a "name=sshd state=started enabled=yes"arguments:给命令行提供一些选项 enabled:是否开机启动 yes|no, 要求状态(state)和启用(enabled)中至少有一个。 name:必选项,服务名称 runlevel:运行级别 sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟 state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded) setup模块ansible all -m setup #查看所有主机信息ansible all -m setup -a “filter=ansible_hostname” #查看主机名ansible all -m setup -a “filter=ansible_kernel” #查看内核信息ansible all -m setup -a “filter=ansible_memory_mb” #查看内存信息ansible all -m setup -a “filter=ansible_default_ipv4” #查看网卡ipv4信息ansible all -m setup -a “filter=user” #查看user相关信息 debug模块ansible all -m debug -a "msg=hahahahahaha"msg:调试输出的消息var:将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出verbosity:debug的级别(默认是0级,全部显示) cron计划任务模块ansible all -m cron -a “name=‘uoscron’ minute=‘30’ hour=‘12’ job=‘touch /tmp/uoscron’ user=root"ansible all -m cron -a 'minute=”/1" job="/usr/bin/date >> /date.txt" name=“date job”'minute= /hour= /day= /month= /weekday= 某个值不写,默认就是name:必选项,任务描述信息job:执行的任务,要加引号state:present(创建)/absent(删除) get_url模块ansible all -m get_url -a ‘url=http://192.168.200.10/favicon.ico dest=/tmp’ #配置好urlsha256sum:下载完成后进行sha256 check; timeout:下载超时时间,默认10s url:下载的URL url_password、url_username:主要用于需要用户名密码进行验证的情况 dest:将文件下载到哪里的绝对路径。如果dest是目录,则使用服务器提供的文件名,或者如果没有提供,将使用远程服务器上的URL的基本名称。 headers:以格式“key:value,key:value”为请求添加自定义HTTP标头。 synchronize模块delete=yes 使两边的内容一样(即以推送方为主)compress=yes 开启压缩,默认为开启–exclude=.Git 忽略同步.git结尾的文件mode=pull 更改推送模式为拉取模式在uos1上mkdir /uostouch /uos/file{1…99}ansible all -m synchronize -a 'src=/uos dest=/tmp/ compress=yes’在uos2上ll /tmp/uos在uos1上mkdir /uostestansible node1 -m synchronize -a ’ mode=pull src=/tmp/uos dest=/uostest’ll /uostest/uos playbook一个playbook由一个到多个play构成每个play都可以指定对某些主机生效每个play由一个多多个任务构成执行任务通过调用模块来实现 yaml语法格式同级别数据元素必须有相同的缩进子元素必须比父元素缩进更多推荐缩进两个空格每个文件首行是“–”,最后一行是“…”playbook是play 的列表,列表项表示为“-”paly本身是key:val对的字典帮助查看ansible-doc apt 执行playbookansible-playbook --syntax-check **.yml //检测语法格式ansible-playbook **.yml //执行playbook 实验-包含多个play的playbookvim tow.yml---- name: Execute NODE1 hosts: node1 tasks: - name: install http apt: name: apache2 state: present - name: Start service httpd, if not started service: name: apache2 state: started- name: Execute NODE2 hosts: - node2 tasks: - name: install gcc apt: name: gcc state: present ansible-playbook --syntax-check tow.ymlansible all -m shell -a "apt update"ansible-playbook tow.ymlcurl 192.168.100.11 //验证可以访问到 实验-循环同时启动ssh和apachevim Circulates.yml---- name: xhlx hosts: node1 tasks: - name: sshd and apache2 are running service: name: “{{ item }}” state: started loop: - sshd - apache2ansible-playbook --syntax-check Circulates.ymlansible-playbook Circulates.yml 实验-变量及条件判断变量my_service已定义,如果定义了,安装相应的软件包,没定义则跳过、也不会报错vim tjpd.yml---- name: panduan hosts: all vars: my_service: apache2 tasks: - name: “{{ my_service }} package is installed” apt: name: “{{ my_service }}” when: my_service is defined判断路径:- hosts: all remote_user: root gather_facts: no vars: testpath1: “/etc” testpath2: “/haha” tasks: - debug: msg: “directory” when: testpath1 is directory - debug: msg: “file” when: testpath2 is file