在Ansible中,将各个模块组合起来成为一个YAML格式的配置文件,这个配置文件叫做Playbook,

Playbook和模块的关系类似于shell脚本和Linux命令之间的关系。

Playbook的定义

一个Playbook可以包含多个Play,一个Play必须包含:

  • hosts     定义在哪些服务器上执行
  • tasks     定义执行列表,task的语法:module: options

当options较长时可以采用缩进子块的形式。

- name: install apache

yum:

name: apache2

state: present

一个Playbook可以使用导入其它的Playbook

---

- inclued: db.yml

- include: web.yml

使用ansible-playbook执行Playbook

ansible的命令行参数:

  • -T TIMEOUT, --timeout=TIMEOUT        建立SSH的超时时间
  • --private-key=PRIVATE_KEY_FILE      SSH的私钥文件
  • -i INVENTORY, --inventory=INVENTORY  指定inventoey文件
  • -f FORKS, --forks=FORKS       并发的进程数,默认是5
  • --list-hosts  匹配到的服务器列表
  • --list-tasks  task列表
  • --step  每执行一个tasks暂停,等待用户确认
  • --syntax-check   检查palybook的语法
  • -C, --check  检查是否会修改远程服务器,相当于预测执行结果

Playbook定义变量

Ansible有多种定义变量的方法,对于playbook,最简单的就是定义在Playbook的vars项中;

  1. - hosts
  2. vars:
  3. mysql_port: 80

当变量多时,可以保存在一个独立的文件中

  1. ---
  2. - hosts: all
  3. vars:
  4. mysql_prot: 80
  5. vars_file:
  6. - /vars/external_vars.yml

变量文件的格式:

  1. ---
  2. process: 2000
  3. username: scott
注册变量

通过register获取上条命令的执行结果。并在下一个task中引用该变量

  1. - hosts: webservers
  2. tasks:
  3. - shell: /usr/bin/foo
  4. register: foo_result
  5. ignore_errors: True
  6.  
  7. - shell: /usr/bin/bar
  8. when: foo_result.rc == 5

Facts变量:

在Ansible中有些变量不需要进行任何设置就能直接使用,这些变量叫做Facts变量。

这些变量是Ansible从远程服务器上获取的系统信息。

可以通过setup模块查看。

ansible webservers -m setup

在Playbook中默认是收集远程机器信息的,可以设置为no,提高Ansible的执行效率。

-- hosts: dbservers

gather_facts: no

循环:

  1. ---
  2. - name: Install Mysql package
  3. yum: name={{ item }} state=installed
  4. with_items:
  5. - mysql-server
  6. - Mysql-python

条件:

  1. ---
  2. - hosts: webservers
  3. tasks:
  4. - command: echo {{ item }}
  5. with_items: [ 0,2,4,6,8]
  6. when: item > 5

 执行结果;

实例:

使用Playbook部署nginx

  1. ---
  2. - hosts: webservers
  3. become: yes
  4. become_method: sudo
  5. vars:
  6. worker_connections: 1024
  7. worker_processes: 4
  8. max_open_files: 65506
  9.  
  10. tasks:
  11. - name: install nginx
  12. yum: name=nginx update_cache=yes state=present
  13.  
  14. - name: copy nginx config file
  15. template: src=/root/study/Ansible/nginx.conf.j2 dest=/etc/nginx/nginx.conf
  16. notify: restart nginx
  17.  
  18. - name: copy index.html
  19. template:
  20. src: /root/study/Ansible/index.html.j2
  21. dest: /usr/share/nginx/www/index.html
  22. mode: 0644
  23. notify: restart nginx
  24.  
  25. handlers:
  26. - name: restart nginx
  27. service: name=nginx state=restarted

