Linux里面自动化部署工具有哪些

Linux里面自动化部署工具有哪些,第1张

1 Puppet

Puppet是一款开源工具,旨在为系统管理员大大简化自动化和报告工作。它基本上是款配置管理软件,有助于配置和维护企业网络中的服务器及其他系统。系统管理员通常每天要花大量时间重复做同样的任务。他们总是想要使这些任务实现自动化,以便有更多的时间来处理其他项目或学习新的概念和脚本语言。管理员可以通过编写脚本使任务实现自动化,但是在拥有大型网络的公司,脚本不是很方便。这时候,Puppet就大有用场,因为借助Puppet,你可以:

为网络上的每个主机定义独特的配置设置;

不断监测网络,查找任何变动;

帮助高效地创建和管理用户;

帮助管理每个开源工具的配置设置。

2 CHEF

Chef是另一款可供Linux系统管理员使用的流行的自动化工具。它用Ruby和Erlang编写,对于配置和维护公司的服务器大有帮助,无论贵公司拥有十台服务器还是上百台。它还可以帮助你将云端服务器与亚马逊EC2、OpenStack、RackSpace或谷歌云整合起来。Chef可以将你的基础设施转变成代码,那样借助代码,你只要更改几行代码,就能轻松撤下一台服务器,从而让你轻松管理服务器。物理节点还意味着:将变更内容部署到生产环境之前,可以对它轻松进行测试,你还可以轻松控制针对代码的每次更新的版本。Chef DK为你提供了测试和管理配置的所有工具,Chef Server充当你所有“菜谱”(recipe)的存储库,可以管理与服务器连接的每个节点。Chef客户软件在每个客户端上运行,时不时收到服务器方面的信息,从而更新其配置设置。

3 CFEngine

面向Linux系统管理员的下一款自动化工具是CFEngine,这是另一个领先的自动化系统,可帮助你轻松管理整套基础设施,并使之实现自动化。一旦你使用CFEngine为网络中的系统定义了配置,那么CF Engine就会自动确保配置符合规范。不用说,如果你的网络中有10个或100个节点,可以在短短几秒内更新或改动任何一个节点或所有节点。CFEngine之所以受到许多Linux系统管理员的青睐,是由于它运行成本低、响应速度快、具有自愈合功能。

4 Ansible

Ansible是Red Hat提供的一款开源配置管理和IT企业自动化软件,随带一种简单的编程语言,让系统管理员能够高效地处理自动化和配置过程。Ansible由控制机器和控制机器控制的节点组成。节点是通过SSH来加以控制的。Ansible的主要特点之一是代理并不是部署到节点 ,但是完全借助SSH来进行通信。易学易用、具有一致性、高可靠性和安全性是让Ansible脱颖而出的其他特性。Ansible的唯一局限就是无法配置裸机和虚拟机。

5 Foreman

Foreman是另一种用于取证分析的开源配置管理工具。Foreman提供了仪表板,我们可以通过仪表板来配置裸机服务器和虚拟机。默认情况下,无论我们何时安装Foreman,它都使用Puppet作为配置工具。不过借助插件,Foreman还支持与其他配置管理工具整合起来,比如Chef、Puppet、Ansible、Salt及其他众多工具。Foreman自动化工具还随带各种各样的接口,包括命令行接口、Web前端以及REST API。Foreman的其他一些显著功能包括如下:

通过仪表板,管理Puppet模块和puppet类方面的改动;

很容易从Foreman仪表板来管理Puppet环境;

由于仪表板,创建主机群(Hosts Group)以及为主机群添加puppet模块变得很轻松;

可以从Foreman仪表板,轻松添加Puppet模块或推送到节点。

6 Katello

Katello是另一种开源自动化工具。换而言之,我们可以说Katello是一种开源版的Red Hat satellite Server;如果我们不想花钱在企业产品及其支持上,就可以用它来代替Red Hat satellite Server。Katello已被Foreman收购,Foreman中的大部分功能在Katello中也得到了支持。Katello Server的主要功能如下:

给基于Linux的服务器(RHEL和CentOS )打补丁;

使用Pulp Service来同步代码库;

使用Foreman进行各种配置;

它还可以处理订阅内容管理,并审计所有已部署的软件包;

借助Katello,你可以为所有主机创建主机群,另外还可以在单一主机或一群主机上批量执行 *** 作。

7 Nagios

Nagios现在名为Nagios Core,它是一种开源自动化和监控工具,可以管理基础设施中的所有系统。它还提供警报服务,一旦察觉到你的网络中哪里有问题,就会提醒系统管理员。借助SNMP以及Nagios,系统管理员还可以控制并管理打印机、路由器和交换机。Nagios让我们得以创建事件处理工具,一旦某个应用程序及其服务停运,就可以自动重启出现故障的那个应用程序及其服务。

