音乐网站开发与设计,网站如何推广方案策划,wordpress 瑜伽课程,erp软件公司#x1f49d;#x1f49d;#x1f49d;欢迎来到我的博客#xff0c;很高兴能够在这里和您见面#xff01;希望您在这里可以感受到一份轻松愉快的氛围#xff0c;不仅可以获得有趣的内容和知识#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…欢迎来到我的博客很高兴能够在这里和您见面希望您在这里可以感受到一份轻松愉快的氛围不仅可以获得有趣的内容和知识也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技术:系统维护、数据库、网络安全、自动化运维、容器技术、云计算、人工智能、运维开发、算法结构、物联网、JAVA 、Python、PHP、C、C等。 不同类型针对性训练,提升逻辑思维,剑指大厂非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。
云平台管理之Ansible Playbook 原理与实践
Ansible Playbook 简介
Ansible Playbook 是 Ansible 的核心组件之一它允许用户以 YAML 格式编写配置文件用于描述希望远程系统执行的一系列任务。Playbook 提供了一种方式来编排和执行这些任务确保配置的一致性或者简单地执行一些常见的任务。Playbook 的使用使得 Ansible 成为一个强大的配置管理工具尤其适用于需要跨多个系统执行多个操作的情况。
Playbook 的基本原理包括
配置管理通过 Playbook可以定义和执行一系列任务以管理和配置远程系统的状态。编排任务Playbook 可以对任务进行排序和编排确保按照正确的顺序执行任务。并行处理通过异步执行和适当的配置Playbook 可以实现并行处理多个任务提高工作效率。权限管理通过使用 become 功能Playbook 可以以不同的用户权限执行任务满足不同的系统需求。
实践方面使用 Playbook 可以大大简化复杂的应用部署和配置管理过程。通过编写 Playbook可以清晰地定义部署流程、配置变更、系统状态检查等任务并通过 Ansible 引擎执行这些任务。Playbook 的使用不仅提高了工作效率还减少了人为错误的可能性使得 IT 基础设施的管理更加可靠和高效。
Playbooks是Ansible的配置部署和编排语言。playbook是由一个或多个play组成的列表play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中即可以让它们联合起来按事先编排的机制完成某一任务。
Ansible Palybook的编写是基于YAML语言的。YAML语言即Yet Another Markup Language是一种能被计算机直接识别的标记语言同时也方便人的阅读且方便和脚本语言交互。但是YAML的配置即为严格在配置时必须注重空格的数量。总的来看YAML语言特性如下
1、可读性强2、和脚本语言的交互性好3、使用实现语言的数据类型4、一致的信息模型5、易于实现6、可以基于流来处理7、可扩展性强
Ansible Playbook 组件
Ansible的Playbook有以下组件
Target 定义playbook的远程主机组即控制的下游设备信息Variable 定义Playbook所使用的变量。Task 定义Playbook控制下游设备要执行的命令。Handler 定义在Palybook在Task执行完毕后要调用的任务。
Ansible Playbook各组件参数
Ansible的上述组件的参数如下
Target常用参数
代码语言javascript
hosts #定义Ansible用户控制的下游设备
remote_user #定义执行Ansible设置的用户
sudo #设置为yes时执行任务时使用root权限
sudo_user #指定sudo的普通用户
connection #默认基于ssh链接客户端
gather_facts #获取远程主机facts基础信息Variable常用参数
vars #定义变量
vars_files #指定变量文件
vars_prompt #用户交互模式自定义变量
setup #通过远程gather_facts获取的信息Task常用参数
name #任务的名称在Ansible运行的过程中起到提示的作用会打印在屏幕上
action #Ansible控制下游设备的命令通过Ansible的各个模块来进行控制
template #Ansible控制下游设备的模板
handler #定义一个调用该调用在Handler处被定义在所有的Task结束后被执行。Playbook基本语法
playbook使用yaml语法格式后缀可以是yaml,也可以是yml。
[rootlocalhost ~]$ vim test.yaml
--- #表示文档开始
- hosts: test # - 表示一个块序列的节点注意横杠后面有空格可以写主机名主机组名多个使用逗号隔开remote_user: root #指定在进行远程操作时使用root用户进行操作tasks: #使用tasks关键字指明要进行操作的任务列表之后的行都属于tasks键值对中的值。- name: Ping #每个任务都以- 开头每个任务都有自己的名字,任务名使用name关键字进行指定ping: #ansible模块- name: make directory test #第二个任务使用file模块使用file模块时指定了path参数与state参数的值。file: #ansible模块path: /data/test #模块的参数state: directory --- #标记文件的开始
- hosts: webservers #指定该playbook在哪个服务器上执行vars: #表示下面是定义的变量http_port: 80 #变量的形式key: value这里http_port是变量名80是值max_clients: 200remote_user: root #指定远程的用户名这里缩进和vars保持了一致说明变量的代码块已经结束。tasks: #下面构成playbook的tasks每个task都有 - name: 开始name指定该任务的名称。- name: ensure apache is at the latest version #指定该任务的名称。yum: pkghttpd statelatest #yum说明要是用的模板名称后面指定对应的参数这两行结合起来就相当于一个shell命令。- name: write the apache config file #每个task之间可以使用空行来做区分。template: src/srv/httpd.j2 dest/etc/httpd.conf#需要说明的是缩进的意义和python中缩进的意义是一样是来区分代码块的。检测语法
[rootlocalhost ~]$ ansible-playbook --syntax-check /path/to/playbook.yaml测试运行
[rootlocalhost ~]$ ansible-playbook -C /path/to/playbook.yaml运行
[rootlocalhost ~]$ ansible-playbook /path/to/playbook.yaml示例:Playbook 创建用户
[rootlocalhost ~]$ vim sysuser.yml
---
- hosts: allremote_user: roottasks:- name: create mysql useruser: namemysql systemyes uid36- name: create a groupgroup: namehttpd systemyesPlaybook示例 安装nginx服务
[rootlocalhost ~]$ vim nginx.yml
- hosts: allremote_user: roottasks:- name: add group nginxuser: namenginx statepresent- name: add user nginxuser: namenginx statepresent groupnginx- name: Install Nginxyum: namenginx statepresent- name: Start Nginxservice: namenginx statestarted enabledyestags: 添加标签
可以指定某一个任务添加一个标签,添加标签以后,想执行某个动作可以做出挑选来执行多个动作可以使用同一个标签。
示例httpd.yml
代码语言javascript复制
- hosts: websrvsremote_user: roottasks:- name: Install httpdyum: namehttpd statepresenttage: install - name: Install configure filecopy: srcfiles/httpd.conf dest/etc/httpd/conf/tags: conf- name: start httpd servicetags: serviceservice: namehttpd statestarted enabledyesansible-playbook -t install,conf httpd.yml 指定执行install,conf 两个标签handlers
handlers和notify结合使用触发条件
Handlers 实际上就是一个触发器是task列表这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时才会采取一定的操作。
Notify此action可用于在每个play的最后被触发
这样可避免多次有改变发生时每次都执行指定的操作仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler也即notify中调用handler中定义的操作
在系统中我们修改了服务器的配置文件这时候就需要重启操作服务就可以使用到handlers。配合 notify使用。
代码语言javascript
---
- hosts: control-noderemote_user: rootvars:- pkg: httpd- name: template configuration filetemplate: srctemplate.j2 dest/etc/foo.conf #修改了配置文件然后依次启动memcached和apache服务。notify: #使用notify来声明引用handlers。- restart memcached- restart apachehandlers: #下面定义了两个handlers- name: restart memcachedservice: namememcached staterestarted- name: restart apacheservice: nameapache staterestarted在使用handlers的过程中有以下几点需要注意
handlers只有在其所在的任务被执行时都会被运行handlers只会在Play的末尾运行一次如果想在一个Playbook的中间运行handlers则需要使用meta模块来实现例如- meta: flush_handlers。如果一个Play在运行到调用handlers的语句之前失败了那么这个handlers将不会被执行。我们可以使用mega模块的–force-handlers选项来强制执行handlers即使在handlers所在Play中途运行失败也能执行。
register 和when
register 用于注册一个变量保存命令的结果(shell或command模块)这个变量可以在后面的task、when语句或模板文件中使用。
代码语言javascript
- shell: /bin/pwdregister: pwd_resultdebug:#msg: {{ pwd_result }} # 输出全部信息#msg: {{ pwd_result.cmd }} # 引用方式一msg: {{ pwd_result[stdout_lines] }} # 引用方式二when 相当于shell脚本里的if 判断when语句就是用来实现这个功能的它是一个jinja2的语法但是不需要双大括号用法很简单。
- name: echo date #执行了一个 date 命令register 关键字将 date 命令的输出存储到 date_output 变量名command: date register: date_output - name: echo date_output #用 when 对关键字对分析后的进行判断如果匹配则执行这个 task不匹配就不执行command: echo 30when: date_output.stdout.split( )[2] 30这里第 1 个 task 是执行了一个 date 命令register 关键字将 date 命令的输出存储到 date_output 变量名。第 2 个 task 对输出进行分析并使用 when 对关键字对分析后的进行判断如果匹配则执行这个 task不匹配就不执行。这里要重点说下的因为 register 获取到的输出内容都是字符串而 ansible 又是 python 写的你可以使用 python 字符串的方法对其做处理比如本文中使用的 split还可以使用 find 方法。
示例
tasks:- name: shutdown RedHat flavored systemsshell: /sbin/shutdown -h nowwhen: ansible_os_family RedHat #当系统属于红帽系列,执行shell模块循环
标准循环关键字”with_items” 对迭代项的引用固定变量名为item”使用with_item属性给定要迭代的元素。
[rootlocalhost ~]$ cat xh.yml
---
- hosts: allgather_facts: notasks:- name: dispaly listdebug: msg{{item}}with_items:- one- two- three- four[rootlocalhost ~]$ ansible-playbook -i hosts xh.yml PLAY [all] *************************************************************************************************************
TASK [dispaly xunhuan] *************************************************************************************************
ok: [192.168.52.129] (itemone) {changed: false, item: one, msg: one
}
ok: [192.168.52.129] (itemtwo) {changed: false, item: two, msg: two
}
ok: [192.168.52.129] (itemthree) {changed: false, item: three, msg: three
}
ok: [192.168.52.129] (itemfour) {changed: false, item: four, msg: four
}安装一堆软件包。
---- hosts: localhosttasks: - yum: name{{item}} stateinstalledwith_items: - pkg1- pkg2- pkg3它会一个一个迭代到特殊变量{{item}}处。
loop等价于with_list从名字上可以知道它是遍历数组列表的所以在loop指令中每个元素都以列表的方式去定义。列表有多少个元素就循环执行file模块多少次每轮循环中都会将本次迭代的列表元素保存在控制变量 item中。
安装多个软件
tasks:- name: Install Packagesyum: name{{ item }} statelatestloop:- httpd- mysql-server- php模板templates
Jinja2语言使用字面量有下面形式
字符串使用单引号或双引号
数字整数浮点数
列表[item1, item2, …]
元组(item1, item2, …)
字典{key1:value1, key2:value2, …}
布尔型true/false
算术运算, -, *, /, //, %, **
比较操作, !, , , ,
逻辑运算andornot
流表达式ForIfWhentemplate 的使用
templates是ansible的一个模块其功能是根据模板文件动态生成配置文件templates文件必须存放于templates目录下且命名为.j2结尾yaml/yml文件需要和templates目录平级这样我们在yml文件中调用模板的时候就不需要写模板文件的路径否则需要描述模板文件的路径因为template模块会自动去找templates目录下的模板文件.
./
├── temnginx.yml
└── templates
└── nginx.conf.j2template示例
示例利用template 同步nginx配置文件准备templates/nginx.conf.j2文件。
vim temnginx.yml
- hosts: websrvsremote_user: roottasks:- name: template config to remote hoststemplate: srcnginx.conf.j2 dest/etc/nginx/nginx.confansible-playbook temnginx.ymlfor循环使用
{% for vhost in nginx_vhosts %}
server {
listen {{ vhost.listen }}
}
{% endfor %}if单分支选择使用
{% if vhost.server_name is defined %}server_name {{ vhost.server_name }}
{% endif %}if多分支选择使用
{%if vhost.port is undefined %}http_port80
{%elif vhost.port 81%}http_port81
{%else%}http_port 83
{%endif%}单行注释
{#% for i in list %#}roles
Roles介绍
ansible自1.2版本引入的新特性用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令引入即可。简单来讲roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中并可以便捷的include它们的一种机制。角色一般用于基于主机构建服务的场景中但也可以是用于构建守护进程等场景中。主要使用场景代码复用度较高的情况下。
Roles目录结构
各目录含义解释
roles: --所有的角色必须放在roles目录下这个目录可以自定义位置默认的位置在/etc/ansible/rolesproject: ---具体的角色项目名称比如nginx、tomcat、phpfiles --用来存放由copy模块或script模块调用的文件。templates --用来存放jinjia2模板template模块会自动在此目录中寻找jinjia2模板文件。tasks --此目录应当包含一个main.yml文件用于定义此角色的任务列表此文件可以使用include包含其它的位于此目录的task文件。main.ymlhandlers --此目录应当包含一个main.yml文件用于定义此角色中触发条件时执行的动作。main.ymlvars --此目录应当包含一个main.yml文件用于定义此角色用到的变量。main.ymldefaults --此目录应当包含一个main.yml文件用于为当前角色设定默认变量。main.ymlmeta --此目录应当包含一个main.yml文件用于定义此角色的特殊设定及其依赖关系。main.ymlroles/example_role/files/ #所有文件都将可存放在这里
roles/example_role/templates/ #所有模板都存放在这里
roles/example_role/tasks/main.yml #主函数包括在其中的所有任务将被执行
roles/example_role/handlers/main.yml #所有包括其中的 handlers 将被执行
roles/example_role/vars/main.yml #所有包括在其中的变量将在roles中生效
roles/example_role/meta/main.yml #roles所有依赖将被正常登入Roles示例
通过ansible roles安装配置httpd服务此处的roles使用默认的路径/etc/ansible/roles。
#在ansible目录下面建立roles目录
#修改配置文件使系统能够读取roles目录
[rootansible ~]$ cat /etc/ansible/ansible.cfg | grep roles
# additional paths to search for roles in, colon separated
#roles_path /etc/ansible/roles #roles默认路径
# by default, variables from roles will be visible in the global variable创建role的步骤
(1) 创建以roles命名的目录。(2) 在roles目录中分别创建以各角色名称命名的目录如webservers等。(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录用不到的目录可以创建为空目录也可以不创建 。(4) 在playbook文件中调用各角色。
实验: 创建httpd角色
#创建roles目录
mkdir roles/{httpd,mysql,redis}/tasks -pv
mkdir roles/httpd/{handlers,files}
#查看目录结构
tree roles/roles/├── httpd│ ├── files│ ├── handlers│ └── tasks├── mysql│ └── tasks└── redis└── tasks
#创建目标文件
cd roles/httpd/tasks/
touch install.yml config.yml service.yml
#vim install.yml- name: install httpd packageyum: namehttpdvim config.yml- name: config file copy: srchttpd.conf dest/etc/httpd/conf/ backupyes vim service.yml- name: start service service: namehttpd statestarted enabledyes#创建main.yml主控文件,调用以上单独的yml文件,main.yml定义了谁先执行谁后执行的顺序vim main.yml- include: install.yml- include: config.yml- include: service.yml#准备httpd.conf文件,放到httpd单独的文件目录下cp /app/ansible/flies/httpd.conf ../files/#创建一个网页vim flies/index.htmlh1 welcome to weixiaodong home \h1#创建网页的yml文件vim tasks/index.yml- name: index.htmlcopy: srcindex.html dest/var/www/html #将网页的yml文件写进mian.yml文件中vim mian.yml- include: install.yml- include: config.yml- include: index.yml- include: service.yml#在handlers目录下创建handler文件mian.yml
vim handlers/main.yml
- name: restart service httpdservice: namehttpd staterestarted#创建文件调用httpd角色
cd /app/ansidle/roles
vim role_httpd.yml
---
# httpd role
- hosts: appsrvsremote_user: root roles: #调用角色- role: httpd #查看目录结构
tree
.
httpd
├── files
│ ├── httpd.conf
│ └── index.html
├── handlers
│ └── main.yml
└── tasks├── config.yml├── index.yml├── install.yml├── main.yml└── service.ymlansible-playbook role_httpd.yml创建目录
[rootansible ~]$ cd /etc/ansible/roles/
# 创建需要用到的目录
[rootansible roles]$ mkdir -p httpd/{handlers,tasks,templates,vars}
[rootansible roles]$ cd httpd/
[rootansible httpd]$ tree .
.
├── handlers
├── tasks
├── templates
└── vars4 directories, 0 file变量文件准备vars/main.yml
[rootansible httpd]$ vim vars/main.yml
PORT: 8088 #指定httpd监听的端口
USERNAME: www #指定httpd运行用户
GROUPNAME: www #指定httpd运行组配置文件模板准备templates/httpd.conf.j2
# copy一个本地的配置文件放在templates/下并已j2为后缀
[rootansible httpd]$ cp /etc/httpd/conf/httpd.conf templates/httpd.conf.j2# 进行一些修改调用上面定义的变量
[rootansible httpd]$ vim templates/httpd.conf.j2
Listen {{ PORT }}
User {{ USERNAME }}
Group {{ GROUPNAME }}任务剧本编写创建用户、创建组、安装软件、配置、启动等
# 创建组的task
[rootansible httpd]$ vim tasks/group.yml
- name: Create a Startup Groupgroup: namewww gid60 systemyes# 创建用户的task
[rootansible httpd]$ vim tasks/user.yml
- name: Create Startup Usersuser: namewww uid60 systemyes shell/sbin/nologin# 安装软件的task
[rootansible httpd]$ vim tasks/install.yml
- name: Install Package Httpdyum: namehttpd stateinstalled# 配置软件的task
[rootansible httpd]$ vim tasks/config.yml
- name: Copy Httpd Template Filetemplate: srchttpd.conf.j2 dest/etc/httpd/conf/httpd.confnotify: Restart Httpd# 启动软件的task
[rootansible httpd]$ vim tasks/start.yml
- name: Start Httpd Serviceservice: namehttpd statestarted enabledyes# 编写main.yml将上面的这些task引入进来
[rootansible httpd]$ vim tasks/main.yml
- include: group.yml
- include: user.yml
- include: install.yml
- include: config.yml
- include: start.ym编写重启httpd的handlershandlers/main.yml
[rootansible httpd]$ vim handlers/main.yml
# 这里的名字需要和task中的notify保持一致
- name: Restart Httpdservice: namehttpd staterestarted编写主的httpd_roles.yml文件调用httpd角色
[rootansible httpd]$ cd ..
[rootansible roles]$ vim httpd_roles.yml
---
- hosts: allremote_user: rootroles:- role: httpd #指定角色名称整体的一个目录结构查看
[rootansible roles]$ tree .
.
├── httpd
│ ├── handlers
│ │ └── main.yml
│ ├── tasks
│ │ ├── config.yml
│ │ ├── group.yml
│ │ ├── install.yml
│ │ ├── main.yml
│ │ ├── start.yml
│ │ └── user.yml
│ ├── templates
│ │ └── httpd.conf.j2
│ └── vars
│ └── main.yml
└── httpd_roles.yml5 directories, 10 files测试playbook语法是否正确
[rootansible roles]$ ansible-playbook -C httpd_roles.ym上面的测试没有问题正式执行playbook
[rootansible roles]$ ansible-playbook httpd_roles.ymAnsible性能调优
相比于其他的自动化配置工具Ansible的一个突出特性就是它是基于SSH链接对下游设备进行控制的这样做的突出好处就是方便下游设备不需要安装客户端软件。但是这也不可避免的带来一个问题即Ansible的执行速度较慢。并且随着Ansible控制设备的增多Ansible的执行速度会越来越慢。
关于Ansible执行速度的问题尽管是Ansible的硬伤但是我们还是可以对其进行部分的优化尽量的加快Ansible的执行速度。对Ansible的优化可以有两个思路一个是优化SSH链接使得SSH的传输速度变快。
另一个如下图所示
每次Ansible Playbook在执行时都会收集下游设备的信息这个过程通常要耗费较长的时间。因此我们可以考虑使用Redis对这些信息进行缓存从而加快收集信息的速度如果业务环境允许我们也可以直接控制Ansible设备跳过该步骤。
Ansible SSH链接调优
SSH关闭密钥检测
在默认情况下以SSH登录远程设备时该设备会检查远程主机的公钥并且将该公钥记录在~/.ssh/known_hosts文件中当下次该主机访问时OpenSSH会核对公钥。如果公钥不同则OpenSSH会发出警告如果公钥相同则OpenSSH则会提示输入密码。
SSH对主机公钥的检查是根据StrictHostKeyChecking变量来设定的StrictHostKeyChecking的检查级别包括no不检查ask是否检查要询问yes每次都检查False关闭检查。
我们可以在Ansible的配置文件中defaults模块下加入如下代码
host_key_checking False加入后配置文件如下所示
这样Ansible就可以关闭密钥检测了。
OpenSSH链接优化
在使用OpenSSH服务时默认情况下服务器端会根据客户端的IP地址进行DNS反向解析得到客户端的主机名然后根据获取到的主机名再次进行DNS查询得到IP地址比较这两个IP地址是否一样。这样做可以在一定程度上提高安全性但是却会浪费时间因此我们可以通过关闭这一特性来实现加速SSH链接速度的目的。 关闭该特新需要进入到/etc/ssh/sshd_config目录下找到UseDNS的参数将其修改为no修改后的配置文件如下所示
之后重启SSHD服务即可生效。
SSH pipelining链接加速
SSH的pipelining是另一个加速Ansible执行速度的方法。在Ansible的设置中SSH的pipelining功能时默认关闭的这是为了兼容不同的sudo配置主要是requieretty选项。因此如果我们不需要在Ansible的控制中使用sudo选项可以关闭这一选项以加快SSH链接速度。
如果要关闭这一项可以打开Ansible的配置文件/etc/ansible/ansbile.cfg将pipelining False改为True即可修改后的配置文件如下所示 Ansible Facts调优
关闭Gather Facts
为了减少Ansible在收集客户端信息时的时间我们首先想到的就是直接删除这一选项。要删除这一步骤我们可以在palybook文件中添加一行
gather_facts: no添加后的Playbook文件如下所示 这样我们在执行该Playbook时就不会再次进行gather_facts的步骤了结果如下所示
将Facts信息存入Redis缓存
除了删除这一步之外我们还可以考虑将客户端信息写入内存以加快信息查询。 文章转载自: http://www.morning.lrdzb.cn.gov.cn.lrdzb.cn http://www.morning.sdktr.com.gov.cn.sdktr.com http://www.morning.rltsx.cn.gov.cn.rltsx.cn http://www.morning.dpqwq.cn.gov.cn.dpqwq.cn http://www.morning.mlpch.cn.gov.cn.mlpch.cn http://www.morning.mlnzx.cn.gov.cn.mlnzx.cn http://www.morning.ztfzm.cn.gov.cn.ztfzm.cn http://www.morning.smxyw.cn.gov.cn.smxyw.cn http://www.morning.tnbas.com.gov.cn.tnbas.com http://www.morning.rkjb.cn.gov.cn.rkjb.cn http://www.morning.reababy.com.gov.cn.reababy.com http://www.morning.ujianji.com.gov.cn.ujianji.com http://www.morning.zzgkk.cn.gov.cn.zzgkk.cn http://www.morning.klwxh.cn.gov.cn.klwxh.cn http://www.morning.rtzd.cn.gov.cn.rtzd.cn http://www.morning.dwkfx.cn.gov.cn.dwkfx.cn http://www.morning.bwttj.cn.gov.cn.bwttj.cn http://www.morning.zcqgf.cn.gov.cn.zcqgf.cn http://www.morning.ckrnq.cn.gov.cn.ckrnq.cn http://www.morning.wklhn.cn.gov.cn.wklhn.cn http://www.morning.chehb.com.gov.cn.chehb.com http://www.morning.jmllh.cn.gov.cn.jmllh.cn http://www.morning.jxcwn.cn.gov.cn.jxcwn.cn http://www.morning.hrrmb.cn.gov.cn.hrrmb.cn http://www.morning.sqxr.cn.gov.cn.sqxr.cn http://www.morning.nhlyl.cn.gov.cn.nhlyl.cn http://www.morning.bfrsr.cn.gov.cn.bfrsr.cn http://www.morning.jxcwn.cn.gov.cn.jxcwn.cn http://www.morning.ngjpt.cn.gov.cn.ngjpt.cn http://www.morning.nchlk.cn.gov.cn.nchlk.cn http://www.morning.c7495.cn.gov.cn.c7495.cn http://www.morning.mqwnz.cn.gov.cn.mqwnz.cn http://www.morning.gprzp.cn.gov.cn.gprzp.cn http://www.morning.txrq.cn.gov.cn.txrq.cn http://www.morning.yfcbf.cn.gov.cn.yfcbf.cn http://www.morning.zylzk.cn.gov.cn.zylzk.cn http://www.morning.rwpfb.cn.gov.cn.rwpfb.cn http://www.morning.zcwtl.cn.gov.cn.zcwtl.cn http://www.morning.glswq.cn.gov.cn.glswq.cn http://www.morning.xhjjs.cn.gov.cn.xhjjs.cn http://www.morning.qgwpx.cn.gov.cn.qgwpx.cn http://www.morning.fsfz.cn.gov.cn.fsfz.cn http://www.morning.qxwwg.cn.gov.cn.qxwwg.cn http://www.morning.yrskc.cn.gov.cn.yrskc.cn http://www.morning.lwzgn.cn.gov.cn.lwzgn.cn http://www.morning.xmnlc.cn.gov.cn.xmnlc.cn http://www.morning.wkhfg.cn.gov.cn.wkhfg.cn http://www.morning.khcpx.cn.gov.cn.khcpx.cn http://www.morning.skdhm.cn.gov.cn.skdhm.cn http://www.morning.qxkjy.cn.gov.cn.qxkjy.cn http://www.morning.ydryk.cn.gov.cn.ydryk.cn http://www.morning.bttph.cn.gov.cn.bttph.cn http://www.morning.rdlxh.cn.gov.cn.rdlxh.cn http://www.morning.hryhq.cn.gov.cn.hryhq.cn http://www.morning.sh-wj.com.cn.gov.cn.sh-wj.com.cn http://www.morning.qmwzr.cn.gov.cn.qmwzr.cn http://www.morning.tbqxh.cn.gov.cn.tbqxh.cn http://www.morning.yksf.cn.gov.cn.yksf.cn http://www.morning.yzsdp.cn.gov.cn.yzsdp.cn http://www.morning.mdlqf.cn.gov.cn.mdlqf.cn http://www.morning.jmmz.cn.gov.cn.jmmz.cn http://www.morning.bwttp.cn.gov.cn.bwttp.cn http://www.morning.mkxxk.cn.gov.cn.mkxxk.cn http://www.morning.lchtb.cn.gov.cn.lchtb.cn http://www.morning.bhrkx.cn.gov.cn.bhrkx.cn http://www.morning.nflpk.cn.gov.cn.nflpk.cn http://www.morning.kjlhb.cn.gov.cn.kjlhb.cn http://www.morning.qbksx.cn.gov.cn.qbksx.cn http://www.morning.yhgbd.cn.gov.cn.yhgbd.cn http://www.morning.wgbsm.cn.gov.cn.wgbsm.cn http://www.morning.lqznq.cn.gov.cn.lqznq.cn http://www.morning.drgmr.cn.gov.cn.drgmr.cn http://www.morning.ymwnc.cn.gov.cn.ymwnc.cn http://www.morning.nynlf.cn.gov.cn.nynlf.cn http://www.morning.yxnkr.cn.gov.cn.yxnkr.cn http://www.morning.xkyst.cn.gov.cn.xkyst.cn http://www.morning.lgsqy.cn.gov.cn.lgsqy.cn http://www.morning.qcdhg.cn.gov.cn.qcdhg.cn http://www.morning.wrlxy.cn.gov.cn.wrlxy.cn http://www.morning.cjqcx.cn.gov.cn.cjqcx.cn