ansible批量部署

ansible

ansible是一种自动化运维工具,基于paramiko开发的,并且基于模块化工作,Ansible是一种集成IT系统的配置管理、应用部署、执行特定任务的开源平台,它是基于python语言,由Paramiko和PyYAML两个关键模块构建python2.5以上才支持。集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能.真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架.ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的.

基本结构
  • 核心:ansible
  • Core Modules:ansible自带模块
  • Custom Modules: 核心模块功能不足时,添加扩展模块
  • plugins:通过插件来实现记录日志,发送邮件或其他功能
  • Playbooks:剧本,YAML格式文件,多个任务定义在一个文件,定义主机需要调用那些模块
  • Connectior Plugins:ansible基于插件连接到各个主机上,默认使用ssh
  • Host Inventory:记录由Ansible管理的主机信息,包括端口,密码,ip等
基本特点
  • 1.no agents:客户端无需安装agent
  • 2.no server:无服务端,使用直接调用命名
  • 3.modules :基于模块工作,可以用任意语言开发
  • 4.语法简单:基于yaml语法编写playbook
  • 5.基于推送模式: 直接由调用者控制变更在服务器上发生时间
  • 6.模块是等幂性:定义的任务已经存在则不会做任何事情–同一台服务器多次执行同一个playbook是安全的
1,JSONJavaSript对象表示法
  • JSON分隔符限于单引号 ’ ,小括号() ,中括号[] ,大括号{} 冒号: 和逗号,
  • JSON语法规则
    数据在名称/值对中
    数据有逗号隔开
    大括号保存对象
    中括号保存数组
  • 示例:
  • “诗仙”: “李白” #键值
  • { “诗人”:
    [“李白”,“杜甫”,“白居易”]
    } #数组
  • 复合类型
    { “诗人”:
    [{…},{ …},{…}
    ]
    }
2,YAML表达数据序列的格式

基础语法

  • 结构通过空格表示
  • 数组使用"- "表示
  • 键值对使用": "表示
  • 固定缩进表示数据层级结构关系
  • 一般缩进级别由两个以上空格组成
  • #表示注释
  • ctrl+v+i,自动切换到上行缩进