对于一个开发人员来讲,可能运维并不是自己的职责所在。但是作为一名开发人员,却不能不了解自动化运维的整个流程。因为对于一个信息系统而言,开发和运维本质是一体的,尤其对于一些小公司来讲,可能运维人员本身就是开发人员抽空兼任的。

而自动化运维,本质上是介于开发和运维之间的,是运维和开发的交集,甚至很多时候都要写不少代码。因此,任何一个开发人员,都需要有自动化运维的相关知识。

一个了解好的开发人员,即使自己不做运维相关的工作,也能够知道自己在将项目交付给运维人员的时候,哪些东西是重要的,那些是必须配置的等等。然而在实际工作中,往往开发人员会给运维人员留下一些坑,一些只有他自己知道,而运维人员不知道的东西。导致运维人员自己试了很多次发现不行的时候,找到开发人员,开发人员研究了一下才会告诉他,在某某环境中必须用哪个端口之类的。这样不仅白白浪费了运维人员的时间,也增加了很多沟通的工作量。

反过来也是如此,一些现场的问题如果运维人员不能现场给出问题的定位。对于开发人员来讲是非常难以复现的。比如之前有某家企业,运维人员在客户现场发现问题。费了很大力气从客气的内网里面把日志导出来,发给开发人员,结果开发人员仔细研究了日志之后,发现是网不通的问题。开发人员显然是不可能知道为啥网不通的,搞不好是压根没连网线。

所以今天我们来聊一聊,对于一个程序员来讲,需要了解的自动化运维的那些事。

一、自动化运维的概念

随着信息时代的持续发展,初期的几台服务器已经发展成为了庞大的数据中心,单靠人工已经无法满足在技术、业务、管理等方面的要求。一个运维人员手工配置几台服务器还可能。配置几百上千台服务器那就累死了,还容易出错。那么就需要对运维工作进行标准化、自动化、架构优化、过程优化等。从面降低运维服务成本。其中,自动化最开始作为代替人工 *** 作为出发点的诉求被广泛研究和应用。

所谓自 动化运维,即在最少的人工干预下,结合运用脚本与第三方工具,保证业务系统724小时高效稳定运行 。这是所有业务系统运维的终极目标。

按照运维的发展成熟度来看, 运维大致可分为三个阶段

(1)依靠纯手工,重复地进行软件的部署与运维;

(2)通过编写脚本,方便地进行软件的部署与运维;

(3)借助第三方工具,高效地进行软件的部署与运维;

二、自动化运维需要解决的问题

自动化运维通常来讲,需要解决以下几个问题: 自动部署配置、风险事前预警、故障事中解决、和故障事后管理

三、自动化运维的常用工具

自动化运维常用的工具包括以下几种:

1、Ansible

ansible是基于Python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

ansible具有如下一些特性:

(1)模块化:调用特定的模块,完成特殊的任务。

(2)Paramiko(python对ssh的实现),PyYaml,jinja2(模块语言)三个关键模块。

(3)支持自定义模块,可使用任何编程语言写模块。

(4)基于python语言实现。

(5)部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖KPI(无需SSL)。

(6)安全,基于OpenSSH

(7)幂等性:一个任务执行一次和执行n遍效果一样,不因重复执行带来意外情况。

(8)支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构。

(9)较强大的多层解决方案role。

2、Chef

Chef是一个功能强大的自动化工具,可以部署,修复和更新以及管理服务器和应用程序到任何环境。

Chef 主要分为三个部分 Chef Server、Workstation 以及 Chef Client。用户在 Workstation 上编写 Cookbook。然后,通过 knife 命令上传到 Chef Server。最后,在 Chef Client 上面实施安装和部署工作。所以,对于 Cookbook 地编写在整个自动化部署中起到了重要的作用。

Chef Server 包含所有配置数据,并存储描述Chef-Client中每个Nodes的Recipe,Cookbook和元数据。配置详细信息通过Chef-Client提供给Nodes。所做的任何更改都必须通过Chef Server进行部署。在推送更改之前,它通过使用授权密钥来验证Nodes和Workstations是否与服务器配对,然后允许Workstations和Nodes之间进行通信。

Workstations 用于与Chef-server进行交互,还用于与Chef-nodes进行交互。它还用于创建Cookbook。Workstations是所有交互发生的地方,在这里创建,测试和部署Cookbook,并在Workstations中测试代码。

Chef命令行工具 是创建,测试和部署Cookbook的地方,并通过此策略将其上载到Chef Server。

Knife 用于与ChefNodes进行交互。

Test Kitchen 用于验证Chef代码

