ansible部署应用

简介: 优先在堡垒机批量管理服务器,考虑适用性,可x监控服务器端部署。

简介:

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 文件后,执行相应的动作

架构过程:

image.png

  • 核心:ansible
  • 核心模块(Core Modules):这些都是ansible自带的模块
  • 增添模块(Custom Modules):如果核心模块不足以完成某种功能,可以增添模块
  • 插件(Plugins):另外新家的功能项,完成模块功能的补充
  • 剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行
  • 连接插件(Connectior Plugins):基于ssh-key验证,ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
  • 主机群(Host Inventory):定义ansible管理的主机清单

image.png

配置说明:

/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=80192.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           # 指定默认shellstate           #设置帐号状态,不指定为默认为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 bashin 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 bashin 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经常被用在条件语句和模板当中,也可以用于根据指定的标准创建动态主机组。
目录
相关文章
|
9月前
|
运维 负载均衡 关系型数据库
【运维知识进阶篇】用Ansible Roles重构LNMP架构(Linux+Nginx+Mariadb+PHP),实现4个项目一键部署
【运维知识进阶篇】用Ansible Roles重构LNMP架构(Linux+Nginx+Mariadb+PHP),实现4个项目一键部署
113 0
|
10月前
管理工具ansible的部署
管理工具ansible的部署
66 0
管理工具ansible的部署
|
6月前
|
Linux 网络安全 调度
使用docker部署awx-1.7.1.0(ansible图形化界面)
使用docker部署awx-1.7.1.0(ansible图形化界面)
366 0
|
6月前
|
弹性计算 关系型数据库 数据库
通过计算巢轻松部署 Ansible Semaphore
AnsibleSemaphore是一个现代化的Ansible用户界面,通过计算巢可轻松部署。
153 1
通过计算巢轻松部署 Ansible Semaphore
|
运维 安全 持续交付
利用ansible的角色快速批量一键部署基础docker环境
利用ansible的角色快速批量一键部署基础docker环境
377 0
利用ansible的角色快速批量一键部署基础docker环境
|
12月前
|
Unix 应用服务中间件 Linux
ansible在web集群中批量部署nfs
ansible在web集群中批量部署nfs
154 0
|
12月前
|
监控 网络安全 开发工具
Ansible批量部署zabbix-agent(含zabbix-agent的yum源,zabbix自动发现和添加的界面操作)
Ansible批量部署zabbix-agent(含zabbix-agent的yum源,zabbix自动发现和添加的界面操作)
221 0
|
12月前
|
负载均衡 关系型数据库 Linux
实战案例——Ansible部署高可用OpenStack平台
实战案例——Ansible部署高可用OpenStack平台
526 0
|
12月前
|
NoSQL Shell Redis
ansible--一键部署redis5.0.5集群及全套脚本
ansible--一键部署redis5.0.5集群及全套脚本
|
12月前
|
前端开发 Java jenkins
ansible--部署jdk以及zookeeper集群
ansible--部署jdk以及zookeeper集群