Управляйте переменными поля AWK ($ 1, $ 2, ..) и добавьте это в конец строки - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь создать файл / etc / host из файла инвентаризации ansible.

Ansible файл инвентаризации выглядит следующим образом:

[masters]
k8s-master-a.example.com ansible_ssh_host=10.15.90.2
k8s-master-b.example.com ansible_ssh_host=10.15.90.3
k8s-master-c.example.com ansible_ssh_host=10.15.90.4
[etcd]
k8s-etcd-a.example.com ansible_ssh_host=10.15.91.2
k8s-etcd-b.example.com ansible_ssh_host=10.15.91.3
k8s-etcd-c.example.com ansible_ssh_host=10.15.91.4

Следующий скрипт поможет создать его с записью fqdn.

$cat inventory.yaml | grep -v '^\[' | sed 's/ansible_ssh_host=//g' | awk '{ print $2 " " $1}' > /etc/hosts
10.15.90.2 k8s-master-a.example.com  
10.15.90.3 k8s-master-b.example.com  
10.15.90.4 k8s-master-c.example.com  
10.15.91.2 k8s-etcd-a.example.com 
10.15.91.3 k8s-etcd-b.example.com 
10.15.91.4 k8s-etcd-c.example.com 

Но я хочу, чтобы k8s-master- * и k8s-etcd- * также были в файле / etc / hosts.Окончательный результат должен выглядеть следующим образом.

10.15.90.2 k8s-master-a.example.com k8s-master-a
10.15.90.3 k8s-master-b.example.com k8s-master-b
10.15.90.4 k8s-master-c.example.com k8s-master-c
10.15.91.2 k8s-etcd-a.example.com k8s-etcd-a
10.15.91.3 k8s-etcd-b.example.com k8s-etcd-b
10.15.91.4 k8s-etcd-c.example.com k8s-etcd-c

Ответы [ 4 ]

2 голосов
/ 24 апреля 2019

Вам просто нужно awk для этого. Это сделает работу:

cat inventory.yaml 
[masters]
k8s-master-a.example.com ansible_ssh_host=10.15.90.2
k8s-master-b.example.com ansible_ssh_host=10.15.90.3
k8s-master-c.example.com ansible_ssh_host=10.15.90.4
[etcd]
k8s-etcd-a.example.com ansible_ssh_host=10.15.91.2
k8s-etcd-b.example.com ansible_ssh_host=10.15.91.3
k8s-etcd-c.example.com ansible_ssh_host=10.15.91.4

awk -F'[[:space:]=]' '/^[^[]/ {split($1, tokens, /[.]/); print $3, $1, tokens[1]}' inventory.yaml  
10.15.90.2 k8s-master-a.example.com k8s-master-a
10.15.90.3 k8s-master-b.example.com k8s-master-b
10.15.90.4 k8s-master-c.example.com k8s-master-c
10.15.91.2 k8s-etcd-a.example.com k8s-etcd-a
10.15.91.3 k8s-etcd-b.example.com k8s-etcd-b
10.15.91.4 k8s-etcd-c.example.com k8s-etcd-c
1 голос
/ 24 апреля 2019

AWK решение:

awk -F'[ =]' '/^[^\[]/ { if (match($1,/\./)) print($NF " " $1 " " substr($1,0,RSTART-1)); }'

Тест:

$ awk -F'[ =]' '/^[^\[]/ { if (match($1,/\./)) print($NF " " $1 " " substr($1,0,RSTART-1)); }' inventory.yaml
10.15.90.2 k8s-master-a.example.com k8s-master-a
10.15.90.3 k8s-master-b.example.com k8s-master-b
10.15.90.4 k8s-master-c.example.com k8s-master-c
10.15.91.2 k8s-etcd-a.example.com k8s-etcd-a
10.15.91.3 k8s-etcd-b.example.com k8s-etcd-b
10.15.91.4 k8s-etcd-c.example.com k8s-etcd-c
0 голосов
/ 24 апреля 2019
$ awk -F'[=[:space:]]+' 'split($1,f,/[.]/)>1{print $NF, $1, f[1]}' file
10.15.90.2 k8s-master-a.example.com k8s-master-a
10.15.90.3 k8s-master-b.example.com k8s-master-b
10.15.90.4 k8s-master-c.example.com k8s-master-c
10.15.91.2 k8s-etcd-a.example.com k8s-etcd-a
10.15.91.3 k8s-etcd-b.example.com k8s-etcd-b
10.15.91.4 k8s-etcd-c.example.com k8s-etcd-c
0 голосов
/ 24 апреля 2019

если данные в файле 'd', попробуйте на GNU AWK:

awk -F'[.= ]' '$0!~/^\[/{print $5"."$6"."$7"."$8,$1,$2"."$3,$1}' d
...