Создать yml файл linux

Create bash script to create yaml files from existing linux etc/hosts files

I’m new to scripting but have been tasked with creating yaml files from existing Linux /etc/hosts files. Using a hosts file here:

127.0.0.1 localhost 192.168.1.2 host1 192.168.1.3 host2 192.168.1.4 host3 192.168.1.5 host4 
host_entries: host1: ip: '192.168.1.2' host2: ip: '192.168.1.3' host3: ip: '192.168.1.4' host4: ip: '192.168.1.5' 

I know there is more than one way to reach a desired solution. But I’m not quite sure how to script this in a way to get the correct format. Any suggestions would be appreciated.

I haven’t used it before, but awk could do it right from bash. You just need to make some research by yourself

YAML files that look like that, or YAML files that parse equivalently to that? Since YAML is a superset of JSON, one could easily use jq for the task.

To be clear, using jq will give you a strong guarantee of syntactically correct output — so will a YAML module written to the spec in Python or a similar language. Anything you do with native tools (be it bash itself or awk or similar) will have no such guarantees.

@MikeVelazco, since awk is its own separate language, one could just as easily say that Python could do it right from bash. 🙂

1 Answer 1

Easy and wrong (not strongly guaranteed that output will be valid YAML for all possible inputs):

 < printf 'host_entries:\n' while read -r -a line; do [[ $]] || continue # skip blank lines [[ $ = "#"* ]] && continue # skip comments [[ $ = 127.0.0.1 ]] && continue # skip localhost set -- "$" # assign words read from line to current argument list ip=$1; shift # assign first word from line to ip for name; do # iterate over other words, treating them as names printf " %s:\n ip: '%s'\n" "$name" "$ip" done done > yourfile.yaml 

. for something that’s shorter and wrong-er, see edit history (prior version also worked for your sample input, but couldn’t correctly handle blank lines, comments, IPs with more than one hostname, etc).

Given your exact host file as input, this emits:

host_entries: host1: ip: '192.168.1.2' host2: ip: '192.168.1.3' host3: ip: '192.168.1.4' host4: ip: '192.168.1.5' 

Источник

Инструкция по установке и запуску Ansible на Linux

Обновлено

Обновлено: 14.09.2022 Опубликовано: 22.07.2016

Мы рассмотрим простую устаноку Ansible на Linux. Инструкция подойдет для Ubuntu, а также CentOS версий 8 и 7.

Установка

Установка для Ubuntu и CentOS выполняется, немного, по-разному. Рассмотрим оба варианта.

Ubuntu

CentOS

По умолчанию Ansible нет в репозитории CentOS — устанавливаем EPEL:

После устанавливаем сам сервер управления:

* система автоматически обновит список пакетов с учетом нового репозитория и начнет установку Ansible. Если появится запрос на подтверждение, отвечаем Y.

Начальная настройка и тестовый запуск Ansible

Разобьем наши действия на небольшие группы.

Читайте также:  Мой офис альт линукс

Настройка инвентарного файла

В данном файле хранится информация о хостах и/или группах хостов. Также в нем могет храниться переменные, определенные для конкретной группы хостов или конкретного компьютера.

Есть два варианта написания инвентарного файла — в формате yml или ini. Рассмотрим оба.

1. Файл формата ini.

Даннай формат используется по умолчанию. Откроем на редактирование файл с серверами, которыми хотим управлять:

и приведем его к следующему виду:

[test_servers]
192.168.1.100
192.168.1.101

* в данном примере создана группа серверов test_servers, в которую добавлены два сервера с IP-адресами 192.168.1.100 и 192.168.1.101.

2. Файл формата yml.

Создадим отдельный каталог:

test_servers:
vars:
ansible_python_interpreter: /usr/bin/python3
hosts:
server01:
ansible_ssh_host: 192.168.1.100
ansible_ssh_port: 22
server02:
ansible_ssh_host: 192.168.1.101
ansible_ssh_port: 22

* в данном примере также создана группа серверов test_servers, в которую добавлены два сервера server01 и server02 с IP-адресами 192.168.1.100 и 192.168.1.101. Адреса не обязательно писать, если имя машины разрешается с помощью DNS. Также не обязательно указывать порты, если они стандартные (22).
** обратите внимание, что мы также добавили переменную ansible_python_interpreter с указанием пути для запуска python.

Настройка ansible

Открываем конфигурационный файл ansible:

Снимаем комментарий с опции host_key_checking, приведя ее к виду:

* данная настройка позволит нашему серверу управления автоматически принимать ssh fingerprint, избавляя нас от необходимости постоянно вводить yes, когда мы впервые конфигурируем новый сервер.

