Zobrazují se příspěvky se štítkemsoftware. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemsoftware. Zobrazit všechny příspěvky

2021-01-10

Azure Classic Select-AzureSubscription Error

No default subscription has been designated. Use Select-AzureSubscription -Default <subscriptionName> to set the default subscription.

Select-AzureSubscription : The subscription id doesn't exist.
Select-AzureSubscription : The subscription name doesn't exist.
Select-AzureSubscription : Parameter set cannot be resolved using the specified named parameters.

Add-AzureAccount : No subscriptions are associated with the logged in account in Azure Service Management (RDFE). This means that the logged in user is not an administrator or co-administrator for any account

Add-AzureAccount : AADSTS50074: Strong Authentication is required.

I had the following problems with Setting the default subscription because of two reasons. For this you need to have set co-administrator rights

Solution: Add classic administrator role inside AAD for user you are using to log in. Azure Portal > subscriptions > subscription - Access control (IAM) > Classic administrators > Add > Add co-administrator and try again!

Non responding Azure VM

It might happen to your virtual machine in Azure Cloud too. It gets stuck without responding to enabled services like SSH, HTTP even pings; in Microsoft words "VM was not responding to any means of communication".

Symptoms: There is no answer from the public IP range as same as from a private network from a machine on the same VNET and subnet. A tricky part is a machine in the portal looks up and running, stopping, and restarting. 

I opened the M$ support case because it was another occasion of the same behavior and I wanted to know the answer. We went through a classic scenario: Restart, deallocation, and redeploy via the portal. The extra task was the restart VM's from the serial console but the serial console did not come up even after a reboot.
Short answer: one of the disks was incorrectly mounted. One of the logs was containing crucial information as "Reached target Emergency Mode" followed by
Failed to mount /var/lib/docker. See 'systemctl status var-lib-docker.mount' for details. Dependency failed for Local File Systems.
That failed mount is preventing VM to boot, it needs to be fixed as described below. We had to create a rescue VM for which we used the OS disk of the impacted VM to create a new VM and it worked.

Solution: add to mount point /etc/fstab an item -nofail. Save and exit. Detach drive and do OS swap for the machine. The reboot should be OK and the machine should be online.

How to rescue the VM
  • Take the snapshot of OS disk - a full snapshot 
    • In disks – Created new disk using source path as a snapshot.
    • Verify the size of the disk and the type of disk used and used the same size and type to create a new disk.
  • Attach the disk to an existing Redhat VM, swap the disk, and mount it.
These few hints might help you to get rid of the troubles.

2021-01-01

Doporučená instalace softwaru a používání služeb

Affiliate sekce, aneb za doporučení výhody pro mě i pro vás.

Počítačové:

Fintech

Služby:

Cestování

2020-08-30

Microsoft kontakty v Android telefonu

V telefonu s operačním systémem Android není nutné používat synchronizaci s účtem Google (i když ten je nezbytné mít také pro správné fungování aktualizací). Nicméně pro uchování kontaktů či položek kalendář je možné použít například služby Microsoft přes některý z jeho účtů (školní, pracovní) a zejména osobní účet. 

Když provedete nastavení intuitivně přes Nastavení => Účty => Přidat účet => Exchange narazíte na hlášku "Pokud chtete použít tento účet vraťte se na přechozí stránku a zvolte 'Outlook, Hotmail a Live', která tam ovšem není.

Takže jak na to? Podobně Nastavení => Účty => Přidat účet => Exchange, kde dole je tlačítko ručně. Zde je nastavení adresy serveru, kam uvedete eas.outlook.com a po kliknutí na další se účet přidá. 





V aplikaci kontakty, pak přes nastavení zvolte a) zobrazení kontaktů ze správného seznamu b) ukládání nových kontaktů do tohoto účtu. U kalendáře mi to fungovalo správně samo.

2020-04-29

az cli replace VMSS NSG

Let's show you some Azure Cloud settings change. It took me a while to make it work some you might appreciate it as a ready-made command(s).

If you don't like the existing network security group object linked with your virtual machine scale set, you can change it by using set command replacing value there with new id. There is no separate az vmss update command for it.

