参考博客:

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. Button中command后面函数添加参数解决方法

    添加按钮,按钮的功效由command=函数名,后面的函数实现,但是如果直接写函数名,碰上那些需要参数的函数就会出错 因此,有个简单方法command=lambda:函数名(参数1,参数2.....) ...

  2. Luogu P3355 骑士共存问题

    题目链接 \(Click\) \(Here\) 二分图最大独立集.对任意两个可以相互攻击的点,我们可以选其中一个.对于不会互相攻击的,可以全部选中.所以我们只需要求出最大匹配,根据定理,二分图最大独立 ...

  3. jq实现百度图片移入移出内容提示框上下左右移动的效果

    闲来无聊,看到百度图片hover的时候提示框的效果,遂想试一试自己能否实现. 百度图片hover的效果: 需求: 1. 当鼠标从图片上部移入的时候,提示框从上部移到正常位置.从上部移出的时候,提示框从 ...

  4. org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].Standard

    Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lan ...

  5. 运维监控-基于yum的方式部署Zabbix Server 4.0 版本

    运维监控-基于yum的方式部署Zabbix Server 4.0 版本 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.如何选择zabbix版本 1>.打开zabbix官方 ...

  6. JAVA核心技术I---JAVA基础知识(列表List)

    一:List了解 (一)List:列表 –有序的Collection –允许重复元素 –{,,,{,},,} (二)List:主要实现 同步/非同步:针对线程而言 –ArrayList(非同步的) – ...

  7. Vue项目搭建

    1.环境搭建 安装node 官网下载安装包,傻瓜式安装:https://nodejs.org/zh-cn/ 安装cnpm npm install -g cnpm --registry=https:// ...

  8. axis 入门【原】

    Call call = (Call) service.createCall();call.setOperationName(new QName("命名空间地址", "方法 ...

  9. HDU 1575(裸矩阵快速幂)

    emmmmm..就是矩阵快速幂,直接附代码: #include <cstdio> using namespace std; ; ; struct Matrix { int m[maxn][ ...

  10. navicat and connection is being used

    1.在已经保存的连接上上编辑,测试连接成功,但是点击连接就会一直提示 connection is being used 2.需要新建一个连接,才能使用,不能再已保存的上面修改