1.Playbook详解

playbook是一个非常简单的配置管理和多主机部署系统,可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式.

核心元素

Hosts:主机

Tasks:任务,由模板定义的操作列表

Variables:变量

Templates:模板,即使用模板语法的文件

Handlers:处理器,当某条件满足时,触发执行的操作

Roles:角色

cat test.yaml
- hosts: all
remote_user: root
tasks:
- name: install redis
yum: name=redis state=latest
- name: copy config file
copy: src=/root/playbook/redis.conf dest=/etc/redis.conf owner=redis
notify: restart redis
tags: ChangeConfigFile
- name: start redis
service: name=redis state=started
handlers:
- name: restart redis
service: name=redis state=restarted
# 检查yaml文件的语法是否正确
ansible-playbook test.yaml --syntax-check
# 检查tasks任务
ansible-playbook test.yaml --list-task
# 检查生效的主机
ansible-playbook test.yaml --list-hosts
# 干跑一遍
ansible-playbook -C test.yaml
# 指定从某个task开始运行
ansible-playbook test.yaml --start-at-task='Copy Nginx.conf'
ansible-playbook test.yaml -t ChangeConfigFile

Handlers:如果触发了指定条件,则notify就会通知handlers执行对应操作.

2.引入变量

# 引用变量,收集主机facts变量
ansible-doc -s setup
ansible 10.0.0.51 -m setup
直接引用Ansible变量
- hosts: all
remote_user: root
tasks:
- name: copy file
copy: content={{ ansible_env }} dest=/opt/ansibel_env.txt
自定义变量
- hosts: all
remote_user: root
tasks:
- name: install package {{ pkgname }}
yum: name={{ pkgname }} state=latest ansible-playbook -e pkgname=memcache -C forth.yaml
引用主机变量,在组的主机后面添加变量
[webservers]
10.0.0.51 ansibel_ssh_port=9122 ansibel_ssh_user=lixiang ansibel_ssh_pass=lixiang
10.0.0.52
第二种方式
[webservers:vars]
http_port=8080 三种调用方式示例
- hosts: webservers
remote_user: root
vars:
- pbvar: playbook Var test
tasks:
- name: command line var
copy: content={{ cmdvar }} dest=/tmp/cmd.var
- name: playbook var
copy: content={{ pbvar }} dest=/tmp/pb.var
- name: host iventory var
copy: content={{ http_port }} dest=/tmp/host.var
# cmdvar传值,中间有空格,会不识别
ansible-playbook -e cmdvar="command line var" vars.yaml

3.Templates介绍

# redis.conf.j2这个文件是从一个redis文件拷贝而来,修改了bind这一行
head /root/playbook/redis.conf.j2
bind {{ ansibel_eth0.ipv4.address4}}
cat templete.yaml
- hosts: webservers
remote_user: root
tasks:
- name: templete config file
templete: src=/root/playbook/redis.conf.j2 dest=/tmp/redis.conf

4.条件判断

条件测试-when语句:
tasks:
- name: install conf file to centos7
templete: src=/path/nginx.conf.c7.j2 dest=/etc/nginx/conf.d/nginx.conf
when: ansible_distribution_major_version == "7"
- name: install conf file to centos6
templete: src=/path/nginx.conf.c6.j2 dest=/etc/nginx/conf.d/nginx.conf
when: ansible_distribution_major_version == "6" 多条件判断
tasks:
- name: install conf file to centos7
templete: src=/path/nginx.conf.c7.j2 dest=/etc/nginx/conf.d/nginx.conf
when:
- ansible_distribution == "CentOS"
- ansible_distribution_major_version == "7"
组合条件判断
tasks:
- name: install conf file to centos7
templete: src=/path/nginx.conf.c7.j2 dest=/etc/nginx/conf.d/nginx.conf
when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "7" ) or
(ansible_distribution == "RedHat" and ansible_distribution_major_version == "7" ) 迭代:有需要循环执行任务时,可以使用迭代机制
cat iter.yaml
- hosts: webservers
remote_user: root
tasks:
- name: install {{ item }} package
yum: name={{ item }} state=latest
with_item:
- nginx
- tomcat
- mariadb-server
- redis

5.角色(roles)

每个角色,以特定的层级目录结构进行组织.

mysql/

files/:存放由copy或script等模块调用的文件;

templetes/:templete模块查找所需要模板文件的目录;

tasks/:至少应该包含一个名为main.yml的文件,其它的文件需要在此文件中通过include进行包含;

handlers/:至少应该包含一个名为main.yml的文件,其它的文件需要在此文件中通过include进行包含;

vars/:至少应该包含一个名为main.yml的文件,其它的文件需要在此文件中通过include进行包含;

meta/:至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系,其它的文件需要在此文件中通过include进行包含;

default/:设定默认变量时使用此目录中的main.yaml文件.

