q9989 发表于 2018-1-2 13:33:18

Ansible & Ansible-playbook部署使用详解

  Ansible & Ansible-playbook使用详解
  自动化类别:
  OS Provisioning(系统安装部署)
  PEX,cobbler(PEX的升级版)
  OS config(主机的配置文件修改)
  cfengine,puppet,saltstack,chef
  Deployment(多台主机的部署方式)
  func(ssl)
  fabric(ssh)
  ansible(ssh)
  __Ansible模块__
  Core Modules(核心模块)
  Custom Modules(自定义模块)
  Plugins(email,logging,other)(执行完毕后通过邮件或记录的日志方式存档)
  Playbook(任务剧本)
  Connection Plugins
  Host Inventory(主机池、分组)
  Ansible安装____
  安装环境如下:
  服务器2台
  操作系统:centos6.8 x64
  ip地址分配情况:
  ansible分发端:172.18.119.102
  被部署端:172.18.119.112
  软件下载:
  https://pkgs.org/centos-6/epel-i386/ansible1.9-1.9.6-2.el6.1.noarch.rpm.html
  Ansible install:
  注意:Ansible是基于python开发的,有很多的以来的包需要安装,这边我们使用epel的yum的方式安装
  1、Download the latest epel-release rpm from
  http://dl.fedoraproject.org/pub/epel/6/i386/
  2、Install epel-release rpm:
  # rpm -Uvh epel-release*rpm
  3、Install ansible1.9 rpm package:
  # yum install ansible1.9
  ————————————————
  设置ssh免密钥分发到client
  1、#ssh-keygen -t rsa -P ''
  2、ssh-copy-id -i~/.ssh/id_rsa.pub root@172.18.119.112
  Ansibled 配置文件
  /etc/ansible/host
  注释已有的主机列表示例,行添加一行主机或者主机组的方式:

  172.18.119.112
  ______________
  Ansible使用手册及案例
  基本语法格式:
  ——————————————————
  ansible <host-pattern> [-f forks] [-m module_name] [-a args]
  基本案例使用
  ————————————————
  1、探测指定主机或者所有主机是否在线:
  ansible 172.18.119.112 -m ping或者ansible all -m ping
  .参数m:指定使用的模块(命令:ansible-doc -l可查看ansible支持的所有模块)
  eg:
# ansible 172.18.119.112 -m ping
  172.18.119.112 | success >> {
  "changed": false,
  "ping": "pong"
  }
  2、探测指定主机或者所有主机的时间是否一致:
  ansible all -a 'date'
  eg:
# ansible all -a 'date'
  172.18.119.112 | success | rc=0 >>
  Tue Dec 20 17:01:56 CST 2016
  3、检查指定主机的nginx服务的运行状态:
  eg:
# ansible all -a 'service nginx status'
  172.18.119.112 | FAILED | rc=3 >>
  nginx 已停
# ansible all -a 'service nginx status'
  172.18.119.112 | success | rc=0 >>
  nginx (pid26668) 正在运行...
  4、把本地安装包复制到被部署的服务器的opt目录上去:
  ansible-doc -s copy可以查看模块可以使用的参数;
  eg:
# ansible 172.18.119.112 -m copy -a "src=/opt/ansible1.9-1.9.6-2.el6.1.noarch.rpm dest=/opt/"
  172.18.119.112 | success >> {
  "changed": true,
  "checksum": "3f900edf50b32f557bf4286b47ecf0fa64fd4a67",
  "dest": "/opt/ansible1.9-1.9.6-2.el6.1.noarch.rpm",
  "gid": 0,
  "group": "root",
  "md5sum": "e84e5001b0718336f3834ce38c86f08b",
  "mode": "0644",
  "owner": "root",
  "size": 1844424,
  "src": "/root/.ansible/tmp/ansible-tmp-1482227767.15-125559515403616/source",
  "state": "file",
  "uid": 0
  }
  检查是否copy成功:
# ansible 172.18.119.112 -a 'ls /opt'
  172.18.119.112 | success | rc=0 >>
  ansible1.9-1.9.6-2.el6.1.noarch.rpm
  5、为所有的主机设置个定时任务(每3分钟执行一次时间同步):
  eg:
# ansible all -m cron -a 'name="custom jobs" minute=*/3 hour=* month=* weekday=* job="/usr/sbin/ntpdate 172.18.119.1"'
  172.18.119.112 | success >> {
  "changed": true,
  "jobs": [
  "custom jobs"
  ]
  }
  检查一下定时任务是否添加成功:
# ansible all -a 'crontab -l'
  172.18.119.112 | success | rc=0 >>
  #Ansible: custom jobs
  */3 * * * * /usr/sbin/ntpdate 172.18.119.1
  6、为所有主机添加一个mysql的系统组:
  eg:
# ansible all -m group -a 'name="mysql" gid=700 system=yes'
  172.18.119.112 | success >> {
  "changed": true,
  "gid": 700,
  "name": "mysql",
  "state": "present",
  "system": true
  }
  7、使用yum方式为所有主机安装程序包;
  eg:
  172.18.119.112 | success >> {
  "changed": true,
  "msg": "",
  "rc": 0,
  "results": [
  "Loaded plugins: fastestmirror, security\nSetting up Install Process\nLoading mirror speeds from cached hostfile\n ....信息该多省略;
  检查是否安装成功:
# ansible all -a "rpm -qa corosync"
  172.18.119.112 | success | rc=0 >>
  corosync-1.4.7-5.el6.x86_64
  8、设置主机上的nginx服务为开机启动:
  eg:
# ansible all -m service -a 'state="started" name="nginx" enabled="yes"'
  172.18.119.112 | success >> {
  "changed": true,
  "enabled": true,
  "name": "nginx",
  "state": "started"
  }
  检查nginx开机启动是否设置成功:
# ansible all -a 'chkconfig --list nginx'
  172.18.119.112 | success | rc=0 >>
  nginx          0:off1:off2:on3:on4:on5:on6:off
  以上的使用方式,在生产环境尽然,我们有时候需要安装软件同时配置其配置文件 并设置计划任务等等,混合部署
  那么这样单一的去一条一条执行命令比较繁琐,也不太现实,这里我们引入了一个叫 ansible中playbook的插件,我们称之为ansbilbe任务剧本
  或者叫 剧本队列。
  Playbook详解:
  ————————————
  依赖的语言YAML
  YAML是一个可读性高的用来表达资料序列的格式,YAML参考了其他的多重语言,它不是xml。
  YAML的特点:
  可读性好
  脚本语言交互性好
  基于流来处理
  扩展性号
  有一个一致的信息模型
  YAM的语法
  eg:
  name:kuaiwenwu
  age:41
  gender:Male
  spouse:
  name:Yaru.wang
  age:37
  gender:sales
  children:
  -name:kuaixiaoduo
  age:weichusheng
  gender:baby
  -name:kuaianqi
  age:weichusheng
  gender:baby
  Ansible playbooks实例:
  ——————————|———————————
  - hosts:webserver
  vars:
  http_port: 256
  max_clients: root
  remote_user: root
  tasks:
  - name:ensure nginx is at the latest version
  yum:name=nginx state=latest
  name:ensure nginx is running
  service:name=nginx state=started
  handlers:
  - name: restart nginx
  service:name=nginx state=restarted
  接下来我们写个ansible-paly方式的yaml脚本来感受下;
  脚本的名称:test.yaml
  脚本代码:
  - hosts: all    (指定的主机为所有的主机,这里也可以写上我们之前hosts配置文件定义的主机组名称,- 和hosts;和面的all 必须是有空格)
  remote_user: root (指定远程主机以root用户执行任务)
  tasks:   (注意这里不能写host而是hosts)
  - name: add a group任务名称
  group: gid=800 name=testgroup system=no添加组的参数 不需要加""
  - name: excute a command任务描述或者名称
  command: /bin/date执行的命令
  看看执行后返回的状态:
# ansible-playbook test.yaml(YAML脚本的执行方式)
  PLAY ********************************************************************
  GATHERING FACTS ***************************************************************
  ok:
  TASK: ***********************************************************
  changed:
  TASK: ******************************************************
  changed:
  PLAY RECAP ********************************************************************
  172.18.119.112             : ok=3    changed=2    unreachable=0    failed=0
  注意:
  remote_user字段可以用于tasks的任务列表中
  eg:
  - hosts:webserver
  remote_user:eason
  task:
  - name:test connection
  ping:
  remote_user:eason
  sudo:yes
页: [1]
查看完整版本: Ansible & Ansible-playbook部署使用详解