used variables:
  • $subscriptionId
  • $resourceGroup
  • $vmssName
  • $nsgNameNew
az cli command:
  • az vmss update --name $vmssName -g $resourceGroup --set virtualMachineProfile.networkProfile.networkInterfaceConfigurations[0].networkSecurityGroup.id=/subscriptions/$subscriptionId/resourceGroups/$resourceGroup/providers/Microsoft.Network/networkSecurityGroups/$nsgNameNew
You need to refresh all nodes in VMSS before you can use that new NSG rules or delete old NSG object. You can do it by command
  • az vmss update-instances --instance-ids '*' --name $vmssName --resource-group $resourceGroup --output none --no-wait
or by portal =>  Virtual machine scale set => Scaling => Manual scale => Instance count => 0 and later increasing again. Deallocating VMSS is not enough.

I hope it helped.

2019-11-11

Jednoduchý proxy server s IPTABLES

Řešil jsem nutnost vytvoření super jednoduchého - jednoúčelového - proxy serveru, kvůli chybějícímu otevření firewallu a jak jinak než urgentnímu požadavku na zprovoznění mimo pracovní dobu.

Použil se na to virtuální stroj s Ubuntu a minimální velikostí. Jako proxy sloužil nástroj iptables, ale dalo by to udělat i s nginx proxy nebo apache2 proxy.

Prvnotní kontrolu prázdných iptables lze provést příkazem 
iptables-save
kde by nemělo být žádné pravidlo

Nejjednodušší je vytvoření skriptu s pravidlem transparentní proxy příkazem
nano natscript.sh

kam přijde text
#!/bin/sh
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination  10.10.10.10:8080
iptables -t nat -A POSTROUTING -p tcp -d 10.10.10.10 --dport 8080 -j SNAT --to-source 11.11.11.11


přičemž 10.10.10.10 je cílová adresa, kam se vlastně chceme připojit a 11.11.11.11 je adresa hostitelského serveru, aby se provoz dostal zpátky k odesilateli požadavku. Překlad portu neprobíhá a zůstává na 8080.

Pojďme na to a spustit skript, který založí vytvořená pravidla
sudo chmod +x natscript.sh
sudo ./natscript.sh

Po vykonání tohoto příkazu už bude vidět pravidlo v kontrolním logu s příkazem iptables-save

# Generated by iptables-save v1.6.1
*nat
:PREROUTING ACCEPT
:INPUT ACCEPT
:OUTPUT ACCEPT
:POSTROUTING ACCEPT
-A PREROUTING -p tcp -m tcp --dport 8080 -j DNAT --to-destination 10.10.10.10:8080
-A POSTROUTING -d 10.10.10.10/32 -p tcp -m tcp --dport 8080 -j SNAT --to-source 11.11.11.11
COMMIT
# Generated by iptables-save v1.6.1


Nyní je potřeba uložit tuto konfiguraci permanentně
sudo su root
sudo apt-get install iptables-persistent


případně při změně
recall dpkg-reconfigure iptables-persistent


Nicméně tato konfigurace stále nezůstane zachována při restartu serveru, je potřeba v souboru 
sudo nano /etc/sysctl.conf
odkomentovat řádek 
net.ipv4.ip_forward=1
a uložit

Namísto směřování požadavků na adresu 10.10.10.10:8080/path/file provádíte nyní dotazování adresy 11.11.11.11:8080/path/file se stejným výsledkem.

Pokud si přejete debugovat pravidla při překladu, doporučuji příkaz  tcpdump
sudo tcpdump dst port 8080 or src port 8080

To by bylo vytvoření jednoduchého proxy serveru obcházející chybějící ACL pravidlo na firewallu.

2019-08-19

Klonování Resource Group v Azure

Zadání bylo jednoduché, naklonujte resource group (něco jako složka ve které jsou součástky patřící k sobě v rámci nějakého projektu). První zádrhel je, že na to nemá webový Azure Resource Manager žádné klikátko - taková funkce v rozhraní chybí. Co s tím tedy?

