ansible(3)
一、setup模块
ansible的setup模块主要用来收集信息,查看参数:
[root@localhost ~]# ansible-doc -s setup # 查看参数,部分参数如下:
filter # 过滤,筛选
示例一:查看所有信息
[root@localhost ~]# 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
示例二:搜索某个信息
[root@localhost ~]# ansible cache -m setup -a 'filter=*processor*' # 用来搜索,*代表匹配任意个任意字符,可自行回顾正则表达式相关知识,可得如下信息
192.168.133.132 | SUCCESS => {
"ansible_facts": {
"ansible_processor": [
"0",
"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 的任务,结果自行验证
2、tags
假如在一playbook文件中有多个任务,但是我们只想执行其中一个,该怎么办?此时,可以使用tags,如下示例:
[root@localhost yaml]# vi p6.yml
- hosts: web
tasks:
- name: install
yum: name=redis
- name: copyfile
copy: src=/etc/redis.conf dest=/etc/redis.conf
tags: copyfile
- name: start
service: name=redis state=started
[root@localhost yaml]# ansible-playbook --syntax-check p6.yml playbook: p6.yml
[root@localhost yaml]# ansible-playbook -t copyfile p6.yml # 执行脚本,结果自行验证
3、循环with_items
通常你想在一个任务中干很多事,比如创建一群用户、安装很多包、或者重复一个轮询步骤直到收到某个特定结果,这时就可以使用循环。
示例一:单个循环
[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参数如下:
[root@localhost yaml]# 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
上面我们曾提到过,module 具有"幂等"性,所以当远端系统被人改动时,可以重放 playbooks 达到恢复的目的,playbooks 本身可以识别这种改动,并且有一个基本的 event system(事件系统),可以响应这种改动。(当发生改动时)'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: restart_redis
service: name=redis state=restarted
root/roles/web/handlers/main.yml
- hosts: web
remote_user: root
roles:
- web
root/web.yml
[root@localhost ~]# ansible-playbook web.yml
[root@localhost ~]# 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(3)的更多相关文章
- 进击的 Ansible(二):如何快速搞定生产环境 Ansible 项目布局?
Tips:与前文 <进击的 Ansible(一):Ansible 快速入门> 一样,本文使用的 Ansible 版本 2.5.4,项目演示环境 MacOS.由于 Ansible 项目开发活 ...
- 自动化运维工之Ansible(1)
1.1 ansible简介 1.1.1 .Ansible软件介绍: Ansible提供一种最简单的方式用于发布.管理和编排计算机系统的工具,可在数分钟内搞定.Ansible由Python语言开发, 默 ...
- ansible(1)
一.初识ansible 1.准备工作: 准备四台干净的虚拟机,如下: 192.168.133.129(主控节点,下面三个为被控节点) 192.168.133.130 192.168.133.131 1 ...
- Ansible(1)- 简单介绍
什么是 Ansible 开源部署工具,也是一个自动化运维工具 开发语言:Python Ansible 的特性 模块化部署管理:调用特定的模块,完成特定任务 三个关键模块:Paramiko(python ...
- 学习ansible(一)
1.介绍 1 ansible基于Python开发的自动化运维工具 2 ansible基于ssh协议实现远程管理的工具,没有客户端 3 ansible软件可以实现多种批量管理操作 2.环境 主机 IP ...
- ansible(一)
Ansible简介 Ansible:Ansible的核心程序Host Lnventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等.可以通过fil ...
- ansible(2)
一.ansible模块(yum.pip.service.conr.user.group) 上篇中我们已经学了ansible的几个模块,接下来再来学习几个,那么你是否知道ansible一共有多少模块呢? ...
- ansible(二)
软件相关模块 yum rpm和yum的区别 rpm:redhat package manager yum可以解决依赖关系 yum源配置 [epel] name=Extra Packages - $ba ...
- Ansible (一)
epel rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm yum -y ins ...
随机推荐
- ScSR超分辨率的效果
- makefile--参数传递、条件判断、include (五)
原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 在多个Makefile嵌套调用时,有时我们需要传递一些参数给下一层Makefile.比如我们在顶 ...
- Tomcat之JSP运行原理之小试牛刀
最近空闲看了下JSP/Servlet,以前只知道用JSP,但是对其运行原理知之甚少,今在此做些笔记,以备查阅. 首先简要描述下其运行过程,然后结合Tomcat源码作简要分析. JSP运行过程: 第一步 ...
- 超全面的JavaWeb笔记day18<事务&连接池&DBUtils>
1.事务 ACID 原子性 一致性 隔离性 持久性 mysql中开启和关闭事务 开启事务:START TRANSACTION 结束事务 提交事务:COMMIT 回滚事务:ROLLBACK JDBC中开 ...
- leetcode -- permutation 总结
leetcode上关于permutation有如下几题 Permutation Sequence Next Permutation Permutations Permutations II
- imx6ul开发板
Feescale飞思卡尔于发布全新的基于ARM Cortex-A7核心的低功耗处理器i.MX6UL,主要面向车载信息处理.家庭能源管理系统.工控领域.物联网网关等应用.具有可扩展性.高性能和低功耗特性 ...
- ubuntu的安装方法
Ubuntu 是一个启动速度超快.界面友好.安全性好的开源操作系统,它由全球顶尖开源软件专家开发,适用于桌面电脑.笔记本电脑.服务器以及上网本等,并且它可以永久免费使用.如果你厌倦了Windows,如 ...
- 使用reactjs遇到Warning: setState(...): Can only update a mounted or mounting component.
前端数据大部分来源于后端,需要向后端发起异步请求,而在使用reactjs的时候,如果这个组件最初加载的时候就发起这个异步请求,然后在返回结果中进行setState({}),这时候有可能会遇到这个警告: ...
- System.Net.WebException: The operation has timed out at System.Net.HttpWebRequest.GetResponse()
System.Net.WebException: The operation has timed out at System.Net.HttpWebRequest.GetResponse() 在请求 ...
- PHP中str_replace和substr_replace有什么区别?
两个函数的定义:(1)str_replace() 函数替换字符串中的一些字符(区分大小写). 该函数必须遵循下列规则: 如果搜索的字符串是一个数组,那么它将返回一个数组. 如果搜索的字符串是一个数组, ...