参考博客:

Ansible 系列之 Playbooks 剧本 -飞走不可(博客园)

linux运维学习之ansible的playbook及roles的使用 - 51CTO博客

nginx 基于uwsgi部署Django - 51CTO博客

一、playbook相关模块

1、setup

$ ansible cache -m setup | more
ansible_all_ipv4_addresses # ipv4的所有地址
ansible_all_ipv6_addresses # ipv6的所有地址
ansible_date_time # 获取到控制节点时间
ansible_default_ipv4 # 默认的ipv4地址
ansible_distribution # 系统
ansible_distribution_major_version # 系统的大版本
ansible_distribution_version # 系统的版本号
ansible_domain #系统所在的域
ansible_env #系统的环境变量
ansible_hostname #系统的主机名
ansible_fqdn #系统的全名
ansible_machine #系统的架构
ansible_memory_mb #系统的内存信息
ansible_os_family # 系统的家族
ansible_pkg_mgr # 系统的包管理工具
ansible_processor_cores #系统的cpu的核数(每颗)
ansible_processor_count #系统cpu的颗数
ansible_processor_vcpus #系统cpu的总个数=cpu的颗数*CPU的核数
ansible_python # 系统上的python $ ansible cache -m setup -a 'filter=*processor*' # 用来搜索

正则表达式回顾:

* 匹配数量,表示0或者多次
? 匹配数量,表示0或者1次
. 除换行符以外的所有字符
+ 至少一次
[123abc] 中括号,匹配内容,里面的内容是或关系
() 分组
{m} 次数,出现m次
{m,} 至少m次
{m,n}出现m-n次
# 举例:
a*.b a出现0次或任意次,后面紧跟着任意的单个字符

2、when-条件判断

- hosts: web
tasks:
- name: content
copy: content="大弦嘈嘈如急雨" dest=/tmp/x.txt
when: data=="3"
- name: content
copy: content="小弦切切如私语" dest=/tmp/x.txt
when: data=="4" # 使用-e进行条件判断
ansible-playbook -e data=3 p6.yml
  • 不同的系统
  • 不同的版本
  • 不同的环境
  • 不同的用户
- hosts: web
tasks:
- name: createfile
file: path=/tmp/redhat.txt state=touch
when: ansible_os_family == "RedHat"
- name: createfile
file: path=/tmp/openbsd.txt state=touch
when: ansible_os_family == "OpenBSD" #ubuntu

3、tags

- hosts: web
tasks:
- name: installredis
yum: name=redis
- name: copyfile
copy: dest=/etc/redis.conf src=/root/playbook/redis.conf
tags: copyfile
- name: startredis
service: name=redis state=restarted
# 执行
ansible-playbook -t copyfile p7.yml

4、with_item-循环

一次性创建多个

- hosts: web
tasks:
- name: crateuser
user: name={{item}}
with_items:
- alex20
- alex21
- alex22
- hosts: web
tasks:
- name: createuser
user: name={{item}}
with_items:
- alex32
- alex33
- alex34
- name: creategroup
group: name={{item}}
with_items:
- wusir23
- wusir24
- wusir25

嵌套循环

- hosts: web
tasks:
- name: creategroup
group: name={{item}}
with_items:
- wusir33
- wusir34
- wusir35
- name: createuser
user: name={{item.user}} groups={{item.group}}
with_items:
- {"user":alex53,"group":wusir33}
- {"user":alex54,"group":wusir34}
- {"user":alex55,"group":wusir35}

5、template:

jinja2

- hosts: web
tasks:
- name: installredis
yum: name=redis
- name: copyfile
template: src=/root/playbook/redis.conf dest=/etc/redis.conf
- name: start
service: name=redis state=started # redis.conf
配置文件: bind {{ ansible_default_ipv4.address }}

copy和tamplate的区别

  • copy模块不替代参数
  • template模块替代参数
- hosts: web
tasks:
- name: installredis
yum: name=redis
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf
- name: start
service: name=redis state=started

ps:写相对路径: 在当前目录下新建一个templates(注意是复数啊)目录,然后把文件放在templates目录里面

6、handlers

修改配置文件

- hosts: web
tasks:
- name: installredis
yum: name=redis
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf
tags: copyfile
notify: restart
- name: start
service: name=redis state=started
handlers:
- name: restart
service: name=redis state=restarted

回顾 playbook

传参

条件判断 when

循环 with_items item

嵌套循环 字典 通过点来取值

标签 tags -t 来传递标签

模板 template

handlers 不会执行, notify