Nejprve jsem našel skript Clone-AzureRMresourceGroup.ps1, který ovšem vyžaduje vypnutí původní infrastruktury, což je i v předprodukčním prostředí poněkud nechtěná vlastnost a nápad opustil.

Dalším pokusem bylo znovu zkopírování RG pomocí ARM template, kterou umí Azure RM ve webovém rozhraní snadno vyexportovat. Dokonce mnoho ostatních uživatelů jde touto cestou. Zádrhel je ve velikosti RG, kterou kopírujete. Jeden virtuální server s příslušenství asi jde, ale jakmile byl zahrnut Availability Set či Load Balancer, vytváří se ve schématech kruhové závislosti přes položku dependsOn a vůbec se konfigurační soubory nedají zrecyklovat pro nový i když identický deployment. 

Co se děje v template.json a parameters.json? Čekali byste, že všechno co se nastavuje bude v parameterech a v template jenom schéma, ale ono ne! Některé položky jsou po exportování v template natvrdo zapsané, typicky třeba lokalita, takže změnou parametrů se dostanou do schématu ještě větší zmatky. Další unikátní zdroje jako IP adresy či DNS názvy najdete v template.json také, což je samozřejmě špatně, pokud nevytváříte identickou RG znovu po smazání té předchozí, ale chcete klonovat.


Taktéž se mi celý template v jednom kuse nechtěl ani po úpravách nasadit do Azure, protože závislosti jako VM potřebuje IP, kterou chce NIC, ale NIC bez VM nejde apod. Řešením mohlo být vyexportovat jednotlivé šablony a hodnoty samostatně tak, jak byly vytvářeny chronologicky a to přes boční panel Deployments v RG.  Získal jsem tak 25x2 souborů, které bylo nutné ručně projít a zpracovat uvedené hodnoty, které měly navíc všelijaké nehomogenní identifikátory. Šlo by to u pár stupňové implementace, já se ztratil u 4. template z 25.

Takže zpátky k rýsovacími prknu. Dostal jsem povolení udělat odstávku běžících serverů a znovu použil výše zmíněný skript Jeffa Bowa, který asi za 20 minut vytvořil klon běžící RB bez nutnosti do toho nikterak více zasahovat a bez možnosti třeba přejmenovat zdroje v RG obsažené.

Pozor, po dokončení činnosti skriptu je potřeba zkontrolovat, zda-li se zkopírovalo všechno. Application gateway nebo SQL server se mi při použití skriptu nenaklonovaly. Taktéž chyběl diagnostický storage account, ale to zjevně nevadí.

Závěr? Buď si připravte velmi detailně ARM šablonu, zejména v případě, že budete RG vytvářet vícekrát nebo použijte script, ale počítejte s výpadkem.

Poznámka pod čarou: je těžké v česky psaném příspěvku hledat slova, tak aby nebyl text plný anglicismů, ale zároveň aby odborníci věděli o čem je řeč. Deploymnout je krásné, ale v obou jazycích špatně. Nadruhou stranu nad přepínáním a směrováním je třeba se pokaždé zamyslet, co je switching a co routing. Ale to jen tak na okraj...

2019-06-12

Zabbix agent installation

There are many good tutorials how to install Zabbix-agent to Ubuntu machine and how to interconnect it with Zabbix-server. I am adding some notes since I had troubles.

If you do
sudo apt-get install zabbix-agent
You can get error
zabbix-agent : Depends: libcurl4 (>= 7.16.2) but it is not installable
How to fix it?
sudo nano /etc/apt/sources.list
 and append to end following paragraph
###### Ubuntu Main Repos
deb http://us.archive.ubuntu.com/ubuntu/ bionic main universe 
deb-src http://us.archive.ubuntu.com/ubuntu/ bionic main universe 