Также в секцию defaults добавим:

[defaults]
.
interpreter_python = auto_silent

* данная опция указывает, чтобы ansible автоматически искал python на целевом хосте без показа предупреждений.

Тестовый запуск

Теперь выполним проверку доступности добавленных серверов:

ansible -m ping test_servers -u root -kK

* данная команда проверит доступность по сети двух серверов из группы test_servers от учетной записи root.

Если мы создали и хотим использовать инвентарный файл yml, то вводим:

ansible -i /etc/ansible/inventory/test_servers.yml -m ping test_servers -u root -kK

* мы должны указать путь до файла inventory с помощью опции -i.

Будет запрошен пароль от учетной записи (в нашем случае, root). После будет запрошен пароль суперпользователя на серверах.

На экране должно появиться, примерно, следующее:

192.168.1.100 | SUCCESS => «ansible_facts»: «discovered_interpreter_python»: «/usr/bin/python3»
>,
«changed»: false,
«ping»: «pong»
>
192.168.1.101 | SUCCESS => «ansible_facts»: «discovered_interpreter_python»: «/usr/bin/python»
>,
«changed»: false,
«ping»: «pong»
>

Наш сервер управления готов к работе.

Подключение без пароля

В нашем примере аутентификация на узлах выполняется с помощью пароля. Это не очень удобно и безопасно. Рассмотрим вариант использования ssh ключа.

На компьютере с ansible сгенерируем пару ключей следующей командой:

После нажатия Enter система попросит ввести параметры размещения ключа и пароль. Ничего не меняем, нажимая ввод и соглашаясь со значениями по умолчанию.

Мы увидим что-то на подобие:

Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ed25519
Your public key has been saved in /root/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:FTDGR6Gz92WI33/ywMSImcqfx2IRQjrD20tE/qzqZ5Y root@ansible.dmosk.ru
The key’s randomart image is:
+—[ED25519 256]—+
| .+o+. |
| .+o.. |
| . =o.. |
| = ++.= + |
| *S+*.o = |
| ..oo+o * |
| .o+ oo + |
| E.o.o .o.|
| .o= .oo o+|
+—-[SHA256]——+

* обратите внимание, что мы сгенерировали ключи под пользователем root и из местоположение в каталоге /root/.ssh.

Теперь скопируем публичный ключ на все серверы, к которым будем подключаться:

Читайте также:  Linux and virtual machines

ssh-copy-id -i /root/.ssh/id_ed25519.pub root@192.168.1.100

ssh-copy-id -i /root/.ssh/id_ed25519.pub root@192.168.1.101

* в нашем примере мы копируем наш ключ для пользователя root на удаленной системе.

Готово. Попробуем подключиться по SSH без пароля к любому из серверов:

Мы должны подключиться к серверу без запроса пароля.

Теперь можно попробовать запустить наш ансибл без ввода паролей:

ansible -m ping test_servers -u root

Или с использованием инвентарного файла yml:

ansible -i /etc/ansible/inventory/test_servers.yml -m ping test_servers -u root

Команда должна выполниться без запросов пароля.

Если не заработало

Если на экране появится ошибка, введите с сервера ansible следующую команду:

* в данном случае, мы пытаемся подключиться к серверу 192.168.1.100 по SSH от пользователя root.

Если подключиться к серверу 192.168.1.100 вышеописанной командой не удалось, возможно введен неправильный пароль или доступ по SSH от root запрещен. В этом случае, создайте служебную учетную запись на сервере 192.168.1.100 и используйте ее для подключения по SSH. Например, на удаленном сервере вводим:

* в даном примере мы создали учетную запись ansible и задали ей пароль.

Теперь вводим нашу команду для проверки:

ansible -m ping test_servers -u ansible -kK

* обратите внимание, что мы выполняем теперь запрос от пользователя ansible.

Источник

How to create documents with Bash scripts

Bash «here documents» are a useful way to create uncomplicated YAML and HTML documents, inventory files, and emails.

How to capture terminal sessions using the script commandPhoto by Sora Shimazaki from Pexels

Sometimes you need to generate multi-line documents with complex nested structures, like YAML or HTML, from inside Bash scripts. You can accomplish this by using some special Bash features, like here documents. A «here doc» is a code or text block that can be redirected to a script or interactive program. Essentially, a Bash script becomes a here doc when it redirects to another command, script, or interactive program.

This article explains how to:

  • Use arrays, dictionaries, and counters
  • Work with different types of comments
  • Generate YAML and HTML documents
  • Send emails with text and attachments

