1、搭建DHCP服务,为局域网内用户提供10.1.1.0/24网段的IP,且租约期默认为48小时
1.安装dhcp
[root@localhost centos]# yum install dhcp -y
2.修改dhcp配置文件/etc/dhcp/dhcpd.conf,修改完保存后重启
default-lease-time 172800; //设置租约期为48小时,单位是秒
max-lease-time 180000; //最大租约期
subnet 10.1.1.0 netmask 255.255.255.0 { //网段为10.1.1.0,24位掩码
range 10.1.1.10 10.1.1.20; //地址范围是10.1.1.10-10.1.1.20
option routers 10.1.1.7; //指定默认网关是10.1.1.7
}
[root@localhost dhcp]# systemctl start dhcpd.service //启动服务
[root@localhost dhcp]# ss -unl //监听在udp协议的67号端口
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 *:51236 *:*
UNCONN 0 0 192.168.122.1:53 *:*
UNCONN 0 0 *:67 *:*
UNCONN 0 0 *%virbr0:67 *:*
3.配置客户端,使用命令动态获取dhcp地址 //我这里使用的是192.168.164.0网段测试
[root@node2 centos]# dhclient -d
Internet Systems Consortium DHCP Client 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/virbr0-nic/52:54:00:f4:1a:f7
Sending on LPF/virbr0-nic/52:54:00:f4:1a:f7
Listening on LPF/virbr0/52:54:00:f4:1a:f7
Sending on LPF/virbr0/52:54:00:f4:1a:f7
Listening on LPF/ens33/00:0c:29:ee:c5:9a
Sending on LPF/ens33/00:0c:29:ee:c5:9a
Sending on Socket/fallback
DHCPDISCOVER on virbr0-nic to 255.255.255.255 port 67 interval 6 (xid=0x7c2d372c)
DHCPDISCOVER on virbr0 to 255.255.255.255 port 67 interval 4 (xid=0x7477d2bc)
DHCPREQUEST on ens33 to 255.255.255.255 port 67 (xid=0x2200a5d5)
DHCPACK from 192.168.164.154 (xid=0x2200a5d5) //dhcp服务器地址
bound to 192.168.164.10 -- renewal in 67843 seconds. //从服务器获取到的IP地址,证明dhcp服务器可用
2、在上述实验基础上,实现DHCP中继
1.打开路由转发功能
[root@node3 centos]# echo "1" > /proc/sys/net/ipv4/ip_forward
[root@node3 centos]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@node2 centos]# sysctl -p
2.准备另外一台主机配置中继服务器,也要先安装dhcp包
[root@node3 centos]# vim /etc/sysconfig/dhcrelay
INTERFACES="ens33" #侦听接口
DHCPSERVERS="192.168.164.153" #DHCP服务器IP地址
[root@node3 centos]# systemctl enable dhcrelay.service#开机自启动
[root@node3 centos]# systemctl start dhcrelay.service #启动中继服务
3.客户端请求
[root@node4 centos]#dhclient -d
3、借助Ansible Playbook自动化搭建LNMP环境(可借助yum)
参数 | 含义 |
---|---|
–version | 显示版本 |
-m module | 指定模块,默认为command |
-v | 详细过程 |
–vv,vvv | 更详细 |
–list-hosts | 显示主机列表,可简写 --list |
-k, --ask-pass | 提示输入ssh连接密码,默认Key验证 |
-C, --check | 检查,并不执行 |
-T, --timeout=TIMEOUT | 执行命令的超时时间,默认10s |
-u, --user=REMOTE_USER | 执行远程执行的用户 |
-b, --become | 代替旧版的sudo 切换 --become-user=USERNAME 指定sudo的runas用户,默认为root |
-K, --ask-become-pass | 提示输入sudo时的口令 |
ansible命令执行过程
1.加载自己的配置文件 默认/etc/ansible/ansible.cfg
2.加载自己对应的模块文件,如command
3.通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服 务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4.给文件+x执行
5.执行并返回结果
6.删除临时py文件,退出
执行状态:
1.绿色:执行成功并且不需要做改变的操作
2.黄色:执行成功并且对目标主机做变更
3.红色:执行失败
常用模块
1.Command:在远程主机执行命令,默认模块,可忽略-m选项
示例:ansible srvs -m command -a ‘service vsftpd start’
ansible srvs -m command -a ‘echo magedu |passwd --stdin wang’
此命令不支持 $VARNAME < > | ; & 等,用shell模块实现
2.Shell:和command相似,用shell执行命令
ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’
3.Script:在远程主机上运行ansible服务器上的脚本
-a "/PATH/TO/SCRIPT_FILE“
ansible websrvs -m script -a /data/f1.sh
4.Copy:从主控端复制文件到远程主机
ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes”
如目标存在,默认覆盖,此处指定先备份
ansible srv -m copy -a “content=‘test content\n’ dest=/tmp/f1.txt”
指定内容,直接生成目标文件
5.Fetch:从远程主机提取文件至主控端,copy相反,目前不支持目录
ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’
6.File:设置文件属性
ansible srv -m file -a "path=/root/a.sh owner=wang mode=755“
ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’ //创建链接文件
7.Yum:管理包
ansible srv -m yum -a ‘name=httpd state=present’ 安装
ansible srv -m yum -a ‘name=httpd state=absent’ 删除
8.Service:管理服务
ansible srv -m service -a 'name=httpd state=stopped'
ansible srv -m service -a 'name=httpd state=started enabled=yes'
ansible srv -m service -a 'name=httpd state=reloaded’
ansible srv -m service -a 'name=httpd state=restarted'
9.User:管理用户
ansible srv -m user -a 'name=user1 comment=“test user” uid=2048 home=/app/user1 group=root‘
ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1’
ansible srv -m user -a ‘name=user1 state=absent remove=yes‘ 删除用户及家目录等数据
10.Group:管理组
ansible srv -m group -a "name=testgroup system=yes“ ansible srv -m group -a "name=testgroup state=absent"
11.ansible-galaxy 命令:连接 https://galaxy.ansible.com 下载相应的roles
意义 | 命令 |
---|---|
列出所有已安装的galaxy | ansible-galaxy list |
删除galaxy | ansible-galaxy remove geerlingguy.redis |
安装galaxy | ansible-galaxy install geerlingguy.redis |
12.ansible-playbook
执行playbook
示例:ansible-playbook hello.yml
cat hello.yml
#hello world yml file
- hosts: websrvs
remote_user: root
- tasks:
- name: hello world
command: /usr/bin/wall hello world
playbook:
1.playbook是由一个或多个“play”组成的列表 play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定 义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个 playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
2.Playbook采用YAML语言编写 ,语法简介:
List:列表,其所有元素均使用“-”打头
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
Dictionary:字典,通常由多个key与value构成
示例:
# An employee record
name: Example Developer
job: Developer
skill: Elite
也可以将key:value放置于{}中进行表示,用,分隔多个key:value
示例:
# An employee record
{name: Example Developer, job: Developer, skill: Elite}
Playbook核心元素
1.Hosts 执行的远程主机列表
2.Tasks 任务集
3.Variables 内置变量或自定义变量在playbook中调用
4.Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
5.Handlers 和 notity 结合使用,由特定条件触发的操作,满足条件方才执行, 否则不执行
6.tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible 具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其 确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可 以通过tags跳过此些代码片断
示例:ansible-playbook -t tagsname useradd.yml
运行playbook的方式
1.ansible-playbook
常见选项 :
选项 | 意义 |
---|---|
–check -C | 只检测可能会发生的改变,但不真正执行操作 |
–list-hosts | 列出运行任务的主机 |
–list-tags | 列出tag |
–list-tasks | 列出task |
–limit | 主机列表 只针对主机列表中的主机执行 |
-v -vv -vvv | 显示过程 |
Playbook中handlers使用
13. hosts: websrvs
remote_user: root
tasks:
- name: Install httpd
yum: name=httpd state=present
- name: Install configure file
copy: src=files/httpd.conf dest=/etc/httpd/conf/
notify: restart httpd
- name: ensure apache is running
service: name=httpd state=started enabled=yes
handlers:
- name: restart httpd
service: name=httpd state=restarted
```bash
示例:httpd.yml
- hosts: websrvs
remote_user: root
tasks:
- name: Install httpd
yum: name=httpd state=present
- name: Install configure file
copy: src=files/httpd.conf dest=/etc/httpd/conf/
tags: conf
- name: start httpd service
tags: service
service: name=httpd state=started enabled=yes
执行命令:ansible-playbook –t conf httpd.yml
```
```bash
示例:利用template 同步nginx配置文件
准备templates/nginx.conf.j2文件
vim temnginx.yml
-hosts: websrvs
remote_user: root
tasks:
name: template config to remote hosts
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
执行命令:ansible-playbook temnginx.yml
```
Roles :角色(roles):角色集合 roles/ mysql/ httpd/ nginx/ memcached/
1.roles目录结构:
playbook.yml
roles/
project/
tasks/
files/
vars/
templates/
handlers/
default/ 不常用
meta/ 不常用
Roles各目录作用 :
/roles/project/ :项目名称,有以下子目录
1.files/ :存放由copy或script模块等调用的文件
2.templates/:template模块查找所需要模板文件的目录
3.tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件; 其它的文件需要在此文件中通过include进行包含
4.handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此 文件中通过include进行包含
5.vars/:定义变量,至少应该包含一个名为main.yml的文件;其它的文件需要 在此文件中通过include进行包含
6.meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为 main.yml的文件,其它文件需在此文件中通过include进行包含
7.default/:设定默认变量时使用此目录中的main.yml文件
创建role
创建role的步骤 :
(1) 创建以roles命名的目录
(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等
(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、 templates和vars目录;用不到的目录可以创建为空目录,也可以不创建
(4) 在playbook文件中,调用各角色
ansible搭建LNMP架构
在这里我们使用playbook剧本的方式搭建lnmp架构,lnmp架构需要php,mariadb,wordpress等等开源软件
playbook剧本如下:这是最简单的基本,就是根据我们手动搭建的顺序转换成ansible自动完成。其中要用到的配置文件需要我们提前定义好,剧本会直接从本机复制到远程主机上
首先要在/etc/absible/hosts下定义远程主机,添加入以下字段
192.168.164.153 //你自己定义的远程主机地址
编写playbook剧本
[root@node2 playbook]# vi nginx.yaml
- hosts: 192.168.164.153 //这里我只定义了一台远程主机
remote_user: root //执行身份
tasks: //以下为任务剧本
- name: install nginx
yum: name=nginx state=latest
- name: nginx configer
copy; src=/nginx.conf dest=/etc/nginx/nginx.conf copy=yes
- name: start nginx
service: name=nginx state=started
- name: install php-fpm
yum: name=php-fpm state=latest
- name: start php-fpm
service: name=php-fpm state=started
- name: install php-mysql
yum: name=php-mysql state=latest
- name: install mariadb-server
yum: name=mariadb-server state=latest
- name: start mariadb
service: name=mariadb state=started
- name: start mariadb
service: name=mariadb state=started
- name: php test
copy: src=/playbook/lnmp.php dest=/usr/share/nginx/html/ copy=yes
- name: mysql test
copy: src=/playbook/mysql.php dest=/usr/share/nginx/html/ copy=yes
- name: install wordpress
unarchive: src=/data/wordpress-4.3.1-zh_CN.zip dest=/usr/share/nginx/html/ copy=yes
owner=root group=root
所需要的配置文件
1.nginx的配置文件,在server下加入如下字段
location /wordpres {
index index.php;
}
location ~\.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
两个自定义的php测试脚本,lnmp.php;mysql.php
[root@node3 html]#cat lnmp.php
<?php
echo "Hello world!
"
?>
[root@node3 html]#cat mysql.php
<?php
$conn = mysql_connect('localhost','root','qazxc');
if ($conn)
echo "ok";
else
echo "faith";
?>
最后mariadb需要创建一个授权用户,用于登录wordpress,当然你也可以提前创建好该用户,并提前修改好wprdpress的配置文件,这样又省去了一步
MariaDB [(none)]> grant all on *.* to "user"@"localhost" identified by "passwd";
Query OK, 0 rows affected (0.00 sec)
剧本运行结果
[root@node2 playbook]# ansible-playbook nginx.yaml
PLAY [192.168.164.153] ****************************************************************
TASK [Gathering Facts] ****************************************************************
ok: [192.168.164.153]
TASK [install nginx] ******************************************************************
ok: [192.168.164.153]
TASK [start nginx] ********************************************************************
changed: [192.168.164.153]
TASK [install php-fpm] ****************************************************************
ok: [192.168.164.153]
TASK [start php-fpm] ******************************************************************
changed: [192.168.164.153]
TASK [install php-mysql] **************************************************************
ok: [192.168.164.153]
TASK [install mariadb-server] *********************************************************
ok: [192.168.164.153]
TASK [start mariadb] ******************************************************************
ok: [192.168.164.153]
TASK [start mariadb] ******************************************************************
ok: [192.168.164.153]
TASK [php test] ***********************************************************************
ok: [192.168.164.153]
TASK [mysql test] *********************************************************************
ok: [192.168.164.153]
TASK [install wordpress] **************************************************************
fatal: [192.168.164.153]: FAILED! => {"changed": false, "msg": "Could not find or access '/data/wordpress-4.3.1-zh_CN.zip' on the Ansible Controller.\nIf you are using a module and expect the file to exist on the remote, see the remote_src option"}
PLAY RECAP ****************************************************************************
192.168.164.153 : ok=11 changed=2 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
最后一步是因为wordpress我之前已经解压好了,所以他才报错提示目录已经存在
最后让我们通过浏览器访问一下,这就到了我们用创建的数据库登录的时候了
4、采用Ansible Role方式自动化搭建LNMP
[root@node2 /]# cd /etc/ansible/roles/
[root@node2 roles]# mkdir -pv /etc/ansible/roles/nginx/{files,templates,tasks,vars,handlers,meta,default}
mkdir: created directory ‘/etc/ansible/roles/nginx’
mkdir: created directory ‘/etc/ansible/roles/nginx/files’
mkdir: created directory ‘/etc/ansible/roles/nginx/templates’
mkdir: created directory ‘/etc/ansible/roles/nginx/tasks’
mkdir: created directory ‘/etc/ansible/roles/nginx/vars’
mkdir: created directory ‘/etc/ansible/roles/nginx/handlers’
mkdir: created directory ‘/etc/ansible/roles/nginx/meta’
mkdir: created directory ‘/etc/ansible/roles/nginx/default’
2.将所需要的剧本按类型创建于目录中1.files目录下
[root@node2 files]# vi main.yaml
- name: php test
copy: src=/playbook/lnmp.php dest=/usr/share/nginx/html/ copy=yes
- name: mysql test
copy: src=/playbook/mysql.php dest=/usr/share/nginx/html/ copy=yes
2.tasks目录下
[root@node2 tasks]# vi main.yaml
- name: install nginx
yum: name=nginx state=latest
- name: start nginx
service: name=nginx state=started
- name: install php-fpm
yum: name=php-fpm state=latest
- name: start php-fpm
service: name=php-fpm state=started
- name: install php-mysql
yum: name=php-mysql state=latest
- name: install mariadb-server
yum: name=mariadb-server state=latest
- name: start mariadb
service: name=mariadb state=started
- name: start mariadb
service: name=mariadb state=started
- name: install wordpress
unarchive: src=/data/wordpress-4.3.1-zh_CN.zip dest=/usr/share/nginx/html/ copy=yes owner=root gro
up=root
tags: wordpress
- name: restart nginx
service: name=nginx state=restarted
3.新建一个playbook并调用roles
[root@node2 playbook]# vi lnmp.yaml
- hosts: 192.168.164.153
remote_user: root
roles: //调用该角色nginx
- nginx
4.运行该playbook,会发现结果和我们单独写playbook一样
[root@node2 playbook]# ansible-playbook -C lnmp.yaml
PLAY [192.168.164.153] *******************************************************************************
TASK [Gathering Facts] *******************************************************************************
ok: [192.168.164.153]
TASK [nginx : install nginx] *************************************************************************
ok: [192.168.164.153]
TASK [nginx : start nginx] ***************************************************************************
ok: [192.168.164.153]
TASK [nginx : install php-fpm] ***********************************************************************
ok: [192.168.164.153]
TASK [nginx : start php-fpm] *************************************************************************
ok: [192.168.164.153]
TASK [nginx : install php-mysql] *********************************************************************
ok: [192.168.164.153]
TASK [nginx : install mariadb-server] ****************************************************************
ok: [192.168.164.153]
TASK [nginx : start mariadb] *************************************************************************
ok: [192.168.164.153]
TASK [nginx : start mariadb] *************************************************************************
ok: [192.168.164.153]
TASK [nginx : install wordpress] *********************************************************************
fatal: [192.168.164.153]: FAILED! => {"changed": false, "msg": "Could not find or access '/data/wordpress-4.3.1-zh_CN.zip' on the Ansible Controller.\nIf you are using a module and expect the file to exist on the remote, see the remote_src option"}
PLAY RECAP *******************************************************************************************
192.168.164.153 : ok=9 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0