# 配置文件中指定了roles路径
roles_path=/etc/ansible/roles
mkdir -pv /etc/ansible/roles/nginx/{files,templetes,tasks,vars,handlers,meta,default}
cat /etc/ansible/roles/nginx/tasks/main.yml
- name: install nginx
yum: name=nginx state=latest
when: ansible_os_family == "RedHat"
- name: install conf
templete: src=vhost1.conf.j2 dest=/etc/nginx/conf.d/vhost1.conf
tags: conf
notify: restart nginx
- name: create site home-directory
file: path={{ ngxhomedir }} state=directory
- name: create index page
copy: src=index.html dest={{ ngxhomedir }}/
- name: start nginx
service: name=nginx state=started # 定义变量时,不用加横线
cat /etc/ansible/roles/nginx/vars/main.yml
ngxhomedir: /ngxdata/vhost1 cat /etc/ansible/roles/nginx/files/index.yml
<h1>Vhost1</h1> cat /etc/ansible/roles/nginx/handlers/main.yml
- name: restart nginx
service: name=nginx state=restarted cat nginx.yml
- hosts: webservers
remote_user: root
roles:
- nginx cat /etc/ansible/roles/nginx/templetes/vhost1.conf.j2
server{
listen 8080;
server_name {{ ansibel_fqdn}};
location / {
root "/ngxdata/vhost1";
}
}

参考博客:https://blog.51cto.com/13630803/2154192

Ansible之Playbook详解的更多相关文章

  1. Ansible之Playbook详解、案例

    什么是playbook playbooks是一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活.简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的 ...

  2. ansible:playbook详解

    Blog:博客园 个人 概述 playbook是由一个或者多个play组成的列表. 主要功能是将预定义的一组主机装扮成事先通过ansible中的task定义好的角色.task实际是调用ansible的 ...

  3. 3.3、Ansible命令参数详解

    0.ansible 命令参数详解: [root@localhost ~]# ansible Usage: ansible <host-pattern> [options] Options: ...

  4. Ansible Facts 变量详解

    Ansible Facts 变量详解与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. ...

  5. ansible自动化运维详细教程及playbook详解

    前言 当下有许多的运维自动化工具( 配置管理 ),例如:Ansible.SaltStack.Puppet.Fabric 等. Ansible 一种集成 IT 系统的配置管理.应用部署.执行特定任务的开 ...

  6. ansible中的playbook详解

    首先简单说明一下playbook,playbook是什么呢?根本上说playbook和shell脚本没有任何的区别,playbook就像shell一样,也是把一堆的命令组合起来,然后加入对应条件判断等 ...

  7. Ansible Playbook 详解

    一.playbook 的简单使用 1.创建文件实例 (1)编辑配置文件 [root@tiejiangSRC1 ~]# cd /etc/ansible/ [root@tiejiangSRC1 ansib ...

  8. ansible playbook详解

    ansible playbook是由yml语法书写,结构清晰,可读性强,所以必须掌握yml基础语法 语法 描述 缩进 YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成,不能使用tabs键 ...

  9. Ansible 常用模块详解

    经过前面的介绍,我们已经熟悉了 Ansible 的一些常识性的东西和如何编译安装Ansible,从本章开始我们将全面介绍 Ansible 的各种生产常用模块,这些也是我们使用 Ansible 的过程中 ...

随机推荐

  1. Android stadio 调试太掉了

    1.evalute expresstion 可以看任何变量的任何属性,就算是一个字符串url,你可以url.length(),你不用输入完就有提示.对象的方法有提示! 2.调试技巧 就是当一行里面有很 ...

  2. 单例模式【python】

    在python中,如需让一个类只能创建一个实例对象,怎么能才能做到呢? 思路:1.通过同一个类创建的不同对象,都让他们指向同一个方向.   2.让个类只能创建唯一的实例对象. 方法:用到 _ _new ...

  3. 37、iamgeview 图层叠加

    1 Drawable d1 = new BitmapDrawable(circleBitmap); Drawable d2 = login.this.getResources().getDrawabl ...

  4. python学习-- django 2.1.7 ajax 请求 进阶版

    #原来版本 $.get("/add/",{'a':a,'b':b}, function(ret){ $('#result').html(ret)}) #进阶版  $.get(&qu ...

  5. Lambda表达式的本质

    //.net 1.0写法 /*delegate bool MyMethod(string s); bool myMethod(string s) { return s.IndexOf("ab ...

  6. iptables端口转发命令

    需求很简单,把本地81端口映射到8080端口上 1. 所有的81请求转发到了8080上.   1 # iptables -t nat -A PREROUTING -p tcp --dport 81 - ...

  7. [tsinsen_A1278]串珠子

    [tsinsen_A1278]串珠子 试题描述 铭铭有 \(n\) 个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数 \(1\) ...

  8. 【POJ3693】Maximum repetition substring (SA)

    这是一道神奇的题目..论文里面说得不清楚,其实是这样...如果一个长度为l的串重复多次,那么至少s[1],s[l+1],s[2*l+1],..之中有相邻2个相等...设这时为j=i*l+1,k=j+l ...

  9. UVALive 6319 暴力

    思路:直接vector暴力 #include<iostream> #include<vector> #include<cstring> #include<cs ...

  10. 人类基因(human)

    题目描述 上了大学之后,小W和小Z一起报了一门三宝课,在实践课上遇到了一些问题. 一条染色体上有nn对基因,每种基因都可以用一个数ai来表示,作为标号. 现在,在其中一条染色单体上某基因发生了突变. ...