设为首页 收藏本站
查看: 954|回复: 0

[经验分享] ansible高级应用示例

[复制链接]

尚未签到

发表于 2018-7-28 13:39:52 | 显示全部楼层 |阅读模式
  Ansible 之 playbook使用
  原创
  ghbSunny
  2017-12-04 10:07:21
  评论(0)
  910人阅读
  1  概述
  Playbook组织格式是YAML格式,编排的是任务(task),用来记录重复执行的命令
  YAML:YAML(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans在2001年首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。目前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。
  YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
  YAML的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印除错内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。
  基本数据结构:
  

标量、数组、关联数组  

  表量:直接值
  数组:用花括号组成的键值对
  2  playbook的基础组件
  1)Hosts:运行指定任务的目标主机;
  2)remoute_user: 在远程主机上执行任务的用户;
  

sudo_user:  

  3)tasks:任务列表
  

模块,模块参数;  

  
格式:
  

  (1) action: module arguments
  

  (2) module: arguments
  

  注意:shell和command模块后面直接跟命令,而非key=value类的参数列表;
  

  (1) 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;
  

  (2) 任务可以通过"tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;
  

  4)handlers:
  

任务,在特定条件下触发;  

  接收到其它任务的通知时被触发;
  

  notify: HANDLER TASK NAME
  

  5)variables:
  

(1) facts:可直接调用;  

  注意:可使用setup模块直接获取目标主机的facters;
  

  例子
  收集172.18.50.72内置变量,通过setup模块实现收集主机的变量
  ansible 172.18.50.72 -m setup
  

(2) 用户自定义变量:  

  两种设定的方式
  

  (a) ansible-playbook命令的命令行中的,-e可以重复使用
  

  -e VARS, --extra-vars=VARS
  

     (b) 在playbook中定义变量的方法:  

  vars:
  

  - var1: value1
  

  - var2: value2
  

  变量引用:{{ variable }},变量两侧有空格
  (3) 通过roles传递变量;
  

(4) Host Inventory  

  (a) 用户自定义变量
  

  (i) 向不同的主机传递不同的变量;
  IP/HOSTNAME  varaiable=value var2=value2
  (ii) 向组中的主机传递相同的变量;
  [groupname:vars]
  variable=value
  (b) invertory参数
  用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量;
  ansible_ssh_host
  ansible_ssh_port
  ansible_ssh_user
  ansible_ssh_pass
  3  运行playbook的方式
  (1) 测试
  ansible-playbook  --check
  只检测可能会发生的改变,但不真正执行操作;
  ansible-playbook  --list-hosts
  例子
  ansible-playbook --list-hosts installpkg.yml
  列出运行任务的主机;
  ansible-playbook  --syntax-check
  检查语法,没有输出表示没有语法错误
  ansible-playbook  --syntax-check installpkg.yml
  (2) 运行
  ansible-playbook  脚本
  例子:
  1
  ansible-playbook  installpkg.yml
  4  例子
  例一:编写一个yaml文档,用来安装redis和ngnix服务,并启动相关服务
  注意,语法里有横线用来引导,区分不同的功能的语句,如下面语句有多个hosts,因此在hosts前加横杆,tasks有多个,用横杆区分每个tasks,而且缩进是有要求的,同一层级,一般缩进一样。注意横杆和冒号后有空格。
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  12
  13
  14
  15
  16
  17
  vim installpkg.yaml


  • hosts: websrvs  remote_user: root
      tasks:


    • name: install nginx package  yum: name=nginx state=latest

    • name: start nginx service  service: name=nginx enabled=true state=started


  • hosts: dbsrvs  remote_user: root
      tasks:


    • name: install redis package  yum: name=redis state=latest

    • name: install conf file  copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644

    • name: start redis service  service: name=redis state=started


  准备redis的配置模板
  更改redis配置模板监听端口为0.0.0.0 和 端口为6380
  1
  2
  3
  4
  vim  redis.conf
  vim /root/redis.conf
  bind 0.0.0.0
  port 6380
  查看playbook里的主机
  1
  ansible-playbook --list-hosts installpkg.yml
  查看playbook里的tasks
  1
  ansible-playbook --list-tasks installpkg.yml
  测试执行脚本,添加选项-C,并没有实际执行
  1
  ansible-playbook -C installpkg.yml
  以上脚本,测试正常的话,就去掉-C选项,实际执行
  1
  ansible-playbook  installpkg.yml
  例二:handler的使用
  条件式触发:handler,满足条件的时候触发条件
  handlers:处理器,配置文件被修改的时候才执行,条件定义在notify
  以下命令,表示当配置文件被更改的时候,notify就会触发handler,实现重启的操作.注意格式的书写。
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  vim  /root/ansible/handler.yml


  • hosts: websrvs  remote_user: root
      tasks:


    • name: install nginx package  yum: name=nginx state=latest

    • name: start nginx service  service: name=nginx enabled=true state=started


  • hosts: dbsrvs  remote_user: root
      tasks:


    • name: install redis package  yum: name=redis state=latest

    • name: install conf file  copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
        tags: instconf
        notify: restart redis service

    • name: start redis service  service: name=redis state=started
        handlers:

    • name: restart redis service  service: name=redis state=restarted


  例三:tag的使用
  更改websrvs的配置内容,设置tag为instnginx
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  vim  /root/ansible/installpkg.yml


  • hosts: websrvs  remote_user: root
      tasks:


    • name: install nginx package  yum: name=nginx state=latest
        tags: instnginx

    • name: start nginx service  service: name=nginx enabled=true state=started


  • hosts: dbsrvs  remote_user: root
      tasks:


    • name: install redis package  yum: name=redis state=latest

    • name: install conf file  copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
        tags: instconf
        notify: restart redis service

    • name: start redis service  service: name=redis state=started
        handlers:

    • name: restart redis service  service: name=redis state=restarted


  查看任务,会显示对应的标签
  1
  ansible-playbook --list-tasks installpkg.yml
  指定标签,可以重新跑指定的标签命令,如他部分的命令不执行,如这里指定tag为instnginx,则只安装nginx包,但是不启动服务,其他部分的命令不会执行
  1
  ansible-playbook -t instnginx installpkg.yml
  同时跑多个标签,多个任务可以指定同一标签,比较灵活 。如以下配置中,把安装不同的服务包的tag都设置为instpkg,同时设置了 复制dbsrvs组的配置文件,设备复制文件的tag为instconf,同时执行多个tag间用逗号隔开
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  vim  /root/ansible/installpkg.yml


  • hosts: websrvs  remote_user: root
      tasks:


    • name: install nginx package  yum: name=nginx state=latest
        tags: instpkg

    • name: start nginx service  service: name=nginx enabled=true state=started


  • hosts: dbsrvs  remote_user: root
      tasks:


    • name: install redis package  yum: name=redis state=latest
        tags: instpkg

    • name: install conf file  copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
        tags: instconf
        notify: restart redis service

    • name: start redis service  service: name=redis state=started
        handlers:

    • name: restart redis service  service: name=redis state=restarted


  执行如下
  1
  ansible-playbook -t instpkg,instconf installpkg.yaml
  结果是websrvs组只安装nginx,但是没有启动nginx服务,同时dbsrvs安装了redis包而且复制了配置文件到对应的主机,而且在install conf file任务中配置了notify任务,所以dbsrvs组的redis服务会被启动
  例四:变量的使用
  通过变量pkgname安装相关的包
  1
  2
  3
  4
  5
  6
  7
  8
  vim installvar.yml


  • hosts: websrvs  remote_user: root
      vars:


    • pkgname: tree  tasks:

    • name: install package  yum: name={{ pkgname }} state=latest


  运行脚本,不指定变量默认是安装tree
  1
  ansible-playbook  installvar.yml
  指定变量,playbook命令行里定义的变量优先级比脚本里高,  这里会安装memcached,而不是脚本里的tree
  1
  ansible-playbook -e "pkgname=memcached"  installvar.yaml
  直接在host里定义变量,但是这个变量级别很低,比脚本里的变量还低
  1
  2
  3
  4
  vim /etc/ansible/hosts
  [websrvs]
  172.18.50.72 pkgname=redis
  172.18.50.75 pkgname=memcached
  1
  2
  3
  4
  5
  6
  7
  8
  vim /root/ansible/installvar.yml


  • hosts: websrvs  remote_user: root
      vars:


    • pkgname: tree  tasks:

    • name: install package  yum: name={{ pkgname }} state=latest


  执行命令
  1
  ansible-playbook  installvar.yaml
  则websrvs安装的服务包是tree,而不是/etc/ansible/hosts里赋值的变量
  去掉脚本里的变量
  1
  2
  3
  4
  5
  6
  vim /root/ansible/installvar.yaml


  • hosts: websrvs  remote_user: root
      tasks:


    • name: install package  yum: name={{ pkgname }} state=latest


  重新执行
  1
  ansible-playbook  installvar.yml
  则72主机安装服务包redis,75主机安装memcached
  例五:在配置文件里传递参数
  1
  2
  3
  4
  vim /etc/ansible/hosts
  [websrvs]
  172.18.50.72 pkgname=redis ansible_ssh_user=root ansible_ssh_pass=Pass123456
  172.18.50.75 pkgname=memcached

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-542604-1-1.html 上篇帖子: 自动化运维工具Ansible入门教程变量与facts 下篇帖子: ansible之 模板,条件测试,循环语句 使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表