1.基本语法###

playbook文件格式为yaml语法.示例如下:

1.1 nginx.yaml

---
- hosts: all
tasks:
- name: Install Nginx Package
yum: name=nginx state=present - name: Copy Nginx.conf
template: src=./nginx.conf.j2 dest=/etc/nginx/nginx.conf owner=root group=root mode=0644 validate='nginx -t -c %s'
notify:
- Restart Nginx Service
handlers:
- name: Restart Nginx Service
service: name=nginx state=restarted

---第一行表示该文件是yaml文件,非必须,建议写上

  • hosts:all 定义该playbook针对的目标主机,all表示针对所有主机,这个参数支持Ad-Hoc模式的所有参数

    tasks: 定义该playbook所有的tasks集合
  • name: Install Nginx Package定义一个task的名称,建议根据task实际任务命名

    yum: name=nginx state=present 定义一个状态的action,这里使用yum模块,实现nginx软件包的安装

    第6行-第9行使用template模板去管理/etc/nginx/nginx.conf文件,owner,group定义该文件的属主及属组,使用validate参数指文件生成后使用nginx -t -c 检测配置文件语法,notify是触发handlers,如果同步后,文件md5值有变化的话会触发handler

    第10-12行定一个一个handler状态让Nginx去重启,

1.2 主机清单文件

cat /tmp/hosts

[nginx]
192.168.1.1
192.168.1.2
[nginx:vars]
ansible_python_interpreter=/usr/bin/python2.6

1.3 nginx.conf.j2

