Neste artigo, vou mostrar o processo de instalação do Fedora Server 37 e o processo de atualização.

O primeiro passo é fazer o download da imagem ISO.

Acesse o site https://arm.fedoraproject.org e baixe a imagem raw Servidores Arm.

Estou usando uma maquina virtual com VmFusion, apenas para demonstração com a seguinte configuração: 2 GB de ram e disco de 40GB.

Após configurar o boot para inicializar com a imagem, você terá a seguinte tela.

Selecione a opção Install Fedora.

Eu ativei a conta ROOT e informei a senha, é necessário confirmar duas vezes a senha.

Após realizar a configuração, clique em iniciar a Instalação, na próxima tela será iniciado a transferência encia dos arquivos.

Após a reinicialização, conecte-se com o usuário root e atualize o sistema.

Na linha de comando, digite:

yum update -y

Você poderá acessar o web console para gerenciar o servidor.

Digite o IP acompanhado da porta 9090, exemplo:

https://localhost:9090

Localize o arquivo de configuração do MySQL e altere a linha para ficar conforme exemplo

default-time-zone = America/Sao_Paulo

Se a linha não existir inclua a linha e reinicie o serviço.

Outra de forma de alterar e digitar o comando

SET time_zone=’America/Sao_Paulo’;

Para confirmar a alteração digite o comando;

select @@time_zone;

Você devera ter um retorno, conforme abaixo.

Para mais informações consulte o site oficial do MySQL.

https://dev.mysql.com/doc/refman/8.0/en/time-zone-support.html

Caso o comando SET apresente uma mensagem de erro, quer dizer que você não tem os dados na tabela interna do MySQL.

SELECT COUNT(*) FROM mysql.time_zone_name;

SELECT COUNT(*) FROM mysql.time_zone;

SELECT COUNT(*) FROM mysql.time_zone_transition;

SELECT COUNT(*) FROM mysql.time_zone_transition_type;

Para popular essas tabelas importe a tabela a ser obtida no link

php artisan migrate