jinjia2模板文件:

  1. nginx.conf.j2
  1. worker_processes {{ worker_processes }};
  2. worker_rlimit_nofile {{ max_open_files }};
  3.  
  4. events {
  5. worker_connections {{ worker_connections }};
  6. }
  7.  
  8. http {
  9. server {
  10. listen 80 default_server;
  11. listen [::]:80 default_server ipv6only=on;
  12.  
  13. listen 443 ssl;
  14.  
  15. root /usr/share/nginx/html;
  16. index index.html index.htm;
  17.  
  18. server_name localhost;
  19.  
  20. location / {
  21. try_files $uri $uri/ =404;
  22. }
  23. }
  24. }

  

  1. index.html.j2
  1. <html>
  2. <head>
  3. <title>Welcome to ansible</title>
  4. </head>
  5. <body>
  6. <h1>nginx, configured by Ansible</h1>
  7. <p>If you can see this, Ansible successfully installed nginx.</p>
  8.  
  9. <p>{{ ansible_hostname }}</p>
  10. </body>
  11. </html>

访问主页;

部署MongoDB

  1. ---
  2. - hosts: dbservers
  3. become: yes
  4. become_method: sudo
  5. vars:
  6. mongodb_datadir_prefix: /data
  7. mongod_port: 27018
  8.  
  9. tasks:
  10. - name: Create the mongodb user
  11. user: name=mongodb comment="MongoDB"
  12.  
  13. - name: Create the data directory for the namenode metadata
  14. file: path={{ mongodb_datadir_prefix }} owner=mongodb group=mongodb state=directory
  15.  
  16. - name: Install the mongodb package
  17. apt: name={{ item }} state=installed
  18. with_items:
  19. - mongodb-server
  20. - mongodb-clients
  21. - rsyslog-mongodb
  22.  
  23. - name: create data directory for mongodb
  24. file:
  25. path: "{{ mongodb_datadir_prefix }}/mongo-{{ ansible_hostname }}"
  26. state: directory
  27. owner: mongodb
  28. group: mongodb
  29.  
  30. - name: create log directory for mongodb
  31. file: path=/var/log/mongo state=directory owner=mongodb group=mongodb
  32.  
  33. - name: Create the mongodb startup file
  34. template: src=mongod.j2 dest=/etc/init.d/mongod-{{ ansible_hostname }} mode=0655
  35.  
  36. - name: Create the mongodb configuration file
  37. template: src=mongod.conf.j2 dest=/etc/mongod-{{ ansible_hostname }}.conf
  38.  
  39. - name: Copy the keyfile for authentication
  40. copy: src=secret dest={{ mongodb_datadir_prefix }}/secret owner=mongodb group=mongodb mode=0400
  41.  
  42. - name: Start the mongodb service
  43. command: creates=/var/lock/subsys/mongod-{{ ansible_hostname }} /etc/init.d/mongod-{{ ansible_hostname }} start

  配置文件:mongod.conf.j2

  1. # mongo.conf
  2. smallfiles=true
  3.  
  4. #where to log
  5. logpath=/var/log/mongo/mongod-{{ ansible_hostname }}.log
  6.  
  7. logappend=true
  8.  
  9. # fork and run in background
  10. fork = true
  11.  
  12. port = {{ mongod_port }}
  13.  
  14. dbpath={{ mongodb_datadir_prefix }}mongo-{{ ansible_hostname }}
  15. keyFile={{ mongodb_datadir_prefix }}/secret
  16.  
  17. # location of pidfile
  18. pidfilepath=/var/run/mongod-{{ ansible_hostname }}.pid

另外还可以将Playbook抽象成role。

可以参考https://galaxy.ansible.com,下载别人写好的role

初始化role

ansible-galaxy init /etc/ansible/roles/websrvs

安装别人写好的role

ansible-galaxy install -p /etc/ansible/roles bennojoy.mysql

