简介:
ansible是一款自动化运维工具,基于Python开发,可以实现批量系统设置、批量程序部署、批量执行命令等功能。1.完全基于Python开发,要求python的版本为2.6以上。2.至今已有三千多个模块(ansible-doc -l查看)完全满足日常功能所需。3.默认通过SSH协议管理机器,客户端无需配置,管理端配置好后即可用。
使用场景:
应用代码自动化部署 系统管理配置自动化 支持持续交付自动化 支持云计算,大数据平台环境 批量任务执行可以写成脚本,不用分发到远程就可以执行 支持非root用户管理操作,支持sudo 使用python编写,维护更简单
服务部署:
首先需要安装第三方epel源:
# yum install epel-release -y
Ansible依赖python环境,同时已经是RHEL/Centos的一个组成部分,因此推荐通过yum然后安装ansible:
# yum install ansible -y
命令模块:
安装完ansible后,一共提供了七个指令,分别是:ansible、ansible-doc、ansible-galaxy、ansible-lint、ansible-playbook、ansible-pull、ansible-vault 。
常用的是:ansible、ansible-doc、ansible-playbook。其他请查看官网
1)ansible:默认后面需要跟主机和选项部分,不指定模块时,使用的是command模块
2)ansible-doc:查看模块信息,常用参数有 -l(列出已安装模块) 和 -s(查看模块用法)
3)ansible-playbook:读取playbook 文件后,执行相应的动作
架构过程:
- 核心:ansible
- 核心模块(Core Modules):这些都是ansible自带的模块
- 增添模块(Custom Modules):如果核心模块不足以完成某种功能,可以增添模块
- 插件(Plugins):另外新家的功能项,完成模块功能的补充
- 剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行
- 连接插件(Connectior Plugins):基于ssh-key验证,ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
- 主机群(Host Inventory):定义ansible管理的主机清单
配置说明:
/etc/ansible/hosts文件:主机和组的配置
[web] www[01:50].ixdba.net [db] db[a:f].ixdba.ent
主机变量
ansible_ssh_host #用于指定被管理的主机的真实IP
ansible_ssh_port #用于指定连接到被管理主机的ssh端口号,默认是22 ansible_ssh_user #ssh连接时默认使用的用户名
ansible_ssh_pass #ssh连接时的密码
ansible_sudo_pass #使用sudo连接用户时的密码
ansible_sudo_exec #如果sudo命令不在默认路径,需要指定sudo命令路径
[web] 192.168.78.11 http_port=80 192.168.78.12 http_port=80 # 还可以改成这样: [web] 192.168.78.11 192.168.78.12 [web:vars] http_port=80
主机组变量
[webhost] host1 host2 [dbhost] host2 host3 [allhosts:children] webhost dbhost # 则[allhosts]主机组包含主机host1、host2、host3
主机组可以包含主机组,主机的变量可以通过继承关系,继承到最高等级的组的变量。定义主机组之间的继承关系我们使用”:children”来表示
/etc/ansible/ansible.cfg文件:定义ansible的主机的默认配置
如默认是否需要输入密码、是否开启sudo认证、action_plugins插件的位置、hosts主机组的位置、是否开启log功能、默认端口、key文件位置等。
#inventory = /etc/ansible/hosts 该参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表 #library = /usr/share/my_modules/ Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录 #module_utils = /usr/share/my_module_utils/ #remote_tmp = ~/.ansible/tmp 指定远程执行的路径 #local_tmp = ~/.ansible/tmp ansible管理节点的执行路径 #forks = 5 forks 设置默认情况下Ansible最多能有多少个进程同时工作,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管理节点的数量来确定。 #poll_interval = 15 轮询间隔 #sudo_user = root sudo使用的默认用户 ,默认是root #ask_sudo_pass = True 是否需要用户输入sudo密码 #ask_pass = True 是否需要用户输入连接密码 #remote_port = 22 这是指定连接对端节点的管理端口,默认是22,除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的 #module_lang = C 这是默认模块和系统之间通信的计算机语言,默认为’C’语言. host_key_checking = False 跳过ssh首次连接提示验证部分,False表示跳过。 #timeout = 10 连接超时时间 #module_name = command 指定ansible默认的执行模块 #nocolor = 1 默认ansible会为输出结果加上颜色,用来更好的区分状态信息和失败信息.如果你想关闭这一功能,可以把’nocolor’设置为‘1’: #private_key_file=/path/to/file.pem 在使用ssh公钥私钥登录系统时候,使用的密钥路径。
ansible命令的常用选项:
-m MODULE_NAME:指定要执行的模块的名称,如果不指定-m选项,默认是COMMAND模块。 -a MODULE_ARGS,:指定执行模块对应的参数选项。 -k:提示输入SSH登录的密码而不是基于密钥的验证 -K:用于输入执行su或sudo操作时需要的认证密码。 -b:表示提升权限操作。 --become-method:指定提升权限的方法,常用的有 sudo和su,默认是sudo。 --become-user:指定执行 sudo或su命令时要切换到哪个用户下,默认是root用户。 -B SECONDS:后台运行超时时间 -C:测试一下会改变什么内容,不会真正去执行,主要用来测试一些可能发生的变化 -f FORKS,:设置ansible并行的任务数。默认值是5 -i INVENTORY: 指定主机清单文件的路径,默认为/etc/ansible/hosts。
ansible命令的执行格式:
ansible 主机或组 -m 模块名 -a '模块参数' ansible参数
command模块:
ansible 172.16.213.233 -m shell -a 'hostname'
shell模块:
ansible 172.16.213.233 -m shell -a 'ps -ef|grep sshd'
raw模块:
ansible 172.16.213.233 -m raw -a “ps -ef|grep sshd|awk ‘{print \$2}’ ”
command模块、shell模块raw模块区别:
command模块-a参数中不支持特殊字符( “<“, “>”, “|”, “&”等),shell模块支持
官方上说,command用起来更安全,更有可预知性。
raw模块不需要远程主机上的python环境。如果客户机上没有安装python模块或在2.4版本以下,那么command、shell模块将无法工作
command模块、shell模块raw模块选项:
creates:一个文件名,当该文件存在,则该命令不执行,反正,则执行。 free_form:要执行的linux指令 chdir:在执行指令之前,先切换到该指定的目录 removes:一个文件名,当该文件存在时,则该选项执行,反之,不执行。 # raw仅支持free_from选项
# ansible 172.16.213.157 -m command -a 'chdir=/tmp touch test1.txt'
ping模块:测试主机是否是通的
script模块:先将shell复制到远程主机,再在远程主机上执行,此模块的执行,也不需要远程主机上的python环境。
ansible 172.16.213.233 -m script -a 'sh /tmp/install1.sh >/tmp/install.log'
copy模块:复制文件到远程主机
backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no content:用于替代”src”,可以直接设定指定文件的值 dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录 directory_mode:递归的设定目录的权限,默认为系统默认权限 force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes others:所有的file模块里的选项都可以在这里使用 src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用”/”来结尾,则只复制目录里的内容,如果没有使用”/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
ansible 172.16.213.233 -m copy -a 'src=/tmp/t.txt dest=/tmp backup=yes'
ansible 172.16.213.233 -m shell -a 'ls -l /tmp/t.txt*'
service模块:管理远程主机上的服务
enabled:是否开机启动 yes|no name:必选项,服务名称 pattern:定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行 sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟 state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
ansible 172.16.213.233 -m service -a "name=httpd state=started“
ansible 172.16.213.233 -m service -a "name=httpd enabled=yes”
cron模块:管理计划任务
用于管理计划任务,包含如下选项: backup:对远程主机上的原任务计划内容修改之前做备份 cron_file:用来指定一个计划任务文件,也就是将计划任务写到远程主机上/etc/cron.d目录下,创建一个文件对应的计划任务。 job:要执行的任务,依赖于state=present name:定义定时任务的描述信息 special_time: 特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时) state:确认该任务计划是创建还是删除,有两个值可选,分别是present和absent,present表示创建定时任务,absent表示删除定时任务,默认为present。 user:以哪个用户的身份执行job指定的任务。 day:日(1-31,*,*/2,……) hour:小时(0-23,*,*/2,……) minute:分钟(0-59,*,*/2,……) month:月(1-12,*,*/2,……) weekday:周(0-7,*,……)
ansible 172.16.213.233 -m cron -a 'name="checkhttp" minute=30 user="root" job="/data/check_http.sh" cron_file="check_http_ansible" '
yum模块:使用yum包管理器来管理软件包
config_file:yum的配置文件 disable_gpg_check:关闭gpg_check disablerepo:不启用某个源 enablerepo:启用某个源 name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径 state:表示要安装还是删除软件包,要安装软件包,可选择present(安装)、installed(安装)、 latest(安装最新版本),删除软件包可选择absent、removed。
ansible 172.16.213.77 -m yum -a "name=redis state=installed"
user模块:请求的是useradd, userdel, usermod三个指令
group模块:请求的是groupadd, groupdel, groupmod 三个指令
name # 指定用户名 group # 指定用户的主组 groups # 指定附加组,如果指定为('groups=')表示删除所有组。 shell # 指定默认shell state #设置帐号状态,不指定为默认为present,表示创建,指定值为absent表示删除 remove #当使用状态为state=absent时使用,类似于userdel --remove选项。
ansible 172.16.213.77 -m user -a "name=testuser3 state=absent remove=yes" 删除用户的同时 ,删除用记家目录
synchronize模块:调用rsync进行文件或目录同步
archive:归档,相当于同时开启recursive(递归),links,perms,itmes,owner,group,-D选项都为yes,默认该选项为开启 checksum:跳过检测sum值,默认关闭 compress:是不开启压缩,默认开启 copy_links:复制链接文件,默认为no,注意后面还有一个links参数 delete:删除不存在的文件,默认为no dest:目录路径 dest_prot:默认为22,ssh协议 mode:push和pull模块,push模块上传,pull模块下载
ansible 172.16.213.77 -m synchronize -a 'mode=pull src=/mnt/a dest=/tmp'
setup模块:获取主机信息
在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数是filter参数
ansible 172.16.213.77 -m setup -a 'filter=ansible_em[1-2]' //查看本地接口为em1-2的网卡信息
ansible all -m setup --tree /tmp/facts //将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)
get_url模块:从http、ftp、https服务器上下载文件
sha256sum:下载完成后进行sha256 check; timeout:下载超时时间,默认10s url:下载的URL url_password、url_username:主要用于需要用户名密码进行验证的情况 use_proxy:表示使用代理,代理需事先在环境变更中定义
ansible 172.16.213.77 -m get_url -a "url=http://172.16.213.157/Python-2.7.14.tgz dest=/mnt/python-2.7.14.tgz"
playbook
playbook简介
剧本,现实中由演员按照剧本表演,在Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。有时一个设施过于复杂,需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用playbook,就像执行shell命令与写shell脚本一样,也可以理解为批处理任务。
playbook文件格式
playbook文件由YAML语言编写。YAML强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义比较简单,号称“一种人性化的数据格式语言”。以下为playbook常用到的YAML格式。
大小写敏感 使用空格作为嵌套缩进工具,缩进时不允许使用Tab键 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 使用“-”(横线) + 单个空格:表示单个列表项 使用 “:”(冒号) + 空格:表示单个键值对 使用"{}"表示一个键值表
playbook文件是通过ansible-playbook命令进行解析的,ansbile-playbook命令会根据自上而下的顺序依次执行playbook文件中的内容。同时,playbook开创了很多特性,它可以允许传输某个命令的状态到后面的指令,它也可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得playbook可以实现一些复杂的部署机制,这是ansible命令无法实现的。
--- # 文档开始 - 第一章 简介 - 第二章 设计目录 # 客户订单 date: 2018-04-30 customer: - name: Jai items: - no: 1234 # 订单号 - descript: cpu
playbook构成
playbook是由一个或多个“play”组成的列表。play的主要功能在于,将事先合并为一组的主机装扮成事先通过ansible定义好的角色。将多个play组织在一个playbook中就可以让它们联同起来按事先编排的机制完成一系列复杂的任务。
target部分: 定义将要执行 playbook 的远程主机组 variable部分: 定义playbook运行时需要使用的变量 task部分: 定义将要在远程主机上执行的任务列表 handler部分: 定义task 执行完成以后需要调用的任务 而其对应的目录层为五个(视情况可变化),分别为: vars 变量层 tasks 任务层 handlers 触发条件 files 文件 template 模板
playbook语法详解
hosts和user
playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。
hosts:用于指定要执行指定任务的主机,每个playbook都必须指定hosts,hosts也可以使用通配符格式。
remote_user:用于指定在远程主机上执行任务的用户。可以指定任意用户,也可以使用sudo,但是用户必须要有执行相应任务的权限。
tasks list(任务列表)
task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行自上而下某playbook时,如果中途发生错误,则所有已执行任务都将回滚,因此在更正playbook后需要重新执行一次。
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的(幂等性; 即一个命令,即使执行一次或多次, 其结果也一样),这意味着多次执行是安全的,因为其结果均一致。tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,建议加上去,模块是必须的,同时也要给予模块相应的参数。
定义tasks推荐使用module: options”的格式
例如:service: name=httpd state=running
handlers
当关注的资源发生变化时采取一定的操作。handlers是和“notify”配合使用的。
“notify”这个动作可用于在每个play的最后被触发,这样可以避免多次有改变发生时,每次都执行指定的操作,通过“notify”,仅在所有的变化发生完成后一次性地执行指定操作。 在notify中列出的操作称为handler,也就是说notify用来调用handler中定义的操作。
在 notify中定义的内容一定要和handlers中定义的“- name”内容一样,这样才能达到触发的效果,否则会不生效。
tags
tags用于让用户选择运行或略过playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分;但是当一个playbook任务比较多时,一个一个的判断每个部分是否发生了变化,也需要很长时间。因此,如果确定某些部分没有发生变化,就可以通过tags跳过这些代码片断。
playbook结果解析
输出的内容为JSON格式。并且由不同颜色组成,便于识别。一般而言,输出内容中:
绿色代表执行成功,但系统保持原样 黄色代表系统状态发生改变,也就是执行的操作生效 红色代表执行失败,会显示错误信息
新增用户案例
- name: create user hosts: 172.16.213.233 user: root gather_facts: false vars: - user1: "testuser" tasks: - name: start createuser user: name="{{ user1 }}"
说明:
上面的playbook 实现的功能是新增一个用户: name参数对该playbook实现的功能做一个概述,后面执行过程中,会输出name的值; hosts参数指定了对哪些主机进行操作。 user参数指定了使用什么用户登录到远程主机进行操作。 gather_facts参数指定了在下面任务执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用到setup获取的信息时需要用到。 vars参数,指定了变量,这里指字一个user1变量,其值为testuser,需要注意的是,变量值一定要用引号括起来。 tasks指定了一个任务,其下面的name参数同样是对任务的描述,在执行过程中会打印出来。user是一个模块,user后面的name是user模块里的一个参数,而增加的用户名字调用了上面user1变量的值
更新指定bash版本案例
- hosts: all remote_user: root gather_facts: True tasks: - name: update bash in cetnos 7 version yum: name=http://mirrors.aliyun.com/centos/7.4.1708/os/x86_64/Packages/bash-4.2.46-28.el7.x86_64.rpm state=present when: ansible_distribution == 'CentOS' and ansible_distribution_major_version == "7" - name: update bash in cetnos 6 version yum: name=http://mirrors.aliyun.com/centos/6.9/os/x86_64/Packages/bash-4.1.2-48.el6.x86_64.rpm state=present when: ansible_distribution == 'CentOS' and ansible_distribution_major_version == "6"
安装httpd服务案例
- hosts: 172.16.213.75 remote_user: root gather_facts: no vars: packages: httpd tasks: - name: Install httpd yum: name={{ packages }} state=present - name: Cofiguration httpd copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf tags: httpd_conf notify: - restart httpd - name: Add centos user user: name={{ item }} tags: adduser with_items: - www - name: Start httpd service: name=httpd state=started enabled=no tags: starthttpd handlers: - name: restart httpd service: name=httpd state=restarted
fact组件
facts组件是Ansible用于采集被管理机器设备信息的一个功能。可以使用setup模块查机器的所有facts信息,facts信息包括远端主机发行版,IP地址,CPU核数,系统架构,主机名等等,可以使用filter来查看指定信息。整个facts信息被包装在一个json格式的数据结构中。 # ansible 172.16.213.233 -m setup 所有数据格式都是JSON格式,facts还支持查看指定信息,如下所示: # ansible 172.16.213.233 -m setup -a 'filter=ansible_all_ipv4_addresses' playbook在执行的时候,默认的第一个tasks就是收集远端被管主机的facts信息,如果后面的task不会使用到setup获取的信息时,可以禁止ansible收集facts,在playbook中的hosts指令下面设置“gather_facts: false”即可。默认gather_facts的值为true。 facts经常被用在条件语句和模板当中,也可以用于根据指定的标准创建动态主机组。