Chef-Repo 是一个通过Chef命令行工具在其中创建,测试和维护Cookbook的存储库。

Nodes 由Chef管理,每个Nodes通过在其上安装Chef-Client进行配置。 ChefNodes 是一台机器,例如物理云,云主机等。

Chef-Client 负责注册和认证Nodes,构建Nodes对象以及配置Nodes。Chef-Client在每个Nodes上本地运行以配置该Nodes。

Cookbook 是Chef 框架的重要基础功能之一。在 Chef Server 对目标机器做安装部署的时候,是通过 Runlist。而 Runlist 里面又包含了一个一个具体的 Cookbook,所以,最终对一个目标机器的部署任务就落到了 Cookbook 上。而对于 Cookbook 来说,其中包含了多个组件,我们可以将 Cookbook 简单地理解成一个容器或者可以理解为一个包,里面包含了 recipes、files、templates、libraries、metadata 等信息。这些信息用于配置我们的目标机器。

3、Puppet

puppet是一种Linux、Unix平台的集中配置管理系统,所谓配置管理系统,就是管理其里面诸如文件、用户、进程、软件包等资源。它可以运行在一台服务器端,每个客户端通过SSL证书连接到服务端,得到本机器的配置列表,然后根据列表来完成配置工作,所以如果硬件性能比较高,维护管理上千上万台机器是非常轻松的,前提是客户端的配置、服务器路径、软件需要保持一致。

客户端Puppet会调用本地facter,facter探测出该主机的常用变量,例如主机名、内存大小、IP地址等。然后Puppetd把这些信息发送到Puppet服务端;

Puppet服务端检测到客户端的主机名,然后会检测manifest中对应的node配置,并对这段内容进行解析,facter发送过来的信息可以作为变量进行处理;

Puppet服务器匹配Puppet客户端相关联的代码才能进行解析,其他的代码不解析,解析分为几个过程,首先是语法检查,然后会生成一个中间的伪代码,之后再把伪代码发给Puppet客户端;

Puppet客户端接收到伪代码之后就会执行,执行完后会将执行的结果发送给Puppet服务器;

Puppet服务端再把客户端的执行结果写入日志。

4、Saltstack

SaltStack是基于python开发的一套C/S自动化运维工具。部署轻松,扩展性好,很容易管理上万台服务器,速度够快。与服务器之间的交流,以毫秒为单位。SaltStack提供了一个动态基础设施通信总线用于编排,远程执行、配置管理等等。它的底层使用ZeroMQ消息队列pub/sub方式通信,使用SSL证书签发的方式进行认证管理,传输采用AES加密。

在saltstack架构中服务器端叫Master,客户端叫Minion。

在Master和Minion端都是以守护进程的模式运行,一直监听配置文件里面定义的ret_port(接受minion请求)和publish_port(发布消息)的端口。当Minion运行时会自动连接到配置文件里面定义的Master地址ret_port端口进行连接认证。

saltstack除了传统的C/S架构外,其实还有一种叫做masterless的架构,其不需要单独安装一台 master 服务器,只需要在每台机器上安装 Minion端,然后采用本机只负责对本机的配置管理机制服务的模式。

saltstack提供如下一些功能:

(1)远程执行:(批量执行命令)在master上执行命令时,会在所有的minion上执行。

(2)配置管理/状态管理 :(描述想到达到的状态,saltstack就会去执行)

(3)云管理(cloud):用于管理云主机

(4)事件驱动:被动执行,当达到某个值会自动触发

这四种自动化运维工具的比较如下,现在主流的基本上ansible和saltstack用的多一些:

Ruby 和rail 回归框架

Ruby和 rail是非常简洁的 很容易 很丰富 我无法避免的连续看到以及听到以上这样的说法 比如说 Bill Walton 写的Rail回顾上关于Ruby的文章提到 如果我告诉你当你使用Rail开发一个Web应用程序可以比你使用一种特定的Java框架开发要快至少十倍的时候 你会怎么想

在尝试了RnR之后 我发现这就是一个伴随旧技术的非常经典的框架

· Ruby是一种非常有力量的语言 就像Smalltalk 我选择静态语言

· 搭建的材料是被动代码生成 就像是IDE wizards或者AppFuse 我选择动态代码生成 或者是更好的——根本就不需要代码生成

· 关系数据库中心 编码发生器和ActiveRecord在表中会被首先想到 然后是在类别中被想到 我选择一种仅仅面向对象的 就像是Hibernate JPA 甚至是ODBMS

· MVC 我正在寻找比旧式MVC框架更新很好的工具

Java的问题 Java开发者