3,jinja2模板
  • 模板表达式都包含在分隔符"{{ }}"内
  • 控制语句包含在分隔符"{% %}"
  • 模板注释"{# #}"
  • 调用变量 {{varname}}
  • 计算{{2+3}}
  • 判断{{1 in [1,2,3]}}
  • 过滤器,过滤器与变量用管道符号( | )分割,也可以用()传递参数
    如加密字符串: {{ ‘astr’|password_hash(‘sha512’)
1.1配置文件查找顺序

1.检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg)
2…/ansible.cfg检查当前目录下的ansible.cfg配置文件
3.检查当前用户家目录下~/ansible.cfg文件
4./etc/ansible.cfg检查etc目录下的配置文件

1.2*ansible配置文件ansible.cfg**
vim ansible.cfg
inventory= /etc/ansible/hosts  /#Inventory文件的位置
library= /usr/share/ansible  #存放ansible模块的目录,支持多个目录方式,以":"隔开
forks=5 #并发线程,默认5
sudo_user=root  #设置默认执行命令的用户
remote_port=22  #指定被管节点的管理端口,默认22,建议修改,更安全
hosts_key_checking=False  #是否检查SSH主机的密钥,False连接不需要输入yes
timeout=60  #设置ssh连接超时时间单位S
log_path=/var/log/ansible.log  #指定一个存储ansible日志的文件(默认不记录日志)
1.3定义Inventory(主机列表)

ansible为了批量主机操作,将其分组命名.默认Inventory文件在/etc/ansible/hosts;Inventory
file可以有多个;若目标主机使用非默认SSH端口,可以在主机名之后使用冒号加端口号标明

vim hosts
[app:children]  #children子组定义,用于引用其他组名称
web
db
[web]
web1
web2:2222  #使用了非默认SSH端口,须标明端口
[db]
db[1:2]   #主机名相似,可以用列表的方式标示各主机 如[a:f]表示a到f
[other]
cache ansible_ssh_port=222  #引用变量
[all:vars]
ansible_ssh_private_key_file="/root/.ssh/id_rsa"  #指定秘钥文件
############################################################
inventory其他参数
ansible_ssh_host #远程主机
ansible_ssh_port #指定远程主机ssh端口
ansible_ssh_user  #ssh远程连接的用户,默认root
ansible_connection #连接类型:local,ssh,paramiko
ansible_shell_type #指定shell类型,默认sh,支持csh,fish
################################################################
配置本地域名解析
vim /etc/hosts
192.168.1.30 ansible
192.168.1.31 web1
192.168.1.32 web2
192.168.1.33 db1
192.168.1.34 db2
192.168.1.35 cache
ansible all -m ping -k  #k交互式ssh所有主机
配置公钥,远程无密码连接
cd /root/.ssh
ssh-keygen -t rsa -N ' ' -f id_rsa  #非交互式创建秘钥对
ssh-copy-id -i id_rsa web1/web2/web3/db1/db2/cahce  #所有主机部署秘钥
ansible  all -m ping  #无密码检测ssh
ansible app --list-hosts  #列出app组的所有主机
ansible all -m command -a 'uptime'   #查看所有主机的负载
ansible -i ./hosts remote -v -m ping -u root --private-key=~/.ssh/id_rsa
-i 指定host文件默认//etc/ansible/hosts
--private-key=PRIVATE_KEY_FILE_PATH 指定秘钥
-m 指定模块
-c 指定连接类型ssh,local
1.4任务执行方式
  • ad-hoc模式(点对点模块)
    使用单个模块,支持批量执行单条命令,相当于bash中执行一条命令
  • playbook模式(剧本模式)
    ansible主要管理方式,通过多个task的集合完成一类功能,多个ad-hoc的集合

ansible命令语法格式

ansible <host> [-f forks] [-m module_name] [-a args]
-m module :默认command
ansible all -m command -a 'removes=/etc/passwd grep root /etc/passwd'
ansible-doc -l #列出所有可用modules,常见的有
##################################################
ping #测试主机连通性
command #远程主机上执行命令,不支持管道
shell  #远程主机上调用shell解析器,支持管道命令
copy #将文件复制到远程主机上,设定内容和修改权限
file #创建文件,创建连接文件,删除文件等
fetch # 从远程主机复制文件到本地
cron #管理计划任务
yum #用于模块的安装
service #管理服务
user  #管理用户账号
group #用户组管理
script #将本地脚本在远程主机运行
setup #收集信息,通过facts组件实现,一变量的形式存储主机上的信息
##########################################################
ansible-doc -s service #查看modules的用法

modules模块简介
一,setup模块信息

1.setup --获取主机信息:
--tree 指定输出信息保存目录  --tree /tmp
filter:过滤关键字
gather_subset:按子集收集信息,值:all,min,network,virtual,facter
关键字说明:
ansible_nodename 节点名 dns.hunk.tedu
ansible_fqdn FQDN名 全限定域名--主机名+域名 dns.hunk.tedu
ansible_hostname 主机短名称 dns
ansible_domain 主机域名后缀 hunk.tedu
ansible_memtotal_mb 总物理内存 "ansible_memtotal_mb": 222
ansible_swaptotal_mb SWAP总大小 "1023"
ansible_processor  CPU信息 Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz
ansible_processor_cores CPU核心数  4
ansible_processor_vcpus CPU逻辑核心数 2
ansible_all_ipv4_addresses ipv4地址 192.168.0.200
ansible_default_ipv4 默认网卡配置信息
anisble_eth2 eth2网卡信息
ansible_distribution 发行版本  "Centos"
ansible_service_mgr 进行服务的方式 "systemd"
ansible_selinux SElinux状态 "disabled"
例子:
#获取主机信息,存放到/tmp下
ansible all -m setup -a 'filter=ansible_distribution_version' --tree /tmp/
#获取db的详细信息
ansible db -m setup

二,command模块(默认模块)

creates :一个文件名,文件存在,不执行
free_form:要执行的linux指令
chdir:执行指令之前,先切换到指定目录
removes:一个文件名,文件不存在,不执行
executable:切换shell执行指令,路径必须绝对路径
ansible all -a 'date'

三,cron定时任务

backup:修改计划任务之前做备份
cron_file:若指定该选项,用该文件替换远程主机行con.d目录下的计划任务
day:日(1-31)
hour:小时(0-23)
minute:分钟(0-59)
month:月(1-12)
weekday:周(0-7)
job:要执行的任务
name:任务描述(必选项)
special_time:指定执行时刻,参数:reboot,yearly,annually,monthly,weekly
state:确认该任务计划是创建还是删除,present(默认添加),absent(移除)
user:以那个用户的身份执行
定时设置默认*(可不写)
ansible db -m cron -a 'minute="" hour="" day="" month="" weekday="" job="" name="" state='
ansible db -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state="present"'
ansible db -a "crontab -l"

四.user/group模块

groups:指定用户的属组
uid:指定用户uid
password:设置登录密码(加密)
update_password:always/on_create
     always:密码不相同时才会更新密码
     on_create:只为新用户设置密码
name:指定用户名
createhome:是否创建用户加目录 yes|no (默认yes)
system:是否为系统用户
remove:当state=absent时,remove=yes删除家目录(默认no)
state:创建或删除 present添加(默认),absent移除
shell:指定用户shell环境
append:yes|no
   yes:增量添加group
   no:全量变更group只设置group指定group组
   expires:设置用户过期时间
 ############################
 user: name=johnd shell=/bin/bash group=admin uid=1040 expires=1422222
 #删除用户且删除用户家目录
 ansible db -m user -a 'name="test" state="absent" remove="yes"

五.copy模块

backup:覆盖前将源文件备份yes|no
content:用于代替SRC,可以直接设定指定文件的值
dest:必选项,远程主机的绝对路径
directory_mode:递归的设定目录的权限,默认系统默认权限
force:默认yes,强制覆盖文件
others:所有的file模块选项都可以在这使用
src:本机文件地址
ansbile db -m copy -a 'src=/etc/hosts dest=/tmp/ owner=root mode=640 backup='no''

六,file模块

force:yes源文件不存在创建软连接,no目标连接已存在,需要先取消之前的连接,然后在创建新的软连
group:定义文件或目录的属组
mode:定义/文件/目录的权限
owner:定义属主
path定义文件路径(必选项)
rescurse:递归设置文件的路径,只对目录有效
src:要被连接的源文件路径,只应用与state=link
dest:被连接到的路径,只应用于state=link
state: directory:如果目录不存在,创建目录 file: 文件不存在,也不会被创建 link: 创建软连接 hard:创建硬链接 
   touch:如果文件不存在,创建新文件,若存在,更新其最后修改时间 absent: 删除目录.文件或取消连接

七:yum模块

config_file:yum的配置文件
disabled_gpg_check:关闭gpg-check
disabledrepo:不启用某个源
enablerepo:启用某个源
name:包名
state:present安装,absnet卸载latest最新
#下载http
ansible web -m yum -a 'name=httpd state=presnet'

八,service模块

arguments:命令行参数
enabled:是够开机自弃yes|no
name:服务名称
pattern:定义一个模式,如果通过status指令查看服务状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,若匹配,认为服务依然运行
runlevel:运行级别
sleep:restarted时沉睡几秒
state:操作started,stopped,restarted,reloaded
#运行http服务,开机自启
ansible web -m service -a 'enabled=yes name=httpd state=started'
#查看服务状态
ansible web -a 'service httpd status'
#centos7之前
ansible web -a 'chkconfig --list httpd'
ansible web -a 'systemctl is-enabled httpd'

九 script模块
#执行脚本
ansible db -m script -a ‘/tmp/script.sh’
十,synchronize模块

archive:归档,相当于同时开启recursive(递归),links,perms,times,owner,group
checksum:跳过检测sum值,默认关闭
compress:是否开启压缩
copy_links:复制链接文件,默认为no
delete:删除不存在的文件默认no
dest:目录路径
dest_port:默认目录主机上的端口默认22
dirs:穿速目录不进行递归默认no
rsync_opts:rsync参数部分
set_remote_user:主要用于//etc/ansible.hosts定义或默认使用的用户与rsync使用用户不同的情况
mode: pull或push,push模块一般用于从本机向远程主机上传文件,pull用于从远程主机上取文件
范例:
src=some/relative/path dest=/some/absolute/path rysnc_path="sudo rsync"

十一,mount模块

dump fstype : 挂载类型
name: 必选项,挂载点
opts: 命令参数
src:要挂载的文件
state:present只处理fstab中的配置; absnet删除挂载点 mounted: 自动创建挂载点并挂载 umounted:  卸载
name=/mnt/dvd src=/dev/sr0 fstype=iso9660 opts=ro state=present

十二,get_url

sha256sum: 下载完成后进行sha256 check
timeout: 下载超时时间
usl: 下载URL
usrl_password, url_username:用户密码验证
use_proxy:使用代理

十三,lineinfile类似sed编辑

path 目标文件
redexp 正则表达
line最终修改的结果
ansible db -m lineinfile -a 'path="/etc/my.cnf" regexp="^bin-log-format" line="binlog-format=row"'

十四,replace模块

path 目标文件
regexp 正则表达式
replace 替换后的结果
ansible db -m repalce -a 'path="/etc/my.cnf" regexp="= row$" replace="mixed"'

基于playbook执行

palybooks组成部分

  • Target section:定义要运行playbook的远程主机
    • hosts:hosts指定执行任务的主机,多个由:分隔主机组
    • user:指定远程主机上执行任务的用户
  • Variable section:定义playbook运行时的变量
  • Task section:定义远程主机上运行的任务列表
    • name每个任务都有name,建议描述任务执行步骤,为通过name会用执行结果作为name
    • modul:options:调用的module和传入的参数args
  • Handler section:定义task完成后调用的任务
    • notify:在task section在每个play的最后触发,调用在hendle中定义的操作
    • handle:也是task列表

 ---
- hosts: master
  user: root
  vars:
    - motd_warning: 'WARNING: Use by master ONLY'
  tasks:
    - name: setup a MOTD
      copy: dest=/etc/motd content="{{ motd_warning }}"
      notify: say something
  handlers:
    - name: say something
      command: echo "copy OK"

安装http

---
- hosts: cache
  remote_user: root
  tasks:
    - name: install one specific version of Apache
      yum:
        name: httpd		//安装Apache
        state: installed
    - lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^Listen '
        line: 'Listen 8080'		//修改端口为8080
    - service:
        name: httpd
        enabled: yes		//开机自启
        state: restarted
    - copy:
        src: /root/index.html		//修改主页,可以自己写个页面
        dest: /var/www/html/index.html

添加用户

vim use.yml
---
- hosts: cache
  remote_user: root
  vars:
    username: xiaoming #变量参数
  tasks:
    - name: create user "{{username}}"
      user: group=wheel uid=1000 name={{username}}
    - shell: echo 123456 | passwd --stdin xiaoming
    - shell: chage -d 0 {{username}}
##########################
vim erro,yml
---
- hosts: web
  remote_user: root
  tasks:
    - shell: mkdir /tmp/cache
    - name: ReStart service httpd
      service:
        name: httpd
        state: restarted
    - name: run  some command
      shell: /usr/bin/somecommand
      ignore_errors: True
      #若报错,后面的命令不会在执行,若想解决可以使用ignoring_errors:True
######################################################################
tags给指定的任务定义一个调用标识
vim ad.yml
- hosts: cache
  remote_user: root
  tasks:
    - copy:
        src: /root/httpd.conf
        dest:  /etc/httpd/conf/httpd.conf
        owner: apache
        group: apache
        mode: 0644
      tags: syncconf
ansible-playbook tags.yml  -t syncconf
######################################################
不同用户定义不同组
---
- hosts: web2
  remote_user: root
  tasks:
    - name: add users
      user: group={{item.group}} password={{'123456' | password_hash('sha512')}} name={{item.name}}
      with_items:
        - {name: 'nb',  group: 'root'}
        - {name: 'dd',  group: 'root'}
        - {name: 'plj', group: 'wheel'}
        - {name: 'lx',  group: 'wheel'} 
##############################################################
引入一个项目的文件和目录include
tasks:
   - include: tasks/setup.yml
   - include: tasks/users.yml user=plj 
############################
检测
ansible-playbook  --syntax-check  http.yml  //检测语法
ansible-playbook  -C  http.yml   //测试运行
ansible-playbook   http.yml  --list-tasks  
//显示要执行的工作
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值