Documenting a script

It’s important to comment your scripts, and you can create single-line comments with a # , or you can have multi-line comments by using the combination of : and

This help function for your script is another useful example:

#!/bin/bash SCRIPT=$(/usr/bin/basename $0)|| exit 100 export SCRIPT function help_me < /usr/bin/cat# To use the help function just call help help_me

The multi-line format is pretty useful by itself, especially when documenting complex scripts. However, there is a nice twist to using here documents that you may have seen before:

$ /usr/bin/cat$HOME/test_doc.txt Here is a multi-line document that I want to save. Note how I can use variables inside like HOME=$HOME. EOF

Here's what is written in the file:

$ /usr/bin/cat $HOME/test_doc.txt Here is a multi-line document that I want to save. Note how I can use variables inside like HOME=/home/josevnz.

Now I'll move to something else so that you can apply this knowledge.

[ For more Bash tips, download this Bash Shell Scripting Cheat Sheet ]

Using arrays and dictionaries to generate an Ansible inventory YAML file

Say you have the following CSV file with a list of hosts on each line containing servers or desktops:

# List of hosts, tagged by group macmini2:servers raspberrypi:servers dmaf5:desktops mac-pro-1-1:desktops

You want to convert the list to the following Ansible YAML inventory file:

--- all: children: servers: hosts: macmini2: raspberrypi: vars: description: Linux servers for the Nunez family desktops: hosts: dmaf5: mac-pro-1-1: vars: description: Desktops for the Nunez family 
  • Each system type (desktops or servers) will have a different variable called description . Using arrays and associative arrays and counters allows you to satisfy this requirement.
  • The script should fail if the user doesn't provide all the correct tags. An incomplete inventory is not acceptable. For this requirement, a simple counter will help.
Читайте также:  Чем открыть xml файл linux

This script accomplishes the goal:

#!/bin/bash : # We could use a complicated if-then-else or a case . esac # to handle the tag description logic # with an Associate Array is very simple declare -A var_by_tag var_by_tag["desktops"]="Desktops for the Nunez family" var_by_tag["servers"]="Linux servers for the Nunez family" function extract_hosts < tag=$1 host_file=$2 /usr/bin/grep -P ":$tag$" "$host_file"| /usr/bin/cut -f1 -d':' test $? -eq 0 && return 0|| return 1 ># Consume the host file hosts_file=$1 shift 1 if [ -z "$hosts_file" ]; then echo "ERROR: Missing host file!" help exit 100 fi if [ ! -f "$hosts_file" ]; then echo "ERROR: Cannot use provided host file: $hosts_file" help exit 100 fi # Consume the tags if [ -z "$*" ]; then echo "ERROR: You need to provide one or more tags for the script to work!" help exit 100 fi : " ]; then echo "ERROR: I don't know how to handle tag=$tag (known tags=$). Fix the script!" exit 100 fi done /usr/bin/cat"; do /usr/bin/cat YAML done

Here's what the output looks like:

all: children: servers: hosts: macmini2: raspberrypi: vars: description: Linux servers for the Nunez family desktops: hosts: dmaf5: mac-pro-1-1: vars: description: Desktops for the Nunez family

A better way could be to create a dynamic inventory and let the Ansible playbook use it. To keep the example simple, I did not do that here.

Sending HTML emails with YAML attachments

The last example will show you how to pipe a here document to Mozilla Thunderbird (you can do something similar with /usr/bin/mailx ) to create a message with an HTML document and attachments:

#!/bin/bash :    table < font-family: arial, sans-serif; border-collapse: collapse; width: 100%; >td, th < border: 1px solid #dddddd; text-align: left; padding: 8px; >tr:nth-child(even) 

Hello,

This is a public announcement from $USER:

Date Time Kernel version
$DATE $TIME Rovelli $KERNEL_VERSION
EMAIL
$ ./html_mail.sh cooldevops@kodegeek.com hosts.yaml

If things go as expected, Thunderbird will create an email like this:

Here document example usage with Thunderbird

Wrapping up

Great Linux resources

To recap, you've learned how to:

  • Use more sophisticated data structures like arrays and associative arrays to generate documents
  • Use counters to keep track of events
  • Use here documents to create YAML documents, help instructions, HTML, etc.
  • Send emails with HTML and YAML

Bash is OK for generating small, uncomplicated documents. If you're dealing with large or complex documents, you may be better off using another scripting language like Python or Perl to get the same results with less effort. Also, never underestimate the importance of a real debugger when dealing with complex document creation.

Источник

Оцените статью
Adblock
detector