二、roles

1.特点:

  • 目录清晰
  • 可以互相调用

2.roles文件夹

文件夹里面是要创建的每一个角色,每一个角色一个文件夹
- 每一个角色里面都有tasks(必须的),templates,files,handlers,vars目录
- 每个目录都要有main.yml文件,通过import_tasks来调用
- 其中templates文件夹中的文件可以通过相对路径来调用

目录结构:

nginx/
├── files #静态文件
├── handlers #被触发的动作
│   └── main.yml
├── tasks #任务列表
│   ├── copyfile.yml
│   ├── installnginx.yml
│   ├── main.yml #入口文件
│   └── start.yml
├── templates #模板文件
│   └── nginx.conf
└── vars #变量

查找顺序

1. roles目录,对应的文件夹

2. tasks:先找tasks目录里面的main.yml文件,看到import_tasks来导入别的yml文件,这个是必须的

3. templates: 找这个目录里面的模板文件,在tasks里面是可以用相对路径来写

4. vars:先找main.yml文件,如果找到就找变量替换

5. hanlers:先找main.yml文件,如果找到,则在tasks里面通过notify来触发

6. files: 放的是静态文件

相互调用

通过import_tasks来相互调用: roles/{nginx|uwsgi|···}/tasks/taskfile.yml

其中files文件夹中的文件是否可以通过相对路径来调用?

3.怎么使用

跟roles同级目录下,写nginx.yml文件

- hosts: web
roles:
- nginx

4.使用roles安装nginx和uwsgi:

1.创建nginx的roles目录:

2.在tasks文件夹下编辑任务:

3.更改nginx.conf配置

worker_connections 102400;  #最大连接数
worker_processes {{ansible_processor_vcpus}}; #工作进程数

4.目录结构

nginx/
├── files #静态文件
├── handlers #被触发的动作
│   └── main.yml
├── tasks #任务列表
│   ├── copyfile.yml
│   ├── installnginx.yml
│   ├── main.yml #入口文件
│   └── start.yml
├── templates #模板文件
│   └── nginx.conf
└── vars #变量

安装uwsgi

[root@centos7-0 ~/roles/uwsgi]#: !mkdir  #执行上一次mkdir的操作
mkdir -v {tasks,templates,files,vars,handlers}
mkdir: created directory ‘tasks’
mkdir: created directory ‘templates’
mkdir: created directory ‘files’
mkdir: created directory ‘vars’
mkdir: created directory ‘handlers’

Linux知识点补充:

iptables -F # 临时关闭防火墙

setenforce 0 #用来临时关闭selinux
vi /etc/selinux/config #永久关闭SELinux
SELINUX=disabled

5.nginx +uwsgi配置方式

第一种

uwsgi配置文件里面是http= 0.0.0.0:8000

nginx配置文件是proxy_pass http://127.0.0.1:8000;

第二种方式

uwsgi配置文件里面是socket= 0.0.0.0:8000

nginx配置文件是

include /etc/nginx/uwsgi.conf

uwsgi_pass 127.0.0.1:8000;

第三种方式

uwsgi配置文件里面是socket=/data/mysite/mysite.socket

nginx配置文件是

include /etc/nginx/uwsgi.conf

uwsgi_pass unix:/data/mysite/mysite.socket;

6.用roles安装Redis

# 需求:
# - 监听地址为本机的内网IP地址
# - 设置密码
# - 设置落地方式
- hosts: web
tasks:
- name: installredis
yum: name=redis
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf
- name: startredis
service: name=redis state=started
handlers:
- name: restartredis
service: name=redis state=restarted

7.用roles安装MariaDB

- hosts: web
tasks:
- name: copyfile
template: src=/etc/yum.repos.d/Mariadb.repo dest=/etc/yum.repos.d/Mariadb.repo
- name: installmariadb
yum: name=mariadb-server,mariadb
- name: startmaridb
service: name=mariadb state=started
handlers:
- name: restartmariadb
service: name=mariadb state=restarted mysql/
├── files
├── handlers
├── tasks
│   ├── copyfile.yml
│   ├── installmariadb.yml
│   ├── main.yml
│   └── startmariadb.yml
├── templates
│   └── Mariadb.repo
└── vars

PS:打包命令

tar -zcvf roles.tar.gz roles #将roles文件夹打包为roles.tar.gz文件

8.用roles来完成nginx+uwsgi配置django项目