user                                    admin  admin;
worker_processes 8;
worker_cpu_affinity {{ ansible_processor_cores }};
error_log /export/servers/nginx/logs/nginx_error.log warn;
pid /export/servers/nginx/run/nginx.pid;
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
http
{
include mime.types;
default_type application/octet-stream;
server_tokens on;
log_format main '$remote_addr - $remote_user [$time_local] "$http_x_forwarded_for" "$http_j_forwarded_for" '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
#charset utf-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
sendfile on;
tcp_nopush on;
keepalive_timeout 0;
tcp_nodelay on;
client_body_buffer_size 512k;
fastcgi_intercept_errors on;
proxy_connect_timeout 90;
proxy_read_timeout 180;
proxy_send_timeout 180;
proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_intercept_errors on;
server_name_in_redirect off;
proxy_hide_header X-Powered-By; gzip on;
gzip_min_length 100;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 9;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
gzip_proxied any; include domains/*;
###########status#########
# server
# {
# listen 80;
# server_name status.360buy.com;
# location / {
# stub_status on;
# access_log off;
# }
# }
}

1.hosts文件里面定义了一个nginx组,里面有2个IP

2.组变量ansible_python_interpreter是ansible自带的影藏变量,是facts套件提供的;如果目标机器上python版本多,指定一个版本来运行

3.nginx.conf.j2是nginx.conf的模板文件,里面只针对worker_processes参数通过facts套件中的cpu核心数生成,其他配置都是默认的

1.4 检查yaml文件的语法是否正确

$ ansible-playbook -i /tmp/hosts nginx.yaml --syntax-check

1.5 检查yaml文件中的tasks任务

$ ansible-playbook -i /tmp/hosts nginx.yaml --list-task

1.6 检查yaml文件中的生效主机

$ ansible-playbook -i /tmp/hosts nginx.yaml --list-hosts

1.7 运行playbook

$ ansible-playbook -i /tmp/hosts nginx.yaml

1.8 运行playbook里面特定的某个task,从某个task开始运行

$ ansible-playbook -i /tmp/hosts nginx.yaml --start-at-task='Copy Nginx.conf'

2.变量与引用###

2.1 通过inventory文件定义主机以及主机组变量

太简单了,写了好多次了,这次不写了

2.2 通过playbook文件当前目录下新建group_vars和host_vars这2个目录(目录名字固定,不能改)

$ cat group_vars/nginx

---
key: NGINX

在当前目录下运行playbook的时候,会自动去找group_vars和host_vars这2个目录

2.3 通过ansible-playbook命令行参数传入

(1)命令行传递变量

$ ansible-playbook -i /tmp/hosts nginx.yaml -e "key=KEY"

(2)命令行传递变量文件

$ cat var.yaml
---
key: YAML
$ cat var.json
{"key":"JSON"}
$ ansible-playbook -i /tmp/hosts nginx.yaml -e "@var.json"
$ ansible-playbook -i /tmp/hosts nginx.yaml -e "@var.yaml"

2.4 在playbook文件内使用vars(用的很少)

---
- hosts: all
vars:
key: Ansible
tasks:
- name: xxx
deubg: msg="The {{ key}}"

2.5 在playbook文件内使用vars_files引用外部变量文件(也可以是json文件,后期开发api模式主要用这种方式)

---
- hosts: all
vars_files:
- var.yaml
- var.json

2.6 使用register内的变量

ansible的task之间还可以互相传递数据,把第一个task执行的结果register注册为变量然后传递给第二个task

---
- hosts: all
tasks:
- name: register variable
shell: hostname
register: info
- name: display variable
debug: msg="The msg is {{ info }}"
debug: msg="The msg is {{ info['stdout'] }}"

实际跑下看下结果(-l呢是在匹配主机inventory里面再进一步筛选,只跑192.168.1.118主机)

$ ansible-playbook -i /tmp/hosts variable.yaml -l 192.168.1.118

3.循环###

3.1 标准loops

分别打印one two这2个值

---
- hosts:all
tasks:
- name: debug loops
debug: msg = "name---> {{ item }}"
with_items:
- one
- two

with_items:值呢是python list数据结构,每个task会循环读取list里面的值,key的名称是item,当然支持列表里面嵌套字典,例子如下

---
- hosts:all
tasks:
- name: debug loops
debug: msg = "name-----> {{ item.key }} value---->{{ item.value }}"
with_items:
- {key:"one",value:"value1"}
- {key:"two",value:"value2"}

3.2 嵌套loops

实现一堆多或者多对多的合并

---
- hosts:all
tasks:
- name: debug loops
debug: msg="name ----->{{ item[0] }} value----->{{ item[1] }}"
with_nested:
- ['A']
- ['a','b','c']

3.3 字典循环

---
- hosts:all
tasks:
- name: debug loops
debug: msg="name ----->{{ item.key }} value----->{{ item.value }}"
with_dict: user

3.4 文件循环

---
- hosts:all
tasks:
- name: debug loops
debug: msg="{{ item }}"
with_fileglob:
- /tmp/*.yaml

3.5 随机循环

---
- hosts:all
tasks:
- name: debug loops
debug: msg="{{ item }}"
with_random_choice:
- "ansible1"
- "ansible2"
- "ansible3"

3.6 条件判断循环

---
- hosts:all
tasks:
- name: debug loops
shell: cat /root/ansible
register: host
until: host.stdout.startswith('Master')
retries:5
delay:5

5秒执行一次cat /root/ansible,将结果注册给变量host,判断host.stdout的内容是否以Master开头,条件成立,task运行完成,条件不成立,5秒后重试,5次还不成立,task运行失败

4.lookups###

从外部拉取信息,定义给一个变量的形式,lookups插件

Ansible自动化运维笔记3(playbook)的更多相关文章

  1. Ansible 自动化运维——剧本(playbook)

    Ansible 自动化运维--剧本(playbook) 1.playbook介绍: playbook是ansible用于配置,部署,和管理被控节点的剧本.通过playbook的详细描述,执行其中的ta ...

  2. Ansible自动化运维笔记2(Ansible的组件介绍)

    1.Ansible Inventory (1)静态主机文件 默认的ansible invetory是/etc/hosts文件,可以通过ANSIBLE_HOSTS环境变量或者通过运行命令的时候加上-i ...

  3. Ansible自动化运维笔记1(安装配置)

    1.Ansible的安装 pip install ansible==1.9.1 ansible1.9.1版本依赖的软件有 Python2.6以上版本 paramiko模块 PyYAML Jinja2 ...

  4. Ansible自动化运维工具-上

    [Ansible特点] 1)Ansible与saltstack均是基于Python语言开发的 2)安装使用简单,基于不同插件和模块实现各种软件,平台,版本的管理以及支持虚拟容器多层级的部署 3)不需要 ...

  5. ansible 自动化运维

    Ansible 自动化运维 ansible安装epel #yum list all *ansible*#yum install *ansible*#yum info ansible#rpm -ql a ...

  6. Ansible 自动化运维工具

    Ansible 自动化运维工具 Ansible是什么? Ansible是一个"配置管理工具"也是一个"自动化运维工具" Ansible 作用: Ansible是 ...

  7. 简单聊一聊Ansible自动化运维

    一.Ansible概述 Ansible是今年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误.Ansible通过本身集成的非常丰富的模块 ...

  8. Ansible自动化运维工具及其常用模块

    Ansible自动化运维工具及其常用模块 目录 Ansible自动化运维工具及其常用模块 一.Ansible简介 1. Ansible概述 2. Ansible作用 3. Ansible的工作模块 4 ...

  9. 一文详解 Ansible 自动化运维

    开源Linux 一个执着于技术的公众号 一.Ansible 概述 Ansible 是近年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误 ...

随机推荐

  1. 【转】sed正则表达式

    1 正则表达式简介 正则表达式(Regular Expression) 是一种描述文本(或字符串)模式的工具.正则表达式常用于查找文本的场合.想想一下我们日常生活中的例子,假如你想从电话本里找一个联系 ...

  2. openstack开发基础

  3. word文字覆盖问题

    我们在编写word文档时,偶尔会遇到这个问题: 在一个段落中的某个位置修改文字时,直接就把后面的字体给覆盖了,导致后面的句子也不完整了. 解决经过: 之前遇到这种情况,非常恼火,直接新建一个word文 ...

  4. [PHP]PDO占位符预处理在 IN 和 LIKE 中用法

    两点注意项: 1. 占位符 (?) 必须被用在整个值的位置,不需要引号等其它字符. 2. 参数按数组元素顺序依次传递给占位符. <?php /** * PDO基于占位符的查询预处理 * * @l ...

  5. 2、jQuery的一些静态方法

    上次粗略说了jQuery的整体结构,这次挑一些静态方法先说一下吧 一.noConflict函数 这个函数是个比较有意思的函数,基本上很少用到,之所以说他是因为这个函数在最下面,太显眼了,先把他解决掉. ...

  6. Java中的代码点和代码单元(转)

    文章来源:http://blog.csdn.net/weizhaozhe/article/details/3909079 这篇文章讲的很细,但是对于初学者也很难理解,在后面的笔记中,我会陈述自己的简单 ...

  7. JBOD

    JBOD(Just a Bunch Of Disks)不是RAID,它是可以把不同容量的硬盘串连成一个大的逻辑盘,与RAID0不同的是在写入数据时是向一个硬盘写入,写满后再向下一个硬盘写. 尽管建议采 ...

  8. 洛谷 [p1196] 银河英雄传说

    所谓带权并查集 本题所求的不止是两个编号之间是否有关系,还要求两个编号之间有什么关系,这就要求我们维护多个数组,fa[]数组维护两个编号之间的连通性,dis[]维护编号为i的战舰到fa[i]之间的距离 ...

  9. BZOJ 4407: 于神之怒加强版 [莫比乌斯反演 线性筛]

    题意:提前给出\(k\),求\(\sum\limits_{i=1}^n \sum\limits_{j=1}^m gcd(i,j)^k\) 套路推♂倒 \[ \sum_{D=1}^n \sum_{d|D ...

  10. linux指令札记

    1.有关文件压缩解压缩:Linux下自带了一个unzip的程序可以解压缩文件,解压命令是:unzip filename.zip 同样也提供了一个zip程序压缩zip文件,命令是 zip filenam ...