ansible学习笔记三:playbook和roles
参考博客:
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的更多相关文章
- ansible学习笔记一
ansible学习笔记一 参考博客: ansible学习 - 51CTO博客 一.安装 1 .下载epel源 wget -O /etc/yum.repos.d/epel.repo http://mir ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- NumPy学习笔记 三 股票价格
NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
随机推荐
- bzoj4566 找相同字符
题意:给定两个字符串,从中各取一个子串使之相同,有多少种取法.允许本质相同. 解:建立广义后缀自动机,对于每个串,分别统计cnt,之后每个点的cnt乘起来.记得开long long #include ...
- (转)Java并发编程:线程池的使用
背景:线程池在面试时候经常遇到,反复出现的问题就是理解不深入,不能做到游刃有余.所以这篇博客是要深入总结线程池的使用. ThreadPoolExecutor的继承关系 线程池的原理 1.线程池状态(4 ...
- 跟我一起写一个hello-world react组件并发布到npm
第一步:初始化我们的配置 $ mkdir react-hello-world $ cd react-hello-world/ $ npm init -y 修改我们的package.json文件 //p ...
- MySQL常用的一些函数
内容太多,走链接: MySQL函数大全
- linux系统调用之文件系统操作
access 确定文件的可存取性 chdir 改变当前工作目录 fchdir 参见chdir chmod 改变文件方式 fchmod 参见chmod chown 改变文件的属主或用户组 fchown ...
- bash 4
1)获取字符串长度: str="jwwjww" #str=‘jwwjww’//单引号双引号都一样 echo ${#str} 结果:6 2)提取子字符串 echo ${#str:1: ...
- 从 date 中取出 小时和分钟进行比较
public class T1 { public static void main(String[] args) throws ParseException { SimpleDateFormat df ...
- Eclipse搭建SpringBoot之HelloWorld
你的eclipse需要先安装 Spring Tool Suite™ 第一种方法(不建议,之所以贴上是因为探索的过程) 首先新建Maven工程 勾选第一个按钮,第三个是选择working set ,你可 ...
- Salt初识和安装
Salt Salt是一个配置管理系统,能够根据定义的状态,配置远程节点,比如保证远程节点上指定的安装包安装,运行指定的服务.Salt也是一个分布式远程执行系统,用于在远程节点上执行命令和请求数据,不论 ...
- 线程(Thread)
package cn.gouzao.demo3; public class ThreadDemo extends Thread{ public void run(){ for(int i=0;i< ...