ansible初识三
一、setup模块
ansible的 setup模块主要用来收集信息, 查看参数:
[root@localhost ~]# ansible-doc -s setup # 查看参数,部分参数如下:
filter # 过滤,筛选
示例一:查看所有信息
ansible cache -m setup # 查看cache组的被管控机的信息, 可查到部分信息如下
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*' #用来搜索, *代表匹配任意个任意字符,可自行回顾正则表达式相关知识,可得如下信息
192.168.133.132 | SUCCESS => {
"ansible_facts": {
"ansible_processor": [
"",
"GenuineIntel",
"Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz"
],
"ansible_processor_cores": 1,
"ansible_processor_count": 1,
"ansible_processor_threads_per_core": 1,
"ansible_processor_vcpus": 1
},
"changed": false
}
二、ansible剧本
1、条件判断
ansible的playbook 支持条件判断, 当针对不同系统, 不同版本, 不同环境, 不同用户有不同操作时,可以使用 when 做条件判断, 示例如下:
[root@localhost yaml]# vi p5.yml # 写一个yml文件,内容如下:
- hosts: db
remote_user: root
tasks:
- name: createfile3
copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt
when: a==""
- name: createfile4
copy: content="小弦切切如私语" dest=/tmp/a.txt
when: a==""
[root@localhost yaml]# ansible-playbook --syntax-check p5.yml # 验证语法合法性 playbook: p5.yml
[root@localhost yaml]# ansible-playbook -e 'a="3"' p5.yml # 只执行name为 createfile3 的任务,结果自行验证
3、循环with_items
通常你想在一个任务中干很多事,比如创建一群用户、安装很多包、或者重复一个轮询步骤直到收到某个特定结果,这时就可以使用循环。
循环里面只能是 item
示例一:单个循环
[root@localhost yaml]# vi p7.yml
- hosts: web
tasks:
- name: createuser
user: name={{ item }}
with_items:
- zhangsan
- lisi
- wangwu
[root@localhost yaml]# ansible-playbook --syntax-check p7.yml playbook: p7.yml
[root@localhost yaml]# ansible-playbook p7.yml
示例二:多个循环
[root@localhost yaml]# vi p8.yml # 写入如下内容
- hosts: web
tasks:
- name: createuser
user: name={{ item }}
with_items:
- zs
- lss
- ww
- name: creategroup
group: name={{ item }}
with_items:
- yunwei
- kaifa
- ceshi
[root@localhost yaml]# vi p8.yml
[root@localhost yaml]# ansible-playbook --syntax-check p8.yml playbook: p8.yml
[root@localhost yaml]# ansible-playbook p8.yml # 执行命令,结果自行验证
示例三:循环嵌套
[root@localhost yaml]# vi p9.yml # 写入如下内容
- hosts: web
tasks:
- name: creategroup
group: name={{ item }}
with_items:
- yunwei
- kaifa
- ceshi
- name: createuser
user: name={{ item.name }} group={{ item.group }}
with_items:
- {'name':zs,'group':yunwei}
- {'name':lss,'group':kaifa}
- {'name':ww,'group':ceshi}
[root@localhost yaml]# ansible-playbook p9.yml # 结果自行验证 playbook: p9.yml
[root@localhost yaml]# ansible-playbook p9.yml
4、template模块
先来回忆一下redis的安装,为了安全起见,我们通常在redis安装完成后要更改redis的配置文件redis.conf,其中有一项是更改bind参数,让redis可以远程访问,实际开发中bind 参数为本机对外ip地址,而不能使用0.0.0.0开启,这时,问题来了,使用ansible批量传输配置文件时,如何将bind参数设置为被管控机的ip地址?
首先,我们使用setup模块查询一下被管控机的ip地址,如下:
在管控机上安装redis后,编辑配置文件redis.conf,更改bind参数如下:
vi /etc/redis.conf # 编辑redis配置文件,更改bind参数为如下内容
示例:
[root@localhost yaml]# vi p10.yml
- hosts: web
tasks:
- name: install
yum: name=redis
- name: copyfile
template: src=/etc/redis.conf dest=/etc/redis.conf
- name: start
service: name=redis state=started
[root@localhost yaml]# ansible-playbook --syntax-check p10.yml playbook: p10.yml
[root@localhost yaml]# ansible-playbook p10.yml
验证:查看web组的被管控机的redis配置文件中bind参数
copy 模块与template 模块的区别: copy 模块不替换参数, 而template模块替换参数.使用相对路径: 在上面p10.yml 中, template模块的src参数使用的是绝对路径, 除此之外,我们还可以使用相对路径,如下 :
[root@localhost yaml]# vi p10.yml
- hosts: web
tasks:
- name: install
yum: name=redis
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf
- name: start
service: name=redis state=started
[root@localhost yaml]# ansible-playbook --syntax-check p10.yml playbook: p10.yml
[root@localhost yaml]# ansible-playbook p10.yml
注意: 使用相对路径的前提是在当前目录 (p10.yml 文件所在目录) 下 新建一个templates (必须叫这个) 目录, 然后把文件redis.conf放在templates目录里面
5、handlers
上面我们曾提到过, modul 具有 "幂等" 性, 所以当远端系统被人修改时, 可以重放 playbooks 达到恢复的目的, playbooks 本身可以识别这种改动, 并且有一个基本的event sysem(事件系统), 可以响应这种改动, (当发生改动时) 'notify' actions 会在playbook的每一个task结束时触发, 而且即使有多个不同的task 通知改动的发生 , notify actions 只会被触发一次.
举例来说,比如多个 resources 指出因为一个配置文件被改动,所以 apache 需要重新启动,但是重新启动的操作只会被执行一次。
'notify' 下列出的即是 handlers。Handlers 也是一些 task 的列表,通过名字来引用,它们和一般的 task 并没有什么区别。Handlers 是由通知者进行 notify,如果没有被 notify,handlers 不会执行,不管有多少个通知者进行了 notify,等到 play 中的所有 task 执行完成之后,handlers 也只会被执行一次。
示例:
[root@localhost yaml]# vi p11.yml
- hosts: web
tasks:
- name: install
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
[root@localhost yaml]#
[root@localhost yaml]# ansible-playbook --syntax-check p11.yml playbook: p11.yml
[root@localhost yaml]#
[root@localhost yaml]# ansible-playbook p11.yml
[root@localhost yaml]# ansible-playbook -t copyfile p11.yml # 执行copyfile任务 和 restart任务,即修改完配置文件后重启redis服务
三、roles
现在我们已经学过 tasks 和 handlers,那怎样组织 playbook 才是最好的方式呢?简单的回答就是:使用 roles ! roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles 。
roles的优点:
- 目录清晰
- 可以互相调用
roles目录结构:
- 文件夹里面是要创建的每一个角色,每一个角色一个文件夹;
- 每一个角色里面都有tasks(必须的),templates,files,handlers,vars目录;
- 每个目录都要有main.yml文件,通过import_tasks来调用;
- 其中templates文件夹中的文件可以通过相对路径来调用;
其中files文件夹中的文件是否可以通过相对路径来调用?
示例:
root
├── roles
│ ├── cache
│ ├── db
│ └── web
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── tasks
│ │ ├── copy_redis_conf.yml
│ │ ├── install_redis.yml
│ │ ├── main.yml
│ │ └── start_redis.yml
│ ├── templates
│ │ └── redis.conf.j2
│ └── vars
└── web.yml
- name: install_redis
yum: name=redis
root/roles/web/tasks/install_redis.yml
- name: copy_redis_conf
template: src=redis.conf.j2 dest=/etc/redis.conf
tags: copy_redis_conf
notify: restart_redis
root/roles/web/tasks/copy_redis_conf.yml
- name: start_redis
service: name=redis state=started
root/roles/web/tasks/start_redis.yml
- import_tasks: install_redis.yml
- import_tasks: copy_redis_conf.yml
- import_tasks: start_redis.yml
root/roles/web/tasks/main.yml
- name: restate_redis
service: name=redis state=restarted
root/roles/web/handlers/main.yml
- hosts: web
remote_user: root
roles:
- web
root/web.yml
ansible-playbook web.yml
ansible-playbook -t copy_redis_conf web.yml # 修改配置文件后加参数-t,触发handler中任务
四、nginx基于uwsgi部署django
参考博客:https://blog.51cto.com/wangfeng7399/2341281
思考:如何用roles 来安装nginx+uwsgi+mariadb + redis?
ansible初识三的更多相关文章
- ansible入门三(Ansible的基础元素和YAML介绍)
Ansible的基础元素和YAML介绍 本节内容: YAML Ansible常用的数据类型 Ansible基础元素 一.YAML 1. YAML介绍 YAML是一个可读性高的用来表达资料序列的格式 ...
- ansible初识二
一.ansible模块(yum.pip.service.conr.user.group) 上篇中我们已经学了ansible 的几个模块, 接下来再来学习几个, 那么你是否知道ansible 一共有多少 ...
- Ansible系列(三):YAML语法和playbook写法
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- ansible初识
ansible: 运维自动化的工具, 基本功能, 基于ssh远程连接, 连接验证(ssh-keygen ssh-copy-id ip) 下载: 1. 安装epel源 wget -O /etc/yum ...
- python初识(三)
目录: 字符编码 文件操作 循环结构拾遗 函数 整体介绍 函数的参数 函数的返回值 函数的调用 自定义函数 一.字符编码 1.了解字符编码的知识储备 a. 文件编辑存取文件的原理(nodepad++, ...
- 1、Ansible初识简要介绍及安装
1.Ansible简介 1.1 Ansible介绍 Ansible 是一个简单的自动化运维管理工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fab ...
- ansible(三)
setup ansible_all_ipv4_addresses # ipv4的所有地址 ansible_all_ipv6_addresses # ipv6的所有地址 ansible_date_tim ...
- Photon Server初识(三) ---ORM映射改进
一:新建一些管理类, 二.实现每个管理类 (1)NHibernateHelper.cs 类,管理数据库连接 using NHibernate; using NHibernate.Cfg; namesp ...
- JQuery初识(三 )
一丶JQuery的文档操作 1.插入操作: 父元素.append(子元素) 解释:追加某元素,在父元素中添加新的子元素.子元素可以为:stirng|element(js对象)|JQuery元素 var ...
随机推荐
- PHP简单实例
<?php /** * @author admin * @copyright 2016 *编程实现2+4+6+…+100. * $sum = 0; for($i=2;$i<=100;$i+ ...
- Linux usleep for shell
/**************************************************************************** * Linux usleep for she ...
- linux 一些有用的命令
新增软链接 ln -s /usr/local/python27/bin/python2.7 /usr/bin/python 新建目录/递归 mkdir ./{nginx,memcached,httpd ...
- Base64编码的 换行 转义
用Base64编码的时候如果出现\n 之类的字符,java中转义. 当字符串过长(一般超过76)时会自动在中间加一个换行符,字符串最后也会加一个换行符.导致和其他模块对接时结果不一致. 解决方法:将 ...
- java中守护线程的一些概念和用法
网上的资料中,守护线程的功能一般都是“只要当前JVM实例中尚存任何一个非守护线程没有结束,守护线程就全部工作:只有当最后一个非守护线程结束是,守护线程随着JVM一同结束工作,Daemon作用是为其他线 ...
- JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用
下面把项目中的用户类中有个:一对一 一对多 多对多的注解对应关系列取出来用于学习 说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...
- Java并发--线程池的使用
在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...
- 20165212 预备作业3 Linux安装及学习
20165212 预备作业3Linux安装及学习 Linux虚拟机的安装过程 我像大部分同学一样,通过助教学姐给的Ubuntu下载地址下载映像文件.VB,但是屡次出现问题,不停的闪出一下错误提示窗口: ...
- js各种效果
1.JavaScript 仿LightBox内容显示效果 2.固定高度的div,竖直方向出现滚动条,水平方向固定 http://www.jb51.net/css/109928.html <!do ...
- [LeetCode系列]有序链表转换为平衡BST的递归解法
给定有序链表(元素由小到大), 试问如何将其转换为一个平衡BST? 平衡BST: 任意节点的左右子树的深度差值不大于1. 主要思想是用递归. Trick是使用快慢指针来获取中间节点. 获得中间节点后, ...