使用ansible安装lnmp
主机互信
生成密钥对,并将公钥发送给其他需要操作的主机
ssh-keygen -t rsa
cd /root/.ssh
ssh-copy-id -i id_rsa.pub root@192.168.1.140
ssh-copy-id -i id_rsa.pub root@192.168.1.141
安装ansible
yum -y install ansible
常用模块链接
推荐官方,中文翻译用这个吧
使用ansible搭建LNMP环境
代码链接(很多不足,以及错误,仅供学习参考,生产环境谨慎使用)
ansible_lnmp.rar
构建过程中要注意的
语法
语法建议参考官方文档中的例子,在创建多个文件或者目录时,with_items和file的层级关系是同级,而path和state在file下一级,但是它们是同级,如下:
- name: 创建目录
file:
path: '/data/{{item}}' ###单引为防止解析为目录
state: directory
with_items:
- wwwlog
- wwwroot
构建中应该使用应有的模块,例如设置软链接,不应该使用 "ln -s" 应如下:
- name: 设置软链接
file: src=/usr/local/nginx/sbin/nginx dest=/usr/bin/nginx state=link
目录结构
[root@localhost ~]# tree nginx_install/
nginx_install/
├── defaults
├── files
│ └── nginx-1.12.1.tar.gz
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
│ └── nginx.conf
└── vars
正确的目录结构如上
files存放主要文件,使用copy模块时无需路径
handlers存放触发文件
meta依赖文件
tasks执行文件
templates模板文件
vars变量文件
所需要的目录以及文件
比如nginx在配置文件中重新声明了root路径,那么这个目录就必须需要创建,错误日志文件也是
- name: 创建目录
file:
path: '/data/{{item}}'
state: directory
with_items:
- wwwlog
- wwwroot
- name: 创建文件error.log
file:
path: /data/wwwlog/error_nginx.log
state: touch
- name: 创建目录default
file:
path: /data/wwwroot/default
state: directory
这里应该有更好的写法,没仔细研究,需要带变量
notify触发handlers
- name: 设置软链接
file: src=/usr/local/nginx/sbin/nginx dest=/usr/bin/nginx state=link
- name: 修改配置文件
template: src=nginx.conf dest=/usr/local/nginx/conf/nginx.conf
notify: start nginx service
notify的位置很关键,一般是task发生changes触发notify,notify再触发handlers
一般配置文件发生更改后会需要重启,所以写在此处
[root@localhost ~]# vim nginx_install/handlers/main.yml
- name: start nginx service
shell: nginx
handlers中的name需要和notify的“start nginx service”对应才能触发!
playbook中的小常识:
- hosts: testhost
user: root
gather_facts: True
tasks:
- name: use when
shell: touch /tmp/when.txt
when: facter_ipaddress == "192.168.1.140"
只有当参数 facter_ipaddress为 192.168.1.140时才在该机器上新建指定文件;
意思就是只对 testhost 组中特定的主机进行操作,忽略组内其他的主机。
我们可以通过setup模块查看各个参数的值
Playbook的“Package”(role语句)
Role是比include更强大灵活的代码重用和分享机制。Include类似于编程语言中的include,是重用单个文件的,功能有限。
而Role类似于编程语言中的“Package”,可以重用一组文件形成完整的功能。例如安装和配置apache,需要tasks实现安装包和拷贝模版等,httpd.conf和index.html的模版文件,和handler文件实现重起功能。这些文件都可以放在一个role里面,供不同的playbook文件重用。
Ansible非常提倡在playbook中使用role,并且提供了一个分享role的平台Ansible Galaxy, https://galaxy.ansible.com/, 在galaxy上可以找到别人写好的role
定义role完整的目录结构
下面的目录结构定义了一个role:名字为myrole。在site.yml,调用了这个role。
role的目录结构 site.yml中调用role
site.yml
roles/
├── myrole
├── tasks
│ └── main.yml
├── handlers
│ └── main.yml
├── defaults
│ └── main.yml
├── vars
│ └── main.yml
├── files
├── templates
├── README.md
├── meta
│ └── main.yml
└── tests
├── inventory
└── test.yml
---
- hosts: webservers
roles:
- myrole
ansible并不要求role包含上述所有的目录及文件,根据role的功能需要加入对应的目录和文件。下面是每个目录和文件的功能。
下面的话需要理解,是整个playbook的框架所在!
如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 将被添加到 play 中,所以这个文件也可以视作role的入口文件,想看role做了什么操作,可以从此文件看起。
如果 roles/x/handlers/main.yml 存在, 其中列出的 handlers 将被添加到 play 中
如果 roles/x/vars/main.yml 存在, 其中列出的 variables 将被添加到 play 中
如果 roles/x/meta/main.yml 存在, 其中列出的 “角色依赖” 将被添加到 roles 列表中
roles/x/tasks/main.yml中所有tasks,可以引用 roles/x/{files,templates,tasks}中的文件,不需要指明文件的路径。
在写role的时候,一般都要包含role入口文件roles/x/tasks/main.yml,其它的文件和目录,可以根据需求选择加入。
最新文章
- RxJava 和 RxAndroid 三(生命周期控制和内存优化)
- [IOS NSUserDefaults]的使用:登陆后不再显示登录界面。
- C# 页面抓取类
- 网络爬虫by pluskid
- Python内置数据类型之Dictionary篇
- 解决SVN Cleanup错误: Failed to run the WC DB work queue associated with
- 使用shell快速建立上万个文件夹
- ORA-02030: can only select from fixed tables/views
- 如何在Power BI和Tableau之间进行选择?
- 51NOD 1133 不重叠的线段
- 神策Loagent数据收集 windows部署的坑
- MySql社区版和企业版的区别
- 【Python】Java程序员学习Python(八)— 基本类型的基本运算
- Mycat从入门到放弃
- Xcode GDB 调试
- 最短寻道优先算法(SSTF)——磁盘调度管理
- scss-!default默认变量
- 权限管理UML设计草图
- STL视频_02
- SQL server2008无法收缩日志