# 大体步骤
第一步:安装包组和pip
yum groupinstall "Development tools"
yum install python2-pip
ansible web -m yum -a 'name=python2-pip'
ansible web -m yum -a 'name="@Development Tools"' # 用来安装包组 第二步:安装django
pip install django
ansible web -m pip -a "name=flask" 第三步:安装uwsgi
yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
yum install python-devel
pip install uwsgi 第四步:配置好django项目
copy - 将django项目mysite文件夹存放到files文件夹下
其中,已配置好的uwsgi.ini文件已存放在mysite文件下了 第五步:启动uwsgi
uwsgi --ini uwsgi.ini 第六步:配置nginx信息 第七步:关闭SELinux
vim /etc/selinux/config
SELinux=disabled
systemctl restart nginx

uwsgi的配置目录:

uwsgi/
├── files
│   └── mysite #django项目
├── handlers
├── tasks
│   ├── copyfile.yml
│   ├── install.yml
│   ├── main.yml
│   ├── startuwsgi.yml
│   └── stopiptables.yml
├── templates
└── vars

其中,install.yml文件:

- name: installtools
yum: name="@Development Tools"
- name: installpythondev
yum: name=python2-pip,zlib-devel,bzip2-devel,pcre-devel,openssl-devel,ncurses-devel,sqlite-devel,readline-devel,tk-devel,python-devel
- name: installdjango
pip: name=django version=1.11.16
- name: installuwsgi
pip: name=uwsgi

执行结果:

  • 待完成:nginx的roles配置,并且和uwsgi相互调用

PS:上面的roles配置过程并不详细,只是大体的思路

内容总结

  • when
  • with_items item
  • 循环嵌套
  • template 支持jinja2的语法
  • tags 指定标签,给某个任务加上标签
  • handlers 执行别触发的任务
  • notify 来触发
  • setup 获取的被控节点上的一些系统的参数
  • roles
    • 目录结构清晰
    • 可以相互调用
    • tasks
    • files
    • templates
    • vars
    • handlers

先找main.yml,用improt_tasks来导入

ansible学习笔记三:playbook和roles的更多相关文章

  1. ansible学习笔记一

    ansible学习笔记一 参考博客: ansible学习 - 51CTO博客 一.安装 1 .下载epel源 wget -O /etc/yum.repos.d/epel.repo http://mir ...

  2. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  3. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  4. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  5. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  6. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  7. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  8. NumPy学习笔记 三 股票价格

    NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

随机推荐

  1. bzoj4566 找相同字符

    题意:给定两个字符串,从中各取一个子串使之相同,有多少种取法.允许本质相同. 解:建立广义后缀自动机,对于每个串,分别统计cnt,之后每个点的cnt乘起来.记得开long long #include ...

  2. (转)Java并发编程:线程池的使用

    背景:线程池在面试时候经常遇到,反复出现的问题就是理解不深入,不能做到游刃有余.所以这篇博客是要深入总结线程池的使用. ThreadPoolExecutor的继承关系 线程池的原理 1.线程池状态(4 ...

  3. 跟我一起写一个hello-world react组件并发布到npm

    第一步:初始化我们的配置 $ mkdir react-hello-world $ cd react-hello-world/ $ npm init -y 修改我们的package.json文件 //p ...

  4. MySQL常用的一些函数

    内容太多,走链接: MySQL函数大全

  5. linux系统调用之文件系统操作

    access 确定文件的可存取性 chdir 改变当前工作目录 fchdir 参见chdir chmod 改变文件方式 fchmod 参见chmod chown 改变文件的属主或用户组 fchown ...

  6. bash 4

    1)获取字符串长度: str="jwwjww" #str=‘jwwjww’//单引号双引号都一样 echo ${#str} 结果:6 2)提取子字符串 echo ${#str:1: ...

  7. 从 date 中取出 小时和分钟进行比较

    public class T1 { public static void main(String[] args) throws ParseException { SimpleDateFormat df ...

  8. Eclipse搭建SpringBoot之HelloWorld

    你的eclipse需要先安装 Spring Tool Suite™ 第一种方法(不建议,之所以贴上是因为探索的过程) 首先新建Maven工程 勾选第一个按钮,第三个是选择working set ,你可 ...

  9. Salt初识和安装

    Salt Salt是一个配置管理系统,能够根据定义的状态,配置远程节点,比如保证远程节点上指定的安装包安装,运行指定的服务.Salt也是一个分布式远程执行系统,用于在远程节点上执行命令和请求数据,不论 ...

  10. 线程(Thread)

    package cn.gouzao.demo3; public class ThreadDemo extends Thread{ public void run(){ for(int i=0;i< ...