[Illuminate\Database\QueryException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes (SQL: alter table users add unique users_email_unique(email))

Este erro ocorre devido a capacidade de armazenamento do engine (charset) do banco de dados;

Inclua a linha $table->engine = ‘InnoDB’; nos arquivos [migrations] para evitar o erro.

Caso queira manter como MyISAM edite o arquivo Builder.php, conforme descrito abaixo.

Correção rápida: Edite o arquivo; vendor\laravel\framework\src\Illuminate\Database\Schema\Builder.php

Alterando a variável $ defaultStringLength = 255;, para $defaultStringLength = 250;. Conforme o exemplo abaixo;

Exemplo:
public static $defaultStringLength = 255;

public static $defaultStringLength = 250;

Resolvendo o erro:

Error Code: 1415
Not allowed to return a result set from a function

Este erro ocorre devido a ausência do comando INTO

DELIMITER $$

CREATE
FUNCTION obter_nome_(cd_pessoa INT(11))
RETURNS VARCHAR(150) CHARSET latin1

DETERMINISTIC

BEGIN

DECLARE nm_pessoa_r VARCHAR(150);

IF (cd_pessoa_e IS NOT NULL) THEN

    SELECT
    p.nm_pessoa
    INTO
    nm_pessoa_r
    FROM
        pessoa p
    WHERE p.cd_pessoa = cd_pessoa_e
    ;
END IF;

RETURN  nm_pessoa_r;
END$$

DELIMITER ;

Estarei ensinando como conectar ao banco de dados MySQL a partir do seu computador utilizando um SGBD.

A maioria das hospagens disponibilizam o PhpMyAdmin, que auxilia na criação e manutenção do banco de dados.

Mas por ser on-line, acaba por não ser muito útil na criação de querys e rotinas devido as opções para salvar os arquivos, debug nas rotinas e principalmente os testes.

O Cpanel possui o recurso Remote MySQL que permite liberar a conexão remota de hosts(servidores e computadores) ao banco de dados.

Vamos lá!
1º Passo – Acessar o Cpanel

Após conectar ao Cpanel localize o recurso MySQL Remoto.

2º Passo – Adicionar o IP/Host para conexão.

No campo Host, digite o IP ou nome do servidor no qual irá conceder a permissão de acesso, mas é recomendado usar um endereço IP.

Exemplos:

IP: 127.0.0.1
Host/Server: server1.fabianobento.com.br

Também pode ser utilizado o caractere %(porcentagem), como coringa, para permitir o acesso de qualquer lugar e computador.
Para delimitar uma subnet, utilize parte do IP com o caractere %.

Exemplo: 127.0.0.%

3º Remover permissão de acesso

Para remover a permissão de acesso, basta clicar sobre a opção Excluir, do item a ser removido a permissão de acesso.

Hoje mostrar como criar um dashboard no Grafana, através de uma consulta SQL no banco de dados.

Antes de avançarmos é necessário configurar o DATASOURCE para a conexão com o banco.

Clique no ícone lateral e selecione a opção (Data Sources).

Clique no botão Add data source Informe um nome para o data source, selecione o tipo e os dados para a conexão.
É importante que defina um nome que identifique a base de dados, pois será utilizado posteriormente.

No exemplo, estou usando conexão com o Banco MySQL.

Ao salvar, observe que o Grafana fará um teste de conexão, e vai exibir uma mensagem indicando que foi conectado com sucesso. Se a mensagem for de erro revise os dados de conexão.

Será listado todos os data sources configurados.

Vamos ao Dashboard!

Escolha o tipo de dashboard que deseja incluir, estou usando (Table)

Agora clique na opção ao lado do título e em Edit.Informe o título do Dashboard e descrição

Read More →

Primeiros passos após Instalação do Grafana (Configurações iniciais)

Após a instalação do Grafana, quando logamos é apresentado a seguinte tela, que mostra que ainda não foi configurado nenhum datasource, instalação de plugin, definido equipe ou criado algum dashboard.

Antes de prosseguir baixe os programas abaixo para auxiliar nas configurações.

Aplicativos úteis para manutenção do servidor Grafana em ambiente Linux

Putty.exe
WinSCP (aplicativo para transferência de arquivos entre Windows e Linux, além da possibilidade de editar arquivos do Linux a partir do Windows (caso não queira usar o editor *vi)

Comandos úteis:

sudo service grafana-server start
sudo service grafana-server stop

Porta de Acesso / Alterar Porta

A porta padrão de acesso ao Grafana é 3000 (http://localhost:3000), caso queira redirecionar a porta padrão no Linux execute o comando abaixo(permissão e redirecionamento),  para a porta 80.

1
2
sudo setcap 'cap_net_bind_service=+ep' /usr/sbin/grafana-server
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000

 

Plugins

Alguns plugins são nativos do Grafana, ou seja, por padrão já é instalado.

Caso queira instalar novos Plugins, você pode feito de duas formas, o download do plugin no site oficial (https://grafana.com/plugins) e copiar para o diretório  /var/lib/grafana/plugins ou via linha de comando (imagem abaixo)


Lembre que após a instalação do Plugin será necessário reiniciar o Grafana Server

1
sudo service grafana-server stop
1
sudo service grafana-server start

Ou

1
sudo service grafana-server restart

Alguns Plugins são instalados via Git, para instalar o git execute o comando no CentOS

1
yum install -y git npm

Lista de Alguns Plugins
– WorldPing
O worldPing é um plug-in para o Grafana que testa, armazena e alerta continuamente o desempenho global e a disponibilidade de seus aplicativos da Internet, para que você possa identificar problemas.

Comando para instalar: grafana-cli plugins install raintank-worldping-app

– Zabbix
Visualize suas métricas do Zabbix com o software de código aberto líder para análise de séries temporais.

Comando para instalar: grafana-cli plugins install alexanderzobnin-zabbix-app

– Clock
O painel de relógio pode mostrar a hora atual ou uma contagem regressiva e atualiza a cada segundo.

Comando para instalar: grafana-cli plugins install grafana-clock-panel

– ntopng
O plug-in de fonte de dados oficial do Grafana permite que você navegue rapidamente por dados dentro dos belos painéis do Grafana.

Comando para instalar:  grafana-cli plugins install ntop-ntopng-datasource

 

Arquivo de Configuração:

No Linux Centos 7 o arquivo de configuração do Grafana fica localizado em: /etc/grafana/grafana.ini, mas atenção, este arquivo não deve ser editado.

Para incluir suas configurações, você deve criar um arquivo com o nome custom.ini no diretório /etc/grafana (conforme imagem abaixo), incluindo suas configurações personalizadas.

Todas as opções de configuração podem ser lidas no site oficial (http://docs.grafana.org/installation/configuration/)

Alterar a senha admin

Acesse no menu lateral as referencias do usuário, informe o nome, email e altera a senha de Admin.

Configurar data Source

Para incluir um novo datasource, selecione no menu lateral a opção e clique em Add Data Source

Como Exemplo incluindo um DataSource MySQL, observe que ao salvar será apresentado uma mensagem indicado que foi conectado com sucesso.

Configurar Plugin Zabbix

Post 1

Preparação e Configuração do Ambiente para Instalação do Grafana no Linux CentOS 7/RedHat/Fedora/OpenSuse

Post 2

Instalando Grafana no Linux CentOS/RedHat/Fedora/OpenSuse

Post 3

Primeiros passos após Instalação do Grafana

 

 

Preparação e Configuração do Ambiente para Instalação do Grafana no Linux CentOS 7/RedHat/Fedora/OpenSuse

É necessário ter conhecimentos básicos de rede e Linux.

Vamos criar uma máquina virtual com a seguinte configuração: 2 Processadores, 2 cores, 2 GB Ram, HD 50SSD com uma área (3 GB Swap)

Programas necessários:
VirtualBox – https://www.virtualbox.org/wiki/Downloads (Para criar máquina virtual)
Putty – https://www.putty.org/
WinSCP – https://winscp.net/eng/download.php
Sistema Operacional: CentOS 7.4 x64 – https://www.centos.org/download/

Após fazer o download e instalação do Virtual Box vamos criar a VM.

Para usar versão 64 bits no Oracle Virtual Box, é necessário habilitar na Bios do computador a opção da arquitetura (Intel Virtual = Enable), ou ative via prompt de comando (bcdedit /set hypervisorlauchetype off)

Na opção do armazenamento você pode usar a opção Dinamicamente alocado para que seja dimensionado conforme o uso, eu prefiro alocar o Tamanho Fixo do disco.

Para o tamanho do disco você pode dimensionar apenas 20GB  para a instalação do Grafana (comporta perfeitamente), como pretendo instalar outros serviços na mesma VM (Zabbix, banco PostGree, Oracle Express, irei dimensionar com 40GB/50GB)Como estou usando a opção para alocar tamanho fixo, leva alguns minutos.

Localize a ISO do CentOS 7 e inicie a VM

Idioma

Informe o disco de instalação

Configure o nome do host e ative a interface de rede (Defina um IP Fixo), clique em configurar.

-Lembrando que o IP deverá estar na mesma faixa/sub rede do seu computador/ambiente, desta forma será possível acessar na rede através de outros computadores.

Nesta etapa você pode habilita a instalação do ambiente gráfico no Linux, clicando em seleção de software e ativando a opção GNOME.

Clique em Iniciar Instalação

Defina a senha para o usuário ROOT e crie um usuário, como Exemplo (admin)

Aguarde o término da instalação e reinicie o host.

Aceite os termos de uso. (modo Gráfico)

Após aceitar e reiniciar o host está pronto para o uso.

Caso não tenha muita experiência com Linux, e não tenha instalado a ambiente gráfico(GNOME),  recomendo que instale, é bem simples.

Logue no host com o usuário: root e a senha que você definiu e digite os comandos abaixo:

1
yum grouplist


1
sudo yum groups install "GNOME Desktop"


1
systemctl set-default graphical.target


1
systemctl start graphical.target

Agora vamos atualizar o sistema. Abra o terminal ou logue com aplicativo Putty e digite:

1
yum update -y

Aqui termina os passos necessários para a configuração do ambiente. Abaixo são itens opcionais.

Instalação de recursos opcionais:

yum install -y net-tools
yum install -y httpd
yum install -y perl perl5
yum install -y zip unzip
yum install -y sshd
yum install -y wget

Leia o próximo post para fazer a instalação do Grafana:  http://blog.fabianobento.com.br/2018/05/instalando-grafana-linux-centos-redhat-linux-fedora-opensuse/

Instalando Grafana no Linux CentOS/RedHat/Fedora/OpenSuse

Parte 3 – Primeiros passos após a instalação

http://blog.fabianobento.com.br/2018/05/primeiros-passos-apos-instalacao-grafana/

Instalação do Banco de Dados MySQL

yum install -y wget

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm

yum -y update

sudo yum install mysql-server

A senha temporária fica no arquivo mysqld.log para obter execute o comando:

grep “temporary password” /var/log/mysqld.log

Caso retorne que não exista, execute o comando abaixo e quando pedir a senha deixe em branco e pressione a tecla ENTER.

sudo mysql_secure_installation

sudo systemctl start mysqld

sudo systemctl status mysqld

Para resetar a senta root

systemctl stop mysqld

killall mysqld

mysqld_safe –skip-grant-tables –skip-networking &

mysql -u root

update mysql.user set password=PASSWORD(‘fabianobento’) where user=’root’;

exit

systemctl stop mysqld

systemctl start mysqld

mysql -u root -p

Comando para liberar o acesso remoto/externo ao banco MySQL(fora do host 127.0.0.1)

mysql -uroot -p[senha]

GRANT ALL ON *.* TO ‘root’@’%’ IDENTIFIED BY ‘senha’ WITH GRANT OPTION;

FLUSH PRIVILEGES;

Comando Parar liberar a porta para acesso ao banco MySQL

firewall-cmd –permanent –add-port=3106/tcp

firewall-cmd –reload

Para Instalar o phpMyAdmin no CentOS 7

yum -y install epel-release

yum -y update

yum -y install phpMyAdmin.noarch

Edite o arquivo /etc/httpd/conf.d/phpMyAdmin.conf

Require ip
Allow from

Require ip 127.0.0.1 192.168.0.0/24

Reinicie o Apache
systemctl restart httpd

http://ip-host/phpMyAdmin

Para instalar o Zabbix leia as instruções no site oficial:
https://www.zabbix.com/download?zabbix=3.4&os_distribution=centos&os_version=7&db=MySQL

Desativo o selinux: /etc/sysconfig/selinux

SELINUX=disable

PHP – Edite o arquivo /etc/php.ini

date.timezone = America/Sao_Paulo

1
2
3
rpm -i http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
 
yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent

mysql -uroot -p
password
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@% identified by ‘fabianobento’;
mysql> quit;

1
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
1
2
systemctl restart zabbix-server zabbix-agent httpd
systemctl enable zabbix-server zabbix-agent httpd

http://server_ip_or_name/zabbix

Login e Senha: Admin / zabbix

OBS: Caso tenha problemas para iniciar o serviço do zabbiz verifique o arquivo de LOG /var/log/zabbix

Se for algum erro de conexão com o banco edite o arquivo /etc/zabbix/zabbix_server.conf, e acrescente as linhas abaixo

DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=senha-banco

Para liberar a porta para acesso

firewall-cmd –permanent –add-port=80/tcp

firewall-cmd –reload

Para desativar o firewall

systemctl stop firewalld
systemctl disable firewalld

POST Atualizado 09/2020


Vou fazer um artigo no qual recebo várias perguntas: Como gerar arquivos XML no padrão TISS da ANS.  Vou demonstrar usando PHP e API DOM nesta primeira parte e futuramente complementarei com dados a partir de banco de dados MySQL.

O padrão TISS é determinado pela ANS, você poderá consultar outras informações do padrão TISS no site da Agência Nacional de Saúde.

Para seguir, é necessário ter noções básicas da linguagem PHP.

Obs.: Não vou ensinar como desenvolver um sistema com a finalidade de faturamento, apenas o passo a passo da geração do XML no padrão TISS usando o PHP e a biblioteca DOM.

Basicamente o faturamento dos atendimentos/contas, consiste no atendimento do beneficiário pelo prestador(clínica, hospital, laboratório, banco de sangue, clínicas de imagem, entre outros), que é credenciado as operadoras de saúde (Bradesco Saúde, Unimed, Postal Saúde, Geap, Cassi, Capesp, Saúde Itaú, Sul América,…).

O envio do faturamento é feito por lotes(vários atendimentos no mesmo lote, geralmente até 100 atendimentos no mesmo lote) e pode ser via portal da Operadora por digitação das contas (quando a mesma oferece o recurso) ou a partir do envio de arquivos XML. E cada operadora permite e aceita o envio até uma data limite de cada mês(competência), por exemplo; a operadora XYZ aceita que o envio seja feito até o dia 20, e fará o pagamento até o dia 19 do mês subsequente(30 dias após o envio). Desta forma os prestadores precisam ficar atentos ao cumprimento de envio nas datas certas para receber no prazo, caso contrário o pagamento pela operadora é feito na próxima competência.

A geração do XML consiste em dados dos pilares: Operadora de Saúde <-> Prestador de Serviços <-> Beneficiários/Segurados,  ou seja, precisamos das informações de credenciamento do prestador de saúde,  dados do prestador e do segurado. Abaixo uma exemplificação dos dados;

Dados da operadora:
Registro ANS: 1111
Versão TISS: 03.03.03

Dados do Prestador:
Código de Credenciamento: 12345
CNPJ: 00.000.000/0000-0 (Fictício)

Dados de faturamento:
Número da remessa/fatura/Lote: 123

Dados do atendimento:
Data e Hora: 03/04/2018 22:15:00
Nome: Fulano de Tal
Carteira: 4444444444444444
Validade da carteira: 31/12/2030
Recém nascido: Não
Tipo de Atendimento: Ambulatorial
Caráter do atendimento: Eletivo
Guia/Senha: 1111/2222

Médico: Dr. Fabiano
CRM: 0000
CBOS:

Código da tabela: 22
Procedimento TUSS: 10101012
Descrição do Procedimento: Consulta em consultório
Valor unitário: 500,00
Valor Total:  500,00

<?php
#Definindo as variáveis

#Dados Operadora:
$_XML['versao_tiss']='030303';
$_XML['registro_ans'] = '1111';

#Dados Prestador:
$_XML['codigo_credenciamento'] = '12345';
$_XML['cnpj'] = '0000000000000';
$_XML['prestador'] = 'Hospital ABCD';

#Dados do atendimento e beneficiário
$_XML['data_hora'] = '03/04/2018 22:15:00';
$_XML['rn'] = 'N'; #Não
$_XML['tipo_atd'] = 'Ambulatorial';
$_XML['carater'] = 'E'; #Eletivo
$_XML['guia'] = '1111';
$_XML['senha'] = '2222';
$_XML['medico'] = 'Dr. Fabiano';
$_XML['crm'] = '0000';
$_XML['cbos'] = '';
#Dados do beneficiário
$_XML['nome'] = 'Fulano de Tal';
$_XML['dt_nascimento'] = '01/01/1980';
$_XML['carteira']  = '4444444444444444';
$_XML['validade'] = '31/12/2030';

#Dados da Fatura / Lote
$_XML['fatura_remessa'] = '123';

#Dados do procedimento realizado
$_XML['tabela'] = '22';
$_XML['procedimento_tuss'] = '10101012';
$_XML['descricao_proced'] = 'Consulta em consultório';
$_XML['valor_unitario'] = '500,00';
$_XML['qtde'] = '1';
$_XML['valor_total'] = '500,00';

$_XML['tipoTransacao'] = 'ENVIO_LOTE_GUIAS';
$_XML['sequencialTransacao'] = '6658';
$_XML['dataRegistroTransacao'] = '2018-01-18';
$_XML['horaRegistroTransacao'] = '10:00:00';

 # Utilize a variável $_XML['hash_dados'] para concatenar os dados e calcular o HASH antes do terceiro bloco
$_XML['hash_dados'] = '';

#A variável $_XML['hash'] está nula pois deve ser calculada com os dados dos elementos(tags) do XML
$_XML['hash'] = 'calculo do HASH';

//$_XML[''] = ''; // para criar novas variáveis apenas siga o padrão

Após a declaração das variáveis, vamos iniciar a geração da estrutura no nosso arquivo.

#versao XML e codificação
$xml = new DOMDocument("1.0", "ISO-8859-1");
//também poderia ser UTF-8
 
#remove os espacos em branco
$xml->preserveWhiteSpace = false;

#Realizar a quebra dos blocos do XML por linha
$xml->formatOutput = true;

		//Criação dos elementos do Namespace ans:mensagemTISS
		$xml->createAttributeNS( 'http://www.w3.org/2000/09/xmldsig#', 'ds:attr' );
		$xml->createAttributeNS( 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:attr' );
		$xml->createAttributeNS( 'http://www.ans.gov.br/padroes/tiss/schemas http://www.ans.gov.br/padroes/tiss/schemas/tissV3_03_01.xsd', 'schemaLocation:attr' );
		$xml->createAttributeNS( 'http://www.ans.gov.br/padroes/tiss/schemas', 'ans:attr' );


// Nó / Bloco Principal
// ans:mensagemTISS
$mensagemTISS = $xml->createElement("ans:mensagemTISS");
$xml->appendChild($mensagemTISS);

	/* primeiro bloco */
	// ans:mensagemTISS / ans:cabecalho
	$cabecalho = $xml->createElement("ans:cabecalho");
	$mensagemTISS->appendChild($cabecalho);


		// ans:mensagemTISS / ans:cabecalho / ans:identificacaoTransacao
		$identificacaoTransacao = $xml->createElement("ans:identificacaoTransacao");
		$cabecalho->appendChild($identificacaoTransacao);

				# ans:tipoTransacao
				$tipoTransacao = $xml->createElement("ans:tipoTransacao", $_XML['tipoTransacao']);
				$identificacaoTransacao->appendChild($tipoTransacao);

				#sequencialTransacao
				$sequencialTransacao = $xml->createElement("ans:sequencialTransacao", $_XML['sequencialTransacao']);
				$identificacaoTransacao->appendChild($sequencialTransacao);

				#dataRegistroTransacao
				$dataRegistroTransacao = $xml->createElement("ans:dataRegistroTransacao", $_XML['dataRegistroTransacao']);
				$identificacaoTransacao->appendChild($dataRegistroTransacao);

				#horaRegistroTransacao
				$horaRegistroTransacao = $xml->createElement("ans:horaRegistroTransacao", $_XML['horaRegistroTransacao']);
				$identificacaoTransacao->appendChild($horaRegistroTransacao);


		// ans:mensagemTISS / ans:cabecalho / ans:origem
		$origem = $xml->createElement("ans:origem");
		$cabecalho->appendChild($origem);

				// ans:mensagemTISS / ans:cabecalho / ans:origem / identificacaoPrestador
				$identificacaoPrestador = $xml->createElement("ans:identificacaoPrestador", $_XML['cnpj']);
				$origem->appendChild($identificacaoPrestador);


		// ans:mensagemTISS / ans:cabecalho / ans:destino
		$destino = $xml->createElement("ans:destino");
		$cabecalho->appendChild($destino);

				// ans:mensagemTISS / ans:cabecalho / ans:registroANS
				$registroANS = $xml->createElement("ans:registroANS", $_XML['registro_ans']);
				$destino->appendChild($registroANS);

		// ans:mensagemTISS / ans:cabecalho / ans:Padrao
		$Padrao = $xml->createElement("ans:Padrao", $_XML['padrao_tiss']);
		$cabecalho->appendChild($Padrao);


	/* segundo bloco */
	// ans:mensagemTISS / ans:prestadorParaOperadora
	$prestadorParaOperadora = $xml->createElement("ans:prestadorParaOperadora");
	$mensagemTISS->appendChild($prestadorParaOperadora);

		// ans:mensagemTISS / ans:prestadorParaOperadora / loteGuias
		$loteGuias = $xml->createElement("ans:loteGuias");
		$prestadorParaOperadora->appendChild($loteGuias);

			// ans:mensagemTISS / ans:prestadorParaOperadora / loteGuias / numeroLote
			$numeroLote = $xml->createElement("ans:numeroLote", $_XML['lote_remessa']);
			$loteGuias->appendChild($numeroLote);

 			// ans:mensagemTISS / ans:prestadorParaOperadora / loteGuias / guiasTISS
			$guiasTISS = $xml->createElement("ans:guiasTISS");
			$loteGuias->appendChild($guiasTISS);

// ans:mensagemTISS / ans:prestadorParaOperadora / loteGuias / guiaConsulta
$guiaConsulta = $xml->createElement("ans:guiaConsulta");
$loteGuias->appendChild($guiaConsulta);

// ans:mensagemTISS / ans:prestadorParaOperadora / loteGuias / cabecalhoConsulta
$cabecalhoConsulta = $xml->createElement("ans:cabecalhoConsulta");
$guiaConsulta->appendChild($cabecalhoConsulta);

$registroANS = $xml->createElement("ans:registroANS", '132'); //registroANS
$cabecalhoConsulta->appendChild($registroANS);

$registroANS = $xml->createElement("ans:numeroGuiaPrestador", '1111'); //numeroGuiaPrestador
$cabecalhoConsulta->appendChild($registroANS);

$numeroGuiaOperadora = $xml->createElement("ans:numeroGuiaOperadora", '2222'); //numeroGuiaOperadora
$guiaConsulta->appendChild($numeroGuiaOperadora);

$dadosBeneficiario = $xml->createElement("ans:dadosBeneficiario"); //dadosBeneficiario
$guiaConsulta->appendChild($dadosBeneficiario);

$numeroCarteira = $xml->createElement("ans:numeroCarteira", '1122334455'); //numeroCarteira
$dadosBeneficiario->appendChild($numeroCarteira);

$atendimentoRN = $xml->createElement("ans:atendimentoRN", 'N'); //atendimentoRN
$dadosBeneficiario->appendChild($atendimentoRN);

$nomeBeneficiario = $xml->createElement("ans:nomeBeneficiario", 'Fulano de Tal'); //nomeBeneficiario
$dadosBeneficiario->appendChild($nomeBeneficiario);

//contratadoExecutante
$contratadoExecutante = $xml->createElement("ans:contratadoExecutante");
$guiaConsulta->appendChild($contratadoExecutante);


$codigoPrestadorNaOperadora = $xml->createElement("ans:codigoPrestadorNaOperadora", '001'); //codigoPrestadorNaOperadora
$contratadoExecutante->appendChild($codigoPrestadorNaOperadora);

$nomeContratado = $xml->createElement("ans:nomeContratado", 'Hospital Teste'); //nomeContratado
$contratadoExecutante->appendChild($nomeContratado);

$CNES = $xml->createElement("ans:CNES", '9999'); //CNES
$contratadoExecutante->appendChild($CNES);

//profissionalExecutante
$profissionalExecutante = $xml->createElement("ans:profissionalExecutante"); //profissionalExecutante
$guiaConsulta->appendChild($profissionalExecutante);

$nomeProfissional = $xml->createElement("ans:nomeProfissional", 'Médico Teste'); //nomeProfissional
$profissionalExecutante->appendChild($nomeProfissional);

$conselhoProfissional = $xml->createElement("ans:conselhoProfissional", '02'); //conselhoProfissional
$profissionalExecutante->appendChild($conselhoProfissional);

$numeroConselhoProfissional = $xml->createElement("ans:numeroConselhoProfissional", '1234'); //numeroConselhoProfissional
$profissionalExecutante->appendChild($numeroConselhoProfissional);

$UF = $xml->createElement("ans:UF", 'SP'); //UF
$profissionalExecutante->appendChild($UF);

$CBOS = $xml->createElement("ans:CBOS", '201115'); //CBOS
$profissionalExecutante->appendChild($CBOS);

//dadosAtendimento
$dadosAtendimento = $xml->createElement("ans:dadosAtendimento"); //dadosAtendimento
$guiaConsulta->appendChild($dadosAtendimento);

$tipoAtendimento = $xml->createElement("ans:tipoAtendimento", '05'); //tipoAtendimento
$dadosAtendimento->appendChild($tipoAtendimento);

$indicacaoAcidente = $xml->createElement("ans:indicacaoAcidente", '9'); //indicacaoAcidente
$dadosAtendimento->appendChild($indicacaoAcidente);


// Calculo o Hash - Você poderia gerar os dados, usar um (replace do PHP) para substituir as tags, e pegar apenas os dados
$_XML['hash_dados'] = ''
$_XML['hash'] = md5($_XML['hash_dados']);

	/* terceiro bloco */
	// ans:mensagemTISS / ans:epilogo
	$epilogo = $xml->createElement("ans:epilogo");
	$mensagemTISS->appendChild($epilogo);

		// ans:mensagemTISS / ans:epilogo / ans:hash
		$hash = $xml->createElement("ans:hash", $_XML['hash']);
		$epilogo->appendChild($hash);

# Comando para salvar/gerar o arquivo XML TISS
# Geralmente o nome do arquivo é o HASH que foi calculado ou número do lote, pois são informações únicas.
# você pode usar as variáveis: $_XML['fatura_remessa'] . $_XML['hash']

$xml->save("xml_tiss.xml");


# Imprime / Gera o xml em tela
echo $xml->saveXML();
?>

Com o comando acima você terá o seguinte retorno: xml_tiss.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<ans:mensagemTISS xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:schemaLocation="http://www.ans.gov.br/padroes/tiss/schemas http://www.ans.gov.br/padroes/tiss/schemas/tissV3_03_01.xsd"
xmlns:ans="http://www.ans.gov.br/padroes/tiss/schemas">
 <ans:cabecalho>
 <ans:identificacaoTransacao>
 <ans:tipoTransacao>ENVIO_LOTE_GUIAS</ans:tipoTransacao>
 <ans:sequencialTransacao>6658</ans:sequencialTransacao>
 <ans:dataRegistroTransacao>2018-01-18</ans:dataRegistroTransacao>
 <ans:horaRegistroTransacao>10:00:00</ans:horaRegistroTransacao>
 </ans:identificacaoTransacao>
 <ans:origem>
 <ans:identificacaoPrestador>0000000000000</ans:identificacaoPrestador>
 </ans:origem>
 <ans:destino>
 <ans:registroANS>111111</ans:registroANS>
 </ans:destino>
 <ans:Padrao>03.03.03</ans:Padrao>
 </ans:cabecalho>
 <ans:prestadorParaOperadora>
 <ans:loteGuias>
 <ans:numeroLote>123</ans:numeroLote>
 <ans:guiasTISS/>
 </ans:loteGuias>
 </ans:prestadorParaOperadora>
 <ans:epilogo>
 <ans:hash>calculo do HASH</ans:hash>
 </ans:epilogo>
</ans:mensagemTISS>