###### Ubuntu Update Repos
deb http://us.archive.ubuntu.com/ubuntu/ bionic-security main universe 
deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates main universe 
deb-src http://us.archive.ubuntu.com/ubuntu/ bionic-security main universe 
deb-src http://us.archive.ubuntu.com/ubuntu/ bionic-updates main universe 
After that just 
sudo apt-get update
It should be ready for install now, so do again
sudo apt-get install zabbix-agent
When it's done, you can configure zabbix agent by adding server address and match hostname name in WebUI and your agent machine. Don't forget to use encryption!
sudo nano /etc/zabbix/zabbix_agentd.conf
You need to restart the server after configuration
sudo systemctl restart zabbix-agent
If troubles continue check log file
cat /var/log/zabbix-agent/zabbix_agentd.log
Following error I received mostly when configuration was wrong. It helps to comment new modification and try to start the service again.
Job for zabbix-agent.service failed because the control process exited with error code. See "systemctl status zabbix-agent.service" and "journalctl -xe" for details.
invoke-rc.d: initscript zabbix-agent, action "start" failed.
OK, these are my notes if I need to install it and configure ever again.

If it doesn't help, just install older version
sudo apt-get install zabbix-agent=1:3.0.12+dfsg-1

2019-03-08

Používání SonarQube pro DevOps

Zprovozňoval jsem analytický nástroj SonarQube pro použití v Jenkins pipeline, nicméně jako standalone instanci tedy bez pluginu. K použití GetCodeflow s jehož autorem se znám jsem nedosal povolení od správce repozitáře, je potřeba tedy udělat analytiku lokálně. Kdybych náhodou instaloval nový server, píšu si následující poznámky.


Stažený instalátor SonarQube není instalátor. Složku je potřeba rozumně pojmenovat a někam permanentně umístit jako třeba C:\Program Files\sonarqube

Nejprve je nutné nainstalovat 64 bitovou Javu (JRE) a složku propojit s konfiguračním souborem C:\Program Files\sonarqube\conf\wrapper.conf, kam je třeba vložit řádek 
wrapper.java.command=C:\Program Files\Java\jre1.8.0_202\bin\java
Dále můžete vyzkoušet spuštění StartSonar.bat ze složky bin/windows-x86-64 přes command line (uvidíte případné chyby), pokud se načítá aplikace http://localhost:9000 (login admin/admin) je vše v pořádku. Kdyby byl větší problém, otevřete C:\Program Files\sonarqube\logs\sonar.log a koukněte na konec souboru co bylo příčinou pádu.
wrapper  | Waiting to start...
wrapper  | The SonarQube service was launched, but failed to start.
Před plným používáním je třeba doladit několik detailů. Zejména instalace samospouštěcí služby. Otevřete příkazový řádek v admin režimu, nalistujte C:\Program Files\sonarqube\bin\windows-x86-64\ a spusťte InstallNTService.bat, poté by se měla v systémových službách (services.msc) objevit služba SonarQube s automatickým startem.

V průběhu prvního testovacího buildu jsem se vinou obrovského solution (3 miliony řádku kódu ve 4,5 GB zdrojových kódů) potýkal s nedostatkem paměti, kterou bylo potřeba rozšířit. 32 bitová aplikace zvládá alokovat maximálně 2 GB paměti, proto je potřeba používat 64 bitovou. 
INFO: EXECUTION FAILURE
INFO: Final Memory: 15M/247M
ERROR: Error during SonarQube Scanner execution
ERROR: Java heap space
ERROR: The SonarQube Scanner did not complete successfully. Post-processing failed. Exit code: 1 
Nastavení se provádí v C:\Program Files\sonarqube\conf\sonar.properities. Hodnota sonar.web.javaOpts=-Xmx<číslo>m uvádí maximální možnou paměť a -Xms<číslo>m hodnotu při startu, rozpětí je tedy žádoucí velké.

Funkční nastavení: wrapper.conf
wrapper.java.additional.1=-Xms2048m
wrapper.java.additional.1=-Xmx%WRAPPER_SYSMEM_80.0%
Funkční nastavení: sonar.properties
sonar.web.javaOpts=-Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError
sonar.ce.javaOpts=-Xmx8192m -Xms1024m -XX:+HeapDumpOnOutOfMemoryError
Jak vystavit SonarQube do sítě? Na mém serveru běží také IIS, takže je potřeba rezervovat adresu v IIS a nastavit redirect podle návodu. Pro samotné přepnutí aplikace pak stačilo nastavit DNS záznamy a uvnitř v aplikaci položku sonar.core.serverBaseURL => Administration/Server base URL. Navíc je potřeba zvýšit limit pro uploadované soubory, jinak končí analýza chybou "ERROR: Failed to upload report - HTTP code 404: "

Jak mít permamentní výsledky v databázi? Je potřeba C:\Program Files\sonarqube\conf\sonar.properities propojit s DB serverem a to následujícím způsobem. V DB (MSSQL) vytvořit databázi (v options zvolit Collation = Latin1_General_CS_AS), vytvořit uživatele, přiřadit mu db_owner právo a zrušit expiraci jeho hesla. (ideální je zkusit se připojit přes Microsoft SQL Server Management Studio). A vlastní konfigurace tedy
sonar.jdbc.username=sonarqube
sonar.jdbc.password=password

sonar.jdbc.url=jdbc:sqlserver://<IPorDNS>:1433;databaseName=sonarqube
A to je vše, restartovat službu SonarQube a nechat nástroj znovu načíst. Případné chyby jsou ve web.log.

Jak propojit přihlášení do rozhraní SonarQube přes Active Directory? Předně je třeba vytvořit uživatele (?) ve zmíněné doméně, který bude sloužit pro přístup samotného SonarQube. Konfigurace v sonar.properities je pak následující
sonar.security.realm=LDAP
sonar.security.savePassword=true
#sonar.security.localUsers=admin
ldap.url=ldap://DOMAIN.local:389
ldap.bindDn=sonarqube@DOMAIN.local
ldap.bindPassword=PASSinPLAINTEXT
#ldap.bindPassword={aes}passhashed
ldap.user.baseDn=cn=users,dc=DOMAIN,dc=local
ldap.user.request=(&(objectClass=user)(sAMAccountName={login}))
ldap.user.realNameAttribute=cn
ldap.user.emailAttribute=mail
ldap.group.baseDn=DC=inpulsetest,DC=local
ldap.group.request=(&(objectClass=group)(memberUid={uid}))
Není potřeba dalšího pluginu a přihlašování pak probíhá jen zadáním username bez domény. Pokud chcete mít z uživatelů administrátory, jde to snadno přes položku Administration/Security/Global permission a zaškrtnout příslušná oprávnění v sonar-users skupině.
 
Každopádně po této konfiguraci funguje nástroj v enterprise režimu a podporuje DevOps proces.

2018-11-23

Nastavení spouštění Jenkins úlohy na webhook z Gitu

Hrál jsem si s nastavováním automatického spouštění úlohy v Jenkins po commitu do GitHubu. Čistě teoreticky jde o triviální věc, kterou popisuje spousta videí, nicméně v praxi jsem narazil na několik problémů, které si tady odložím, abych to příště nemusel řešit. Třeba to pomůže i někomu dalšímu.

Na začátek hezké video, které popisuje úlohu bez nastavení tajného hesla:

Nejprve je třeba připravit Jenkins, předpokládám, že už vám joby a integrace s GitHubem funguje, jen pro informaci je třeba mít nainstalovaný plugin GitHubu.

Dále musí být dostupná adresa JENKINS_URL/github-webhook/ z veřejného internetu (nebo filtru podle GitHub IP adres), případně přenastavena na jinou v JENKINS_URL/configure sekce GitHub/Advanced (to druhé advanced) a políčko "Override Hook URL/Specify another hook URL for GitHub configuration" 

Manage webhooks zůstane nezaškrtnuto (sekce A.3) pro manuální instalaci webhooku na GitHubu.

Protože nechceme, aby každý, kdo se dostane k odkazu webhooku, spouštěl úlohu, je třeba nastavit heslo neboli "shared secret", respektive jej vytvořit v JENKINS_URL/credentials/add/secret text/system/ a pak nalinkovat "Shared secret". Nicméně je taky fajn to nejdříve vyzkoušet, že to funguje a secret přidat později (nezapomněout na to!).

Poté je třeba registrovat job, který se na webhook spustí. Zpátky na seznam úloh, rozklinout ho a možnost configure, pak checkbox GitHub project a do Project url vložit https://github.com/<user>/<repository>/ toto musí být uděláno manuálně.
Níže pak ještě zaškrtnout "GitHub hook trigger for GITScm polling", nebo to přidat do pipeline definice úlohy jako triggers{githubPush()}.

Poslední částí je nastavit URL webook na GitHubu, link: https://github.com/<user>/<repository>/settings/hooks/new, kde se vloží Payload URL: JENKINS_URL/github-webhook/ včetně lomítka na konci, content type jako application/json a secret je ten námi zvolený a uložený string.

Poté je výhodné udělat testovací ping a počkat na zelenou fajku, nicméně vlastní run jobu začně až po prvním commitu. Zejména na začátku nespěchtejte, občas to chce čas na reakci.


2018-11-19

Namespace Microsoft.SqlServer (are you missing an assembly reference?)

Chvíli jsem bojoval s chybovou hlášku u SW buildu na novém serveru, která se při sestavování stejného řešení na starším serveru neprojevovala, což bylo zjevně podezřelé. 


Její znění:
error CS0234: The type or namespace name 'Management' does not exist in the 
namespace 'Microsoft.SqlServer' (are you missing an assembly reference?) 
[...Installer.csproj]
Nepomohlo ruční doinstalování přes Nuget, ani doinstalování Microsoft SQL Server Feature Packu, ale bylo potřeba přidat celý SQL Server 2017 Developer edition, který zjevně deplnil některou závislost do systému Windows Server.

Ještě zkusím i odinstalování...
 

2018-10-24

Jenkins stops pipeline from Powershell

When you realize inside some job that you want to terminate running job in Jenkins you need to find way, hot to pass message to proper level where is Jenkins actually able to terminate the job. I am using this way with calling authorized URL which is terminating the job.

Jenkinsfile pipline is calling powershell and passing there API token from credentials (manually inserted to Jenkins => Credentials)
script
{
    if(env.GIT_PREVIOUS_SUCCESSFUL_COMMIT !=  null)
    {
        withCredentials([string(credentialsId: 'JenkinsAPIcredentials', variable: 'apistring')])
        {
            echo 'checking number of changes and stopping job if nothing new happened'
            powershell 'powershell -File $env:WORKSPACE\\stop-script.ps1 -phrase "stop-job" -buildNumber $env:BUILD_NUMBER -gitprevious $env:GIT_PREVIOUS_SUCCESSFUL_COMMIT -gitcurrent $env:GIT_COMMIT -jenkinsUrl $env:JENKINS_URL -buildIDurl $env:BUILD_URL -apistring $env:apistring'
        }
    }
}
What is happening inside powershell script? There is needed to generate authorized POST call to Jenkins server, luckily is process few lines of code. Part of code is missing definition of parameters in Powershell.
if($phrase -eq "stop-job")
{       
    $commitsnumprevious = (git rev-list --count $gitprevious)
    $commitsnumactual = (git rev-list --count $gitcurrent)
    $difference =  $commitsnumactual-$commitsnumprevious

    if($difference -le 0)
    {
        $url = $buildIDurl+'stop'
        $Bytes = [System.Text.Encoding]::UTF8.GetBytes($apistring)
        $Base64bytes = [System.Convert]::ToBase64String($Bytes)
        $Headers = @{ "Authorization" = "Basic $Base64bytes"}
        $CrumbIssuer = "$jenkinsUrl/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,`":`",//crumb)"
        $Crumb = Invoke-WebRequest -UseBasicParsing $CrumbIssuer -Headers $Headers
        $Regex = '^Jenkins-Crumb:([A-Z0-9]*)'
        $Matches = @([regex]::matches($Crumb, $Regex, 'IgnoreCase'))
        $RegCrumb = $Matches.Groups[1].Value
        $Headers.Add("Jenkins-Crumb", "$RegCrumb")

        try
        {
            $response = Invoke-WebRequest -Uri $url -Headers $Headers -Method POST
        }
        catch
        {           
            Write-Error "Stopping of job failed! " $_.Exception.Response.StatusCode.Value__
        }       
    }
}
I hope this few lines of code can make your day easier.