16.Linux搭建DHCP服务器及ansible入门

1、搭建DHCP服务,为局域网内用户提供10.1.1.0/24网段的IP,且租约期默认为48小时

  1. 简介:dhcp(动态主机路由配置协议),通常应用在大型局域网中,主要作用是集中管理,分配IP地址,使网络环境中的主机能够实时获得可用的IP地址及释放IP地址,提升IP地址的利用率。
  2. Linux下搭建dhcp服务器
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. 所谓dhcp中继,即在dhcp服务器与客户端之间在添加一个dhcp服务器实现中转,该中继服务器需要开启报文转发功能
  2. 在(1)中我们已搭建好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)

  1. ansible简介:是一款自动化运维工具,基于python研发,高度模块化,支持playbook编排任务;YAML格式编排任务;
  2. 组成部分:
    ANSIBLE PLAYBOOKS:任务剧本,ansible根据顺序依次执行
    INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
    MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
    PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插 件等,该功能不常用
    API:供第三方程序调用的应用程序编程接口
    ANSIBLE:组合INVENTORY、API、MODULES、PLUGINS的绿框,可以理解 为是ansible命令工具,其为核心执行工具
  3. 配置文件 :
    /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
    /etc/ansible/hosts 主机清单
    etc/ansible/roles/ 存放角色的目录
  4. 程序 :
    /usr/bin/ansible 主程序,临时命令执行工具
    /usr/bin/ansible-doc 查看配置文档,模块功能查看工具
    /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
    /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具
    /usr/bin/ansible-pull 远程执行命令的工具
    /usr/bin/ansible-vault 文件加密工具
    /usr/bin/ansible-console 基于Console界面与用户交互的执行工具
  5. ansible命令使用:
    ansible [-m module_name] [-a args]
参数 含义
–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时的口令
  1. ansible命令执行过程
    1.加载自己的配置文件 默认/etc/ansible/ansible.cfg
    2.加载自己对应的模块文件,如command
    3.通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服 务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
    4.给文件+x执行
    5.执行并返回结果
    6.删除临时py文件,退出

  2. 执行状态:
    1.绿色:执行成功并且不需要做改变的操作
    2.黄色:执行成功并且对目标主机做变更
    3.红色:执行失败

  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 
  1. 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} 
    
  2. Playbook核心元素
    1.Hosts 执行的远程主机列表
    2.Tasks 任务集
    3.Variables 内置变量或自定义变量在playbook中调用
    4.Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
    5.Handlers 和 notity 结合使用,由特定条件触发的操作,满足条件方才执行, 否则不执行
    6.tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible 具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其 确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可 以通过tags跳过此些代码片断
    示例:ansible-playbook -t tagsname useradd.yml

  3. 运行playbook的方式
    1.ansible-playbook … [options]
    常见选项 :

选项 意义
–check -C 只检测可能会发生的改变,但不真正执行操作
–list-hosts 列出运行任务的主机
–list-tags 列出tag
–list-tasks 列出task
–limit 主机列表 只针对主机列表中的主机执行
-v -vv -vvv 显示过程
  1. handlers和notify结合使用触发条件
    1.Handlers是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发 生变化时,才会采取一定的操作
    2.Notify此action可用于在每个play的最后被触发,这样可避免多次有改变发生 时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。 在notify中列出的操作称为handler,也即notify中调用handler中定义的操作
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 
  1. Playbook中tags使用
```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 

```
  1. Playbook中变量使用
    变量名:仅能由字母、数字和下划线组成,且只能以字母开头
    变量来源:
    1.ansible setup facts 远程主机的所有变量都可直接调用
    2.在/etc/ansible/hosts中定义
    普通变量:主机组中主机单独定义,优先级高于公共变量
    公共(组)变量:针对主机组中所有主机定义统一变量
    3.通过命令行指定变量,优先级最高
    ansible-playbook –e varname=value
    4.在playbook中定义
    vars: var1: value1 - var2: value2
    5.在独立的变量YAML文件中定义
    6.在role中定义
    7.变量调用方式:
    通过{{ variable_name }} 调用变量,且变量名前后必须有空格,有时用 “{{ variable_name }}”才生效
    ansible-playbook –e 选项指定 ansible-playbook test.yml -e “hosts=www user=magedu”
  2. template
    1.template功能:根据模块文件动态生成对应的配置文件 template文件必须存放于templates目录下,且命名为 .j2 结尾
```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 
```
  1. Roles :角色(roles):角色集合 roles/ mysql/ httpd/ nginx/ memcached/
    1.roles目录结构:
    playbook.yml
    roles/
    project/
    tasks/
    files/
    vars/
    templates/
    handlers/
    default/ 不常用
    meta/ 不常用

  2. 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文件

  3. 创建role
    创建role的步骤 :
    (1) 创建以roles命名的目录
    (2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等
    (3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、 templates和vars目录;用不到的目录可以创建为空目录,也可以不创建
    (4) 在playbook文件中,调用各角色
    16.Linux搭建DHCP服务器及ansible入门_第1张图片

  4. 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我之前已经解压好了,所以他才报错提示目录已经存在

最后让我们通过浏览器访问一下,这就到了我们用创建的数据库登录的时候了
16.Linux搭建DHCP服务器及ansible入门_第2张图片
4、采用Ansible Role方式自动化搭建LNMP

  1. role:顾名思义就是角色的意思,简单理解就是将我们的一个大的playbook根据不同的组成把他拆分存放,当需要用到时就调用这个role就好了
  2. role的组成和创建步骤在上面已经提到,下面让我们以role来搭建lnmp架构
    1.进入/etc/ansible/roles目录下,在这里建立一个nginx的角色
    [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   

你可能感兴趣的:(16.Linux搭建DHCP服务器及ansible入门)