Ansible的Playbook的编写的更多相关文章

  1. Ansible进阶--playbook的使用

    一.什么是playbooksplaybooks是ansible的脚本.如同shell脚本一样,它是控制远程主机的一系列命令的集合,通过YAML语言编写.执行一些简单的任务,我们可以使用ad-hoc命令 ...

  2. ansible基础-playbook剧本的使用

    ansible基础-playbook剧本的使用 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.YAML概述 1>.YAML的诞生 YAML是一个可读性高,用来表达数据序 ...

  3. Ansible之playbook的使用总结 - 运维笔记

    之前详细介绍了Ansible的安装, 配置, 以及Ansible常用模块的使用. 下面对Ansible的playbook用法做一小结. 为什么引入playbook?一般运维人员完成一个任务, 比如安装 ...

  4. 自动化运维工具——ansible剧本playbook(三)

    一.Playbook--Ansible剧本 playbook是由一个或多个 "play"组成的列表 play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的ta ...

  5. Ansible基于playbook批量修改主机名实战

    Ansible基于playbook批量修改主机名 安装Ansible,相信这里也不用多说,大家都知道 说一下环境:这里的主机名是修改之后的,我先把其他两台的主机名改为别的 192.168.30.21 ...

  6. ansible使用playbook的简单例子(ansible2.9.7)

    一,ansible使用playbook的优点 1,用ansible执行一些简单的任务,使用ad-hoc命令就可以解决问题 如果执行复杂的功能,需要大量的操作,执行的ad-hoc命令会不够方便,这时我们 ...

  7. Ansible之playbook剧本

    Ansible之playbook剧本 目录 Ansible之playbook剧本 1. playbook的组成 2. 剧本示例test1 2.1 剧本制作 2.2 准备http.conf 2.3 运行 ...

  8. ansible学习-playbook的YAML语法

    [一篇非常好的ansible参考博文] 初识Ansible http://liumissyou.blog.51cto.com/4828343/1616462 --------------------- ...

  9. 利用ansible书写playbook在华为云上批量配置管理工具自动化安装ceph集群

    首先在华为云上购买搭建ceph集群所需云主机: 然后购买ceph所需存储磁盘 将购买的磁盘挂载到用来搭建ceph的云主机上 在跳板机上安装ansible 查看ansible版本,检验ansible是否 ...

随机推荐

  1. 基于CSS3飘带状3D菜单 菜单带小图标

    这次我们要来分享一款很特别的CSS3菜单,菜单的外观是飘带状的,并且每一个菜单项有一个精美的小图标,鼠标滑过菜单项时,菜单项就会向上凸起,像是飘带飘动一样,形成非常酷的3D视觉效果.这款CSS3飘带状 ...

  2. Speeding up image loading in WPF using thumbnails

    Technorati Tags: wpf, thumbnails, image, performance, slow, BitmapImage During a recent WPF session ...

  3. 自学QT之qss教程

    这篇文章来自于QT的帮助文档,你要是看了最新版的,会发现讲解得更棒.如果你的英文不是那么好,或者说看着头疼,那还是来看此篇吧. 在此之前说一个帮助文档的特别用法,绝不仅仅是搜单词,QT的文档非常强大的 ...

  4. 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)

    一.Qt环境设置 文件从window上传到Ubuntu后会显示乱码,原因是因为ubuntu环境设置默认是utf-8,Windows默认都是GBK.Windows环境下,Qt Creator,菜单-&g ...

  5. GRAPH ATTENTION NETWORKS

    基本就是第一层concatenate,第二层不concatenate. 相关论文: Semi-Supervised Classification with Graph Convolutional Ne ...

  6. 车小米O2O保养平台搭建完毕

    www.51chexiaomi.com 无忧车小米上线了,开展上海地区的试运营

  7. JDBC流ASCII和二进制数据

    PreparedStatement对象可以使用输入和输出流来提供参数数据.能够将整个文件放入可以容纳大值的数据库列,例如CLOB和BLOB数据类型. 有以下方法可用于流式传输数据 - setAscii ...

  8. Windows 2008安装Oracle10g提示操作系统版本检查未通过

    原文链接:http://www.cnblogs.com/emanlee/archive/2012/12/18/2824147.html 因开发环境需要,在Windows Server 2008 R2 ...

  9. PHP中单引号与双引号的区别分析

    From: http://www.jb51.net/article/53973.htm 在PHP中,我们可以使用单引号或者双引号来表示字符串.不过我们作为开发者,应该了解其中的区别.单引号与双引号对于 ...

  10. List&Map&Set的操作和遍历

    Java的三大集合即:Set.List.Map. Set:代表无序.不可重复的集合,常用的有HashSet(哈希表实现).TreeSet(红黑树实现): List:代表有序.可以重复的集合,比较常用的 ...