在Java的世界中 生产力是文化问题 而不是技术问题 这就是所谓的这不是Java的错 而是我们的错 我们作为Java开发者需要设计出非常漂亮的体系 以适用于任何地方的GoF模式 使得任何工具都是可再度使用的 把三层架构放到我们所有的系统中以及使用web服务器 我们不是在寻找最直接的方法 所以我们就没办法发现最直接的方法 但是Java 是一种非常简单的语言 使得我们很轻易就可以接近软件开发

Java生产力 其它的方法

解决生产力的一个方法是使用驱动模型 这就是模型环节的开发 仅仅是我们应用程序中的模型环节 就可以使用框架来生产所有的应用程序 MDA OpenXava Trails NakedObjects Roma框架和JMatter都是采用的这种方式

目标

这是所需要应用程序的主要界面

图一

基本上 应用程序推测需要做三件事情

· 列出所有准则的清单

· 创造新准则和编辑现有的准则

· 为某个类别指定合适的准则

Ruby on Rails第一次冲刺

使用RnR的第一步是创建一个新的项目 在命令行你需要输入

$ rails cookbook

现在你必须创建以及配置你的数据库

现在是时间输入你的第一行代码了 在这个例子中使用SQL代码

      drop table if exists recipes;

drop table if exists categories;

create table categories (

id int not null auto_increment

name varchar( ) not null default

primary  key(id)

) engine=InnoDB;

create table recipes (

id int not null auto_increment

category_id int not null

title varchar( ) not null default

description varchar( ) null

date date null

instructions text null

constraint fk_recipes_categories foreign key

(category_id) references categories(id)

primary key(id)

) engine=InnoDB;

显然你需要在数据库上面执行这些语句

最后的步骤是生成Ruby代码 你只需要执行O S框架的下一个命令

$ ruby script\generate scaffold recipe recipe

$ ruby script\generate scaffold category category

现在 你已经拥有RnR应用程序的第一个版本 并且准备运行

很少量的工作 一个简单的 创建表格 然后执行向导 让我们看看结果

Rails结果

这是应用程序的结果

图二

图三

图四

少量的工作 少量的结果

JPA on OX的第一次冲刺

继续使用OpenXava 使用OpenXava的第一步是创建新的项目

$ ant CreateNewProject xml Dproject=CookBook

现在你必须创建以及配置你的数据库

现在是时间输入你的第一步代码了 在这个例子中使用Java代码

      Recipe java:

package okbook model;

import java util ;

import javax persistence ;

import openxava annotations ;

@Entity

@View(members= title; description; date; instructions )

public class Recipe {

@Id @GeneratedValue @Hidden

private Integer id;

@Required @Column(length= )

private String title;

@Column(length= )

private String description;

private Date date;

@Stereotype( HTML_TEXT )

private String instructions;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this id = id;

}

public String getTitle() {

return title;

}

public void setTitle(String title) {

this title = title;

}

public String getDescription() {

return description;

}

public void setDescription(String description) {

this description = description;

}

public Date getDate() {

return date;

}

public void setDate(Date date) {

this date = date;

}

public String getInstructions() {

return instructions;

}

public void setInstructions(String instructions) {

this instructions = instructions;

}

}

Category java:

package okbook model;

import java util ;

import javax persistence ;

import openxava annotations ;

@Entity

public class Category {

@Id @GeneratedValue @Hidden

private Integer id;

@Required @Column(length= )

private String name;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this name = name;

}

}

最后一个步骤是生成数据库图表 你只需要执行项目中的一个小目标

$ ant updateSchema

现在 你已经拥有OpenXava应用程序的第一个版本 并且准备运行

少量的工作 简单的POJO 以及执行 更新图表 让我们看看结果

OpenXava结果

这是应用程序的结果

图五

图六

注意 用户可以创建更新 删除 从列表生成PDF 将列表输入到excel 每一列的命令 大型结果和过滤数据的支持分页 而且你可以直接部署 不需要代码 仅仅是执行一个小目标 JSR 入口上的应用程序 以及OpenXava的look & feel能够适用于入口的look & feel 这就是一个应用程序准备产出的第一步

少量的工作 完美的结果

观察这里RnR 与 OX之间的差别 一个冷静的观点是在RnR中 你先输入表 而在OpenXava中先输入类别

控制器

Rails引起basic CRUD的控制逻辑 你在下面可以看到

图七

另一方面 OX不会为CRUD生成任何代码 OpenXava仅有一个属性代码 可以执行CRUD和打印 将自动化配置给所有的实体 你可以书写你自己的属性CRUD逻辑 或者你可以为一个特有的实体书写详细逻辑 但是你不会为每一个实体设置控制代码 使用这种方法 你需要维护少量的代码 并且你可以改变CRUD独立单元的逻辑

Rails使用合成码 OX使用属性代码

你可以在OpenXava wiki上面学到更多的OX控制器知识

增加关联

为了规范在Ruby中从类别增加关联 你需要在category rb中书写如下代码

图八

以及在recipe rb中

图九

相当简单 但是 你要做更多的工作 你必须编译

cookbook \app\views\recipe\_form r

增加如下代码

      <p><labelfor= recipe_category_id >Category</label><br/>

<%= select( recipe category_id Category find(:llect{|c| [c name c id] }) %></p>:

结果是

图十

在这个环节 OpenXava中 你不得不在Category java中使用JPA规定关联

     @ManyToOne(optional=false) @DescriptionsList

private Category category;

and in Recipe java:

@OneToMany(mappedBy= category )

private Collection recipes;

而且你不需要接触任何类似HTML代码 应用程序将会显示如下

图十一

你有一个为修改产生的链接或者从这里创建新类别

不增加任何辅助编码 如果使用者使用类别单元 他将获得每一个类别中准则的收集 如下所示

图十二

在这里 RnR应用程序还是不具备这种特性 你需要书写一些Ruby 和HTML代码来实现一样的结果

在这一块 RnR 和 OX的主要差别是 在OX中你不需要书写任何HTML类似的代码 事实上你连用户界面代码都根本不需要书写

精确的基础资料

Ruby on Rails指导的下一个步骤是为一种特性生成基础资料 在RnR中你不得不编译控制编码从而达到这个目的 让我们开看看

修改以及更新的方法是增加如下代码行

      @recipe date = Time now

The equivalent in OX is adding the @DefaultValueCalculator annotation in model:

@DefaultValueCalculator(CurrentDateCalculator class)

private Date date;

用一种更为公开的方法获得一样的结果

在这里 尽管RnR中在控制器上放置的代码 OX中统计基础资料的代码 为了确认以及业务逻辑 一般来说是放在模型上 OX促进从控制器转移业务逻辑到模型上

RnR的相关文章中提到 我改良模型文件 所以我需要重新启动我们的web服务器 尽管使用Eclipse WTP 我只需要按一下Ctrl 加上B 在浏览器上点击刷新以便于看见OpenXava应用程序上面模型的变化

结论

Ruby on Rails 和 OpenXava之间最主要的差别是RnR是 MVC框架 你不得不书写模型和控制器 OX是模型驱动框架 你只需要书写模型 结果就是更少的代码 更好的程序

lishixinzhi/Article/program/Java/JSP/201311/19267

首先,我们快速回顾一下我们已经完成的工作。之前,我们学习了使用Storyboards完成的一些工作:

将一个正常的视图控制器嵌入到导航控制器中;

创建了一个表视图,并填充了菜单列表;

使用联线(Segue)从一个视图控制器切换到另一个视图控制器;

本文完成最后的一部分工作。在App启动的时候,显示菜单列表。轻拍其中任何一个菜单项,就切换到另外一个视图,并显示该菜单的详细信息。

我们还没有实现详细视图,该视图现在显示一个静态的标签。我们将继续完成这个项目,完善这个应用程序。

赋值视图控制器类

在第一部分教程中,我们简单创建了一个视图控制器,在Storyboard编辑器中作为一个菜单的详细视图。视图控制器默认赋值为 UIViewController 类。

回到我们的问题。视图中的标签应该随着选择的菜单发生变化。显然,在UIViewController 中需要一个变量存放菜单的名称。

事实是UIViewConroller类仅仅提供了基本的视图管理模型,相当于一个空白的视图,没有变量用于存储菜单名称。因此,不能直接使用UIViewController类,我们扩展这一类,并创建自己的类(也就是UIViewController的子类)。

在项目导航栏中,右击 RecipeBook 文件夹,选择 New File …

选择 Cocoa Touch 栏目下的Objective-C Class作为类模板。

将类命名为RecipeDetailViewController,选择子类为 UIViewController。注意不要选择 With XIB for user interface选项,因为我们将使用Storyboards 设计用户界面,我们不必创建独立的interface builder文件。点击 Next 按钮,保存文件在项目文件夹中。

接着,我们赋值RecipeDetailViewController 类给视图控制器。返回Storyboards编辑器,选择详细视图控制器。在Identity Inspector 窗口,更改类为 RecipeDetailViewController。

添加变量到定制的类中

前面刚刚通过继承UIViewController类,创建了定制的视图控制器类。然而,这个类和父类没有任何不同,除非我们添加自己的变量和方法。还有一些工作我们需要实现的:

赋值一个变量(recipeName)用于数据传递 – 当用户选择Recipe视图中的一个菜单时,必须传递菜单名称到详细视图;

赋值变量(recipeLabel)给文本标签 – 当前标签是静态的,但应该在菜单名称变化时,更新文本标签;

OK,现在添加2个变量(recipeLabel 和 recipeName)。选择RecipeDetailViewControllerh 文件,为接口添加2个属性:

@interface RecipeDetailViewController : UIViewController

@property (nonatomic, strong) IBOutlet UILabel recipeLabel;

@property (nonatomic, strong) NSString recipeName;

@end

选择RecipeDetailViewControllerm文件,为上述变量添加 synthesis。确保代码在@implementation RecipeDetailViewController 下面:

@implementation RecipeDetailViewController

@synthesize recipeLabel;

@synthesize recipeName;

如果你忘记了接口和实现的内容,可返回访问本教程,并回顾相应的概念。

建立变量和UI 元素之间的连接

接下来,我们需要连接recipeLabel 变量到可视化的Label 标签。在Storyboards编辑器,按住Control键,并点击Recipe Detail View Controller 图标,拖拉到Label 对象上。释放按钮,d出变量列表供你选择,选择 recipeLabel 变量。

现在,已经连接了变量和Label UI元素,变量的任何变化将可视化地显示出来。但是,仍然有一项工作没有处理。我们还需要标签显示菜单的名称。因此,在viewDidLoad 方法中,我们添加如下代码,并设置标签文本和菜单名称一致。

- (void)viewDidLoad

{

[super viewDidLoad];

// Set the Label text with the selected recipe

recipeLabeltext = recipeName;

}

尝试编译并运行你的App。哦,在选择任一菜单项后,详细视图完全显示空白。这是期望的效果,因为我们还没有编写任何代码传递菜单名称,recipeName 变量是空白的,导致文本标签也是空白的。

使用联线(Segue)传递数据

现在到了本教程的核心内容了 – 如何使用联线(Segue)在视图控制器之间传递数据。联线管理视图控制器之间的切换。在此基础之上,联线(Segue)对象用来准备视图控制器之间的切换。当联线触发时,在可视化的视图切换发生之前,storyboard运行时调用当前视图控制器的 prepareForSegue:sender: 方法(在本示例中,是RecipeBookViewController)。通过实现该方法,我们可传递任何需要的数据给即将显示的视图控制器。

然而,最好的办法是给Storyboards中每一个联线一个唯一的标识符(identifier),标识符是一个字符串,应用程序使用该字符串来区别不同的联线。随着App越来越复杂,在视图控制器中,将有更多的联线(Segue)。

选择联线,在Identity Inspector窗口,设置identifier属性值。这里,我们将该联线命名为 showRecipeDetail。

接着,我们将在Recipe Book View Controller视图控制器中实现 prepareForSegue:sender: 方法,是联线的源视图控制器。选择 RecipeBookViewControllerm文件,添加如下代码:

- (void)prepareForSegue:(UIStoryboardSegue )segue sender:(id)sender {

if ([segueidentifier isEqualToString:@"showRecipeDetail"]) {

NSIndexPath indexPath = [selftableView indexPathForSelectedRow];

RecipeDetailViewController destViewController = seguedestinationViewController;

destViewControllerrecipeName = [recipes objectAtIndex:indexPathrow];

}

}

在视图切换开始的时候,调用 prepareForSegue 方法。第一行用来验证segue的标识符。在本示例中,识别符为 showRecipeDetail。第二行调用 tableView:indexPathForSelectedRow 获取选择的表行。一旦获取到选择的行,我们将传递给 RecipeDetailViewController 视图控制器。一个Segue 对象包含了需要在转换结束后在视图控制器中显示的内容。你可以使用 seguedestinationViewController 获取目的视图控制器。在本范例中,目的视图控制器为 RecipeDetailViewController。剩下了的代码就是传递菜单名称给目的控制器。

你现在无法运行App。在你复制和粘贴上述方法代码到 RecipeBookViewControllerm 文件中后,你应该看到一些错误信息:

上图显示了3个错误,可总结为2类:

tableView 属性在RecipeBookViewController 中没有找到;

RecipeDetailViewController 是什么?Xcode 不知道它是什么?

我们先讨论第二个错误。在RecipeBookViewController 中,它不知道RecipeDetailViewController。在Objective-C中,可使用 #import 指令引入其他类的头文件。通过引入 RecipeDetailViewController 的头文件,RecipeBookViewController 可以访问详细视图控制器的属性和方法。将如下代码放置在 RecipeBookViewController文件的头部纠正错误:

#import “RecipeDetailViewControllerh”

关于第一个错误,你应该知道如何解决,和我们之前讨论的Label UI 元素相似。应该有相应的tableView 变量连接 UI 元素。

因此,在RecipeBookViewControllerh文件中,在@end 之前添加如下代码:

@property (nonatomic, strong) IBOutlet UITableView tableView;

在RecipeBookViewControllerm文件,添加synthesis指令,告诉编译器为该tableView变量生成访问方法。

@implementation RecipeBookViewController {

NSArray recipes;

}

@synthesize tableView; // Add this line of code

最后,返回Storyboards,连接变量到 UI 元素。在Recipe Book View Controller中,按住Control 键,点击视图控制器,拖拉到表视图中,释放按钮,选择 tableView 变量。

现在,所有的错误应该都解决了。现在尝试编译和运行App。这次,App应该如所期望的效果运行了。选择任一菜单项,详细视图应该显示所选择的菜单项信息。

接下来是什么?

使用导航界面创建App简单么?通过引入 Storyboard,可以显著减少需要编写的代码量。更重要的是,Storyboard界面提供了高层次地预览App的 *** 作流程。我们希望这两篇文章让你理解Storyboard是如何工作的,已经如何使用Storyboard构建你自己的App。尽管我们创建的App比较简单,且都是一些基本的UI元素,但是它详细阐述了基本的概念,你可以基于这些知识创建更复杂的App。

在随后的教程中,我们将研究静态表单元格,并继续使用tab控制器完善App。

为规范处方管理,提高处方质量,促进合理用药,制定了药品的相关管理规定,下面我给大家介绍关于药品处方管理规定的相关资料,希望对您有所帮助。

药品处方管理办法

一、 总则

1适用范围:本办法适用于开具、调剂、保管相关的医疗机构和人员。

2处方的定义:处方是由注册的和执业助理医师(以下简称医师)在诊疗活动中为患者开具的、由取得药学专业技术职务任职资格的药学专业技术人员(以下简称药师)审核、调配、核对,并作为患者用药凭证的医疗文书。

3处方开具与调剂原则:应当遵循安全、有效、经济的原则。

二、处方管理一般规定

1处方标准

(1)前记:包括医疗机构名称,费别,患者姓名,性别,龄,门诊或住院病历号,科别或病区和床位号,临床诊断,开具日期等,并可添列特殊要求的项目。(麻醉药和第一类精神药品处方还应包括患者身份z明编号,代办人姓名、身份z明编号)

(2)正文:以rp或r(拉丁文recipe“请取”的缩写)标示,分列药品名称、剂型、规格、数量、用法用量。

(3)后记:医师签名或加盖专用签章,药品金额以及审核、调配、核对、发药药师签名或加盖专用印章。

2处方颜色:

(1)麻醉药品和第一类精神药品处方为淡红色。右上角标注“麻、精一”。

(2)急诊处方淡**。

(3)儿科处方淡绿色

(4)普通处方白色。

(5)第二类精神药品处方白色。右上角标注“精二”。

3处方书写规范:共12条。

4药品剂量与数量书写要求:

(1)一律用阿拉伯数字书写。

(2)剂量应当使用公制单位:重量以克(g)、毫克(mg)、微克(μg)、纳克(ng)为单位。容量以升(l)、毫升(ml)为单位。国际单位(iu)、单位(u)计算。中药饮片以克(g)为单位。

(3)片剂、丸剂、胶囊剂、颗粒剂分别以片、丸、粒、袋为单位。溶液剂以支、瓶为单位;软膏及霜剂以支、盒为单位。注射剂以支、瓶为单位,应注明含量。中药饮片以剂为单位。

三、处方权的获得

(一)处方权的取得

1经注册的执业医师:在执业地点取得相应的处方权。

2经注册的执业助理医师开具的处方:

(1)须经所在执业地点执业医师签字或加盖专用签章后方有效。

(2)在乡、民族乡、镇的医疗、预防、保健机构执业的助理医师,可以在注册的执业地点取得相应的处方权。

3试用期的医师开具处方:须经所在医疗机构有处方权的执业医师审核、并签名或加盖专用签章后方有效。

(二)麻醉药品与第一类精神药品处方权和调剂资格的取得:医疗机构进行培训,本机构执业医师和药师经考核合格后取得处方权或药品调剂资格。

四、处方的开具

1、购进同一通用名称药品品种的限制:注射剂型和口服剂型各不得超过2种,处方组成类同的复方制剂1-2种。因特殊诊疗需要使用的其他剂型和剂量规格药品的情况除外。

2、使用药品名称的要求:(1)应当使用经药品监督管理部门批准并公布的药品通用名称、新活性化合物的专利药品名称和复方制剂药品名称。(2)院内制剂:省级行政部门审核、药品监督管理部门批准的名称。(3)药品习惯名称:部公布。

3、处方有效期:(1)处方为开具当日有效。(2)特殊情况下需延长有效期的,由开具处方的医师注明有效期限,但有效期最长不得超过3天。

4、处方一般用量:(1)一般处方不得超过7日用量。(2)急诊处方一般不得超过3日用量。(3)处方用量延长规定:对于某些慢性病、老病或特殊情况,处方用量可适当延长,但医师必须注明理由。(4)特殊管理药品处方:麻醉药品、精神药品、医疗用毒性药品、放射性药品的处方用量应当严格执行国家有关规定。

5、不同情况及剂型的麻醉药品和精神药品处方的用法和用量:

(1)门(急)诊一般患者:麻醉药品注射剂每张处方为一次常用量;控缓释制剂为不得超过7日量;其他剂型不得超过3日量。第一类精神药品:同麻醉药品(哌醋甲酯用于治疗儿童多动症不得超过15日常用量)。第二类精神药品:一般不超过7日常用量,延长需要注明理由。

(2)门(急)诊癌症疼痛和中、重度慢性疼痛患者:麻醉药品和第一类精神药品注射剂,每张处方不超过3日常用量;控缓释制剂为不得超过15日常用量;其他剂型不得超过7日常用量。

(3)住院患者:麻醉药品和第一类精神药品处方逐日开具,为1日常用量。

(4)特别需要加强管制的麻醉药品:盐酸二氢埃托啡为一次常用量,二级以上医院内使用;盐酸哌替啶为一次常用量,医疗机构使用。

6、处方要求

(1)医师利用开具普通处方时,需同时打印纸质处方。

(2)其格式与手写处方一致,打印的处方经签名后有效。

(3)药学专业技术人员核发药品时,必须核对打印处方无误后发给药品,并将打印处方收存备查。

五、处方的调剂

1药学专业技术人员应按 *** 作规程调剂处方药品:

(1)认真审核处方。

(2)准确调配药品。

(3)正确书写药袋或粘贴标签,应注明患者姓名和药品名称、用法、用量、包装。

(4)向患者交付处方药品时,按照说明书或处方用法,进行用药交待与指导,包括每种药品的用法、用量、注意事项等。

(5)药学专业技术人员在完成处方调剂后,应当在处方上签名。

2处方用药适宜性审核的内容:共7项。

(1)规定必须做皮试的药品,处方医师是否注明过敏试验及结果的判定。

(2)处方用药与临床诊断的相符性。

(3)剂量、用法的正确性。

(4)选用剂型与给药途径的合理性。

(5)是否有重复给药现象。

(6)是否有潜在临床意义的药物相互作用和配伍禁忌。

(7)其他用药不适宜情况。

3用药不适宜情形的处理:告知处方医师,请其确认或重新开具处方。发现严重不合理用药或用药错误,告知处方医师并记录,按照有关规定报告。

4、调剂处方“四查十对”:①查处方,对科别、姓名、龄;②查药品,对药名、剂型、规格、数量;③查配伍禁忌,对药品性状、用法用量;④查用药合理性,对临床诊断。

5、其他:(1)须凭医师处方调剂处方药品,非经医师处方不得调剂。(2)药师对于不规范处方或者不能判定其合法性的处方,不得调剂。(3)药师完成调剂后,在处方上签名或加盖专用签章。(4)医疗机构不得限制门诊就诊人员外购药品。

六、监督管理

(1)处方点评制度:填写处方评价表。

(2)不得从事处方调剂工作:未取得药学专业技术职务任职资格的人员。

(3)处方保存期限及销毁程序:

保存期限:普通处方、急诊处方、儿科处方保存1。医疗用毒性药品、精神药品及戒毒药品处方保留2。麻醉药品和第一类精神药品处方保留3。

销毁程序:处方保存期满后,经医疗机构主要负责人批准、登记备案,方可销毁。

(4)麻醉药品、精神药品专册登记:内容包括发药日期、患者姓名、用药数量。专册保存期限为3。

七、法律责任

(1)使用未取得任职资格的人员从事处方调剂工作:县级以上卫生行政部门,责令限期改正,并可处5000元以下罚款;情节严重的,吊销《医疗机构执业许可证》。

(2)未按照规定保管麻醉药品和精神药品处方,或者未按规定进行专册登记的:由设区的市级卫生行政部门责令限期改正,给予警告;逾期不改正的,处以5000元以上1万元以下的罚款;情节严重的,吊销其印鉴卡;对直接负责的主管人员和其他直接责任人员,依法给予降级、撤职、开除的处分。

(3)药师未按照规定调剂麻醉药品、精神药品处方的:医学教|育网|收集整理按照《麻醉药品和精神药品管理条例》第七十三条的规定给予处罚(即:情节严重的,吊销其执业证书)

以上就是关于Linux里面自动化部署工具有哪些全部的内容,包括:Linux里面自动化部署工具有哪些、程序员应知应会之自动化运维那些事儿、Java 与Ruby on Rails对接等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10210768.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存