Коммит 88f1026c создал по автору keewek's avatar keewek
Просмотр файлов

release: v1.0.0

владелец a706ce8c
// SPDX-FileCopyrightText: 2023 Alexander Bugrov <abugrov+dev@gmail.com>
//
// SPDX-License-Identifier: MIT
// ansible-pretty-print is CLI tool that pretty-prints an output of
// 'ansible-playbook --list-tasks' command
package main
import (
"os"
"github.com/keewek/ansible-pretty-print/src/app"
)
func main() {
r := app.Run(app.DefaultConfig())
os.Exit(r)
}
// SPDX-FileCopyrightText: 2023 Alexander Bugrov <abugrov+dev@gmail.com>
//
// SPDX-License-Identifier: MIT
package app
import (
_ "embed"
"flag"
"fmt"
"io"
"os"
"strings"
"github.com/keewek/ansible-pretty-print/src/cmn"
"github.com/keewek/ansible-pretty-print/src/processor"
"github.com/keewek/ansible-pretty-print/src/ui"
)
// _go:generate sh -c 'git describe --abbrev=0 > version.txt'
//
//go:embed version.txt
var ver string
// _go:generate sh -c 'git describe > describe.txt'
// _go:embed describe.txt
// var desc string
func version(output io.Writer) func() {
return func() {
ver = strings.TrimSpace(ver)
// desc = strings.TrimSpace(desc)
if !strings.HasPrefix(ver, "v") {
ver = "v" + ver
}
revision := ""
if rev, ok := cmn.VcsRevision(); ok {
revision = fmt.Sprintf(" (revision: %v)", rev)
// revision = fmt.Sprintf(" (%s; %s)", desc, rev)
}
fmt.Fprintf(output, "ansible-pretty-print %s%s\n", ver, revision)
fmt.Fprintln(output, "Copyright: 2023 Alexander Bugrov")
fmt.Fprintln(output, "License: MIT <https://spdx.org/licenses/MIT.html>")
fmt.Fprintln(output)
}
}
func usage(output io.Writer) func() {
return func() {
fmt.Fprintf(output, "Usage: %v [OPTION]... [FILE]\n", os.Args[0])
fmt.Fprintln(output, "Pretty-print Ansible's --list-tasks output")
fmt.Fprintln(output)
flag.PrintDefaults()
}
}
func Run(c *Config) int {
ui.Box = c.AcquireBoxChars()
ui.FnWidth = c.Widther.Width
if c.IsVersion {
version(c.OutErr)()
return 0
}
scanner, closer, err := c.AcquireScanner()
if err != nil {
fmt.Fprintf(c.OutErr, "app.Run: %v\n", err)
return 1
}
defer closer()
if scanner == nil {
usage(c.OutErr)()
return 0
}
result, err := processor.ProcessLines(scanner, c.Widther)
if err != nil {
fmt.Fprintf(c.OutErr, "app.Run: %v\n", err)
return 1
}
if c.IsStats {
ui.MsgBoxTo(c.Out, result.Stats.Lines())
}
p := c.AcquirePrinter()
p.PrintTo(c.Out, result)
return 0
}
// SPDX-FileCopyrightText: 2023 Alexander Bugrov <abugrov+dev@gmail.com>
//
// SPDX-License-Identifier: MIT
package app
import (
"flag"
"fmt"
"os"
"testing"
"github.com/keewek/ansible-pretty-print/src/cmn"
"github.com/keewek/ansible-pretty-print/src/cmn/tst"
)
var fnTermSize = func(cols int, lines int, err error) TermSizeFunc {
return func() (int, int, error) {
return cols, lines, err
}
}
func TestRun(t *testing.T) {
t.Run("scanner error", func(t *testing.T) {
var (
out cmn.LineBuilder
outErr cmn.LineBuilder
)
c := &Config{
TermWidth: DefaultTermWidth,
Out: &out,
OutErr: &outErr,
Filepath: "testdata/file-not-found.txt",
}
c.Init(fnTermSize(80, 0, nil))
r := Run(c)
want := "Exit code: 1"
got := fmt.Sprintf("Exit code: %v", r)
tst.DiffError(t, want, got)
})
t.Run("processor error", func(t *testing.T) {
var (
out cmn.LineBuilder
outErr cmn.LineBuilder
)
c := &Config{
TermWidth: DefaultTermWidth,
Out: &out,
OutErr: &outErr,
Filepath: "testdata/list-tasks-err-play.txt",
}
c.Init(fnTermSize(80, 0, nil))
r := Run(c)
want := "Exit code: 1"
got := fmt.Sprintf("Exit code: %v", r)
tst.DiffError(t, want, got)
})
t.Run("usage", func(t *testing.T) {
var (
out cmn.LineBuilder
outErr cmn.LineBuilder
outFlag cmn.LineBuilder
lb cmn.LineBuilder
)
flag.CommandLine.SetOutput(&outFlag)
defer func() {
flag.CommandLine.SetOutput(nil)
}()
c := &Config{
TermWidth: DefaultTermWidth,
Out: &out,
OutErr: &outErr,
Filepath: "",
}
c.Init(fnTermSize(80, 0, nil))
r := Run(c)
lb.WriteLine(fmt.Sprintf("Usage: %v [OPTION]... [FILE]", os.Args[0]))
lb.WriteLine("Pretty-print Ansible's --list-tasks output")
lb.WriteLine("")
lb.WriteString(outFlag.String())
outErr.WriteString(outFlag.String())
want := lb.String()
got := outErr.String()
tst.DiffError(t, string(want), got)
want = "Exit code: 0"
got = fmt.Sprintf("Exit code: %v", r)
tst.DiffError(t, want, got)
})
t.Run("output", func(t *testing.T) {
var out cmn.LineBuilder
// var outErr cmn.LineBuilder
type testItem struct {
name string
isMono bool
isTable bool
isDos bool
isStats bool
isChop bool
isIndent bool
}
tests := []testItem{
{name: "runes"},
{name: "runes-indent", isIndent: true},
{name: "runes-chop_80", isChop: true},
{name: "runes-chop_80-indent", isChop: true, isIndent: true},
{name: "runes-table_80-ascii", isTable: true},
{name: "runes-table_80-dos", isTable: true, isDos: true},
{name: "mono", isMono: true},
{name: "mono-indent", isIndent: true, isMono: true},
{name: "mono-chop_80", isChop: true, isMono: true},
{name: "mono-chop_80-indent", isChop: true, isIndent: true, isMono: true},
{name: "mono-table_80-ascii", isTable: true, isMono: true},
{name: "mono-table_80-dos", isTable: true, isDos: true, isMono: true},
}
for _, ti := range tests {
file := "testdata/out-" + ti.name + ".txt"
t.Run(ti.name, func(t *testing.T) {
c := &Config{
TermWidth: DefaultTermWidth,
// Widther: cmn.MonospaceWidther{},
IsMono: ti.isMono,
IsTable: ti.isTable,
IsDos: ti.isDos,
IsStats: ti.isStats,
IsChop: ti.isChop,
IsIndent: ti.isIndent,
Out: &out,
OutErr: os.Stderr,
Filepath: "testdata/list-tasks-1.txt",
}
c.Init(fnTermSize(80, 0, nil))
Run(c)
want, err := os.ReadFile(file)
if err != nil {
t.Fatal(err)
}
got := out.String()
tst.DiffError(t, string(want), got)
out.Reset()
})
}
})
t.Run("stats", func(t *testing.T) {
var out cmn.LineBuilder
// var outErr cmn.LineBuilder
type testItem struct {
name string
isMono bool
// isTable bool
isDos bool
isStats bool
// isChop bool
// isIndent bool
}
tests := []testItem{
{name: "runes-ascii", isStats: true},
{name: "runes-dos", isStats: true, isDos: true},
{name: "mono-ascii", isStats: true, isMono: true},
{name: "mono-dos", isStats: true, isMono: true, isDos: true},
}
for _, ti := range tests {
file := "testdata/out-stats-" + ti.name + ".txt"
t.Run(ti.name, func(t *testing.T) {
c := &Config{
TermWidth: DefaultTermWidth,
// Widther: cmn.MonospaceWidther{},
IsMono: ti.isMono,
IsDos: ti.isDos,
IsStats: ti.isStats,
Out: &out,
OutErr: os.Stderr,
Filepath: "testdata/list-tasks-stats.txt",
}
c.Init(fnTermSize(80, 0, nil))
Run(c)
want, err := os.ReadFile(file)
if err != nil {
t.Fatal(err)
}
got := out.String()
tst.DiffError(t, string(want), got)
out.Reset()
})
}
})
}
// SPDX-FileCopyrightText: 2023 Alexander Bugrov <abugrov+dev@gmail.com>
//
// SPDX-License-Identifier: MIT
package app
import (
"bufio"
"flag"
"fmt"
"io"
"os"
"github.com/keewek/ansible-pretty-print/src/cmn"
"github.com/keewek/ansible-pretty-print/src/cmn/flags"
"github.com/keewek/ansible-pretty-print/src/printer"
"github.com/keewek/ansible-pretty-print/src/processor"
"golang.org/x/term"
)
// === start: Flags ===
const (
kFlagIsChop = "chop"
kFlagIsDos = "dos"
kFlagIsIndent = "indent"
kFlagIsMono = "mono"
kFlagIsStats = "stats"
kFlagIsStdin = "stdin"
kFlagIsTable = "table"
kFlagIsVersion = "version"
kFlagWidth = "width"
)
var (
flagIsChop = flag.Bool(kFlagIsChop, false, "chop long lines")
flagIsDos = flag.Bool(kFlagIsDos, false, "DOS box-drawing characters")
flagIsIndent = flag.Bool(kFlagIsIndent, false, "indent block/role")
flagIsMono = flag.Bool(kFlagIsMono, false, "calculate string width as monospace width")
flagIsStats = flag.Bool(kFlagIsStats, false, "print stats")
flagIsStdin = flag.Bool(kFlagIsStdin, false, "read standard input")
flagIsTable = flag.Bool(kFlagIsTable, false, "table output")
flagIsVersion = flag.Bool(kFlagIsVersion, false, "output version information")
flagWidth = flag.Int(kFlagWidth, 0, "custom line width")
)
// === end: Flags ===
const (
DefaultTermWidth = 80
)
type Printer interface {
Print(data *processor.Result)
PrintTo(output io.Writer, data *processor.Result)
}
type TermSizeFunc func() (cols int, lines int, err error)
type Config struct {
Filepath string
IsChop bool
IsDos bool
IsIndent bool
IsMono bool
IsStats bool
IsStdin bool
IsTable bool
IsVersion bool
TermWidth int
Widther cmn.Widther
Out io.Writer
OutErr io.Writer
}
// func isTerminal() bool {
// if isatty.IsTerminal(os.Stdin.Fd()) {
// return true
// } else if isatty.IsCygwinTerminal(os.Stdin.Fd()) {
// return true
// }
// return false
// }
func termSize() (cols int, lines int, err error) {
cols, lines, err = term.GetSize(int(os.Stdout.Fd()))
return cols, lines, err
}
func DefaultConfig() *Config {
c := &Config{
TermWidth: DefaultTermWidth,
Widther: cmn.RunesWidther{},
Out: os.Stdout,
OutErr: os.Stderr,
}
c.ApplyFlags()
c.Init(termSize)
return c
}
func (c *Config) Init(fnTermSize TermSizeFunc) {
if c.IsMono {
c.Widther = cmn.MonospaceWidther{}
} else {
c.Widther = cmn.RunesWidther{}
}
if (c.IsChop || c.IsTable) && !flags.IsSet("width") {
// Try determine terminal width
cols, _, err := fnTermSize()
if err != nil {
fmt.Fprintln(c.OutErr, "")
fmt.Fprintf(c.OutErr, "!!! Can't determine terminal width!\n")
fmt.Fprintf(c.OutErr, "!!! [width: %v; err: %v]\n", cols, err)
fmt.Fprintf(c.OutErr, "!!!\n")
fmt.Fprintf(c.OutErr, "!!! Falling back to default width of %v chars.\n", DefaultTermWidth)
fmt.Fprintf(c.OutErr, "!!! Use --width to specify custom value.\n")
fmt.Fprintf(c.OutErr, "!!! e.g., --width $(tput cols)\n")
fmt.Fprintln(c.OutErr, "")
} else {
c.TermWidth = cols
}
}
}
func (c *Config) AcquireBoxChars() cmn.BoxChars {
if c.IsDos {
return cmn.BoxCharsDos()
}
return cmn.BoxCharsAscii()
}
func (c *Config) AcquirePrinter() Printer {
var p Printer
if c.IsTable {
tp := printer.NewTablePrinter()
tp.SetWidther(c.Widther)
tp.SetMaxLineWidth(c.TermWidth)
if c.IsDos {
tp.SetBoxChars(cmn.BoxCharsDos())
}
p = tp
} else {
cp := printer.NewColumnPrinter()
cp.SetWidther(c.Widther)
cp.SetIsChopLines(c.IsChop)
cp.SetMaxLineWidth(c.TermWidth)
cp.SetIsIndentBlock(c.IsIndent)
p = cp
}
return p
}
func (c *Config) AcquireScanner() (scanner *bufio.Scanner, closer func(), _ error) {
closer = func() {}
if c.IsStdin {
scanner = bufio.NewScanner(os.Stdin)
} else if c.Filepath != "" {
file, err := os.Open(c.Filepath)
if err != nil {
return nil, closer, fmt.Errorf("Config.AcquireScanner: %w", err)
}
scanner = bufio.NewScanner(file)
closer = func() {
file.Close()
}
}
return scanner, closer, nil
}
func (c *Config) ApplyFlags() {
if !flag.Parsed() {
flag.Usage = usage(c.OutErr)
flag.Parse()
}
if fp := flag.Arg(0); fp != "" {
c.Filepath = fp
}
if flags.IsSet(kFlagIsChop) {
c.IsChop = *flagIsChop
}
if flags.IsSet(kFlagIsDos) {
c.IsDos = *flagIsDos
}
if flags.IsSet(kFlagIsIndent) {
c.IsIndent = *flagIsIndent
}
if flags.IsSet(kFlagIsMono) {
c.IsMono = *flagIsMono
}
if flags.IsSet(kFlagIsStats) {
c.IsStats = *flagIsStats
}
if flags.IsSet(kFlagIsStdin) {
c.IsStdin = *flagIsStdin
}
if flags.IsSet(kFlagIsTable) {
c.IsTable = *flagIsTable
}
if flags.IsSet(kFlagIsVersion) {
c.IsVersion = *flagIsVersion
}
if flags.IsSet(kFlagWidth) {
c.TermWidth = *flagWidth
}
}
// SPDX-FileCopyrightText: 2023 Alexander Bugrov <abugrov+dev@gmail.com>
//
// SPDX-License-Identifier: MIT
package app
import (
"errors"
"flag"
"fmt"
"os"
"testing"
"github.com/google/go-cmp/cmp"
"github.com/keewek/ansible-pretty-print/src/cmn"
"github.com/keewek/ansible-pretty-print/src/cmn/flags"
)
func fileComparer(x, y *os.File) bool {
return x.Name() == y.Name()
}
func TestDefaultConfig(t *testing.T) {
want := &Config{
TermWidth: 80,
Widther: cmn.RunesWidther{},
Out: os.Stdout,
OutErr: os.Stderr,
}
got := DefaultConfig()
if diff := cmp.Diff(want, got, cmp.Comparer(fileComparer)); diff != "" {
t.Errorf("(-want +got): \n%s", diff)
}
// if diff := cmp.Diff(want, got, cmp.Exporter(func(rt reflect.Type) bool { return true })); diff != "" {
// t.Errorf("(-want +got): \n%s", diff)
// }
}
func Test_ConfigInit(t *testing.T) {
fnTermSize := func(cols int, lines int, err error) TermSizeFunc {
return func() (int, int, error) {
return cols, lines, err
}
}
t.Run("MonospaceWidther", func(t *testing.T) {
c := &Config{
IsMono: true,
}
c.Init(fnTermSize(0, 0, nil))
want := "cmn.MonospaceWidther"
got := fmt.Sprintf("%T", c.Widther)
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("(-want +got): \n%s", diff)
}
})
t.Run("RunesWidther", func(t *testing.T) {
c := &Config{
IsMono: false,
}
c.Init(fnTermSize(0, 0, nil))
want := "cmn.RunesWidther"
got := fmt.Sprintf("%T", c.Widther)
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("(-want +got): \n%s", diff)
}
})
t.Run("Term size", func(t *testing.T) {
var lb cmn.LineBuilder
lb.WriteLine("")
lb.WriteLine("!!! Can't determine terminal width!")
lb.WriteLine("!!! [width: 0; err: Forced test error]")
lb.WriteLine("!!!")
lb.WriteLine("!!! Falling back to default width of 80 chars.")
lb.WriteLine("!!! Use --width to specify custom value.")
lb.WriteLine("!!! e.g., --width $(tput cols)")
lb.WriteLine("")
errMsg := lb.String()
tests := []struct {
name string
want int
isChop bool
isTable bool
forceWidth bool
fn TermSizeFunc
errMsg string
}{
{"Default", 80, false, false, false, fnTermSize(0, 0, nil), ""},
{"IsChop", 10, true, false, false, fnTermSize(10, 0, nil), ""},
{"IsTable", 10, false, true, false, fnTermSize(10, 0, nil), ""},
{"Default with width flag", 123, false, false, true, fnTermSize(10, 0, nil), ""},
{"IsChop with width flag", 123, true, false, true, fnTermSize(10, 0, nil), ""},
{"IsTable with width flag", 123, false, true, true, fnTermSize(10, 0, nil), ""},
{"TermSizeError", 80, false, true, false, fnTermSize(0, 0, errors.New("Forced test error")), errMsg},
}
flag.Set(kFlagWidth, "123")
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
lb.Reset()
c := &Config{
TermWidth: 80,
IsChop: tt.isChop,
IsTable: tt.isTable,
OutErr: &lb,
}
if tt.forceWidth {
flags.Enable(kFlagWidth)
} else {
flags.Disable(kFlagWidth)
}
c.ApplyFlags()
c.Init(tt.fn)
got := c.TermWidth
if diff := cmp.Diff(tt.want, got); diff != "" {
t.Errorf("(-want +got): \n%s", diff)
}
if diff := cmp.Diff(tt.errMsg, lb.String()); diff != "" {
t.Errorf("(-want +got): \n%s", diff)
}
})
}
})
}
func Test_ConfigAcquireBoxChars(t *testing.T) {
t.Run("Dos", func(t *testing.T) {
c := &Config{
IsDos: true,
}
want := cmn.BoxCharsDos()
got := c.AcquireBoxChars()
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("(-want +got): \n%s", diff)
}
})
t.Run("Ascii", func(t *testing.T) {
c := &Config{
IsDos: false,
}
want := cmn.BoxCharsAscii()
got := c.AcquireBoxChars()
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("(-want +got): \n%s", diff)
}
})
}
func Test_ConfigAcquirePrinter(t *testing.T) {
t.Run("TablePrinter", func(t *testing.T) {
c := &Config{
IsTable: true,
}
p := c.AcquirePrinter()
want := "*printer.TablePrinter"
got := fmt.Sprintf("%T", p)
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("(-want +got): \n%s", diff)
}
})
t.Run("ColumnPrinter", func(t *testing.T) {
c := &Config{
IsTable: false,
}
p := c.AcquirePrinter()
want := "*printer.ColumnPrinter"
got := fmt.Sprintf("%T", p)
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("(-want +got): \n%s", diff)
}
})
}
func Test_ConfigAcquireScanner(t *testing.T) {
t.Run("Nil", func(t *testing.T) {
c := &Config{}
s, closer, err := c.AcquireScanner()
defer closer()
want := "==nil: s=true; err=true"
got := fmt.Sprintf("==nil: s=%v; err=%v", s == nil, err == nil)
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("(-want +got): \n%s", diff)
}
})
t.Run("Stdin", func(t *testing.T) {
c := &Config{
IsStdin: true,
Filepath: "testdata/test.txt",
}
s, closer, err := c.AcquireScanner()
defer closer()
want := "==nil: s=false; err=true"
got := fmt.Sprintf("==nil: s=%v; err=%v", s == nil, err == nil)
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("(-want +got): \n%s", diff)
}
})
t.Run("File", func(t *testing.T) {
c := &Config{
IsStdin: false,
Filepath: "testdata/test.txt",
}
s, closer, err := c.AcquireScanner()
defer closer()
want := "==nil: s=false; err=true"
got := fmt.Sprintf("==nil: s=%v; err=%v", s == nil, err == nil)
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("(-want +got): \n%s", diff)
}
})
t.Run("File not found", func(t *testing.T) {
c := &Config{
IsStdin: false,
Filepath: "testdata/file-not-found.txt",
}
s, closer, err := c.AcquireScanner()
defer closer()
want := "==nil: s=true; err=false"
got := fmt.Sprintf("==nil: s=%v; err=%v", s == nil, err == nil)
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("(-want +got): \n%s", diff)
}
})
}
func Test_ConfigApplyFlags(t *testing.T) {
flag.Set(kFlagIsChop, "1")
flag.Set(kFlagIsDos, "1")
flag.Set(kFlagIsIndent, "1")
flag.Set(kFlagIsMono, "1")
flag.Set(kFlagIsStats, "1")
flag.Set(kFlagIsStdin, "1")
flag.Set(kFlagIsTable, "1")
flag.Set(kFlagIsVersion, "1")
flag.Set(kFlagWidth, "40")
flags.EnableAll()
want := &Config{
IsChop: true,
IsDos: true,
IsIndent: true,
IsMono: true,
IsStats: true,
IsStdin: true,
IsTable: true,
IsVersion: true,
TermWidth: 40,
Widther: nil,
}
got := &Config{}
got.ApplyFlags()
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("(-want +got): \n%s", diff)
}
}
playbook: playbooks/demo/playbook_demo.yml
play #1 (demo): Demo play TAGS: []
tasks:
Проверка Тест Проверка Тест: Проверка Тест Проверка Тест Проверка Тест TAGS: [Russian]
你好世界: 你好世界 TAGS: [Chinese]
你好世界 TAGS: [Chinese]
こんにちは世界: こんにちは世界 TAGS: [Japanese]
こんにちは世界 TAGS: [Japanese]
Gather the package facts TAGS: [apt, facts, vars]
Print local facts TAGS: [vars]
Debug vars TAGS: [vars]
apt: Copy 'apt_bootstrap.sh' TAGS: [bootstrap, bootstrap-apt, never]
users: Ensure user 'vpsadmin' exists TAGS: [bootstrap, never, users]
users: Set exclusive authorized key for 'root' TAGS: [auth, bootstrap, never]
users: Set exclusive authorized key for 'vpsadmin' TAGS: [auth, bootstrap, never]
sshd: Ensure '/etc/ssh/conf.d' directory exists TAGS: [bootstrap, never, sshd]
sshd: Common options TAGS: [bootstrap, never, sshd]
sshd: Listen on Port {{ sshd_default_port }} TAGS: [bootstrap, never, sshd]
sshd: Listen on Port {{ sshd_custom_port }} TAGS: [bootstrap, never, sshd]
sshd: Assemble and validate /etc/ssh/sshd_config.d/00-custom.conf TAGS: [bootstrap, never, sshd]
journald: Ensure '{{ task_config_dir_path }}' directory exists TAGS: [journald]
journald: Configure TAGS: [journald]
facts.d: Ensure '/etc/ansible/facts.d' directory exists TAGS: [facts]
facts.d: Ensure '/etc/ansible/facts.d/config.fact' exists TAGS: [facts]
ufw: Active options TAGS: [ufw]
ufw: IPv6 support TAGS: [ufw]
ufw: Allow ssh to port {{ sshd_custom_port }} TAGS: [ufw]
ufw: Allow ssh to port {{ sshd_default_port }} TAGS: [ufw]
ufw: Allow WWW(80, 443) TAGS: [ufw]
ufw: Allow WireGuard to port {{ wireguard_port }} TAGS: [ufw]
ufw: Allow WireGuard - WWW(80, 443/tcp) TAGS: [ufw]
ufw: Set logging TAGS: [ufw]
ufw: Enable TAGS: [ufw]
apt: Check for required packages TAGS: [apt]
apt: Print check result on failure TAGS: [apt]
apt: Install required packages TAGS: [apt]
systemctl_status : Validating arguments against arg spec 'main' TAGS: [always, service]
systemctl_status : Asserting arguments TAGS: [service]
systemctl_status : Execute command TAGS: [service]
systemctl_status : Parse stdout TAGS: [service]
Print systemctl_status_services TAGS: [service]
wireguard: Active options TAGS: [wireguard]
wireguard: Template 'wg0.conf' config file TAGS: [wireguard, wireguard-template-config]
wireguard: Ensure service is {{ unit_state }} and {{ service_state }} TAGS: [wireguard]
play #2 (demo): Demo 2 TAGS: []
tasks:
Task 2.1 TAGS: []
Task 2.2 TAGS: []
play #3 (demo): very long: play name. Very long play name. Very long play name. Very long play name. TAGS: []
tasks:
Task 3.1 TAGS: []
Task 3.2 TAGS: []
playbook: playbooks/demo/playbook_demo.yml
play #1 (demo): Demo play TAGS: []
tasks:
Gather the package facts TAGS: [apt, facts, vars]
Print local facts TAGS: [vars]
Debug vars TAGS: [vars]
apt: Copy 'apt_bootstrap.sh' TAGS: [bootstrap, bootstrap-apt, never]
users: Ensure user 'vpsadmin' exists TAGS: [bootstrap, never, users]
users: Set exclusive authorized key for 'root' TAGS: [auth, bootstrap, never]
users: Set exclusive authorized key for 'vpsadmin' TAGS: [auth, bootstrap, never]
sshd: Ensure '/etc/ssh/conf.d' directory exists TAGS: [bootstrap, never, sshd]
sshd: Common options TAGS: [bootstrap, never, sshd]
sshd: Listen on Port {{ sshd_default_port }} TAGS: [bootstrap, never, sshd]
sshd: Listen on Port {{ sshd_custom_port }} TAGS: [bootstrap, never, sshd]
sshd: Assemble and validate /etc/ssh/sshd_config.d/00-custom.conf TAGS: [bootstrap, never, sshd]
journald: Ensure '{{ task_config_dir_path }}' directory exists TAGS: [journald]
journald: Configure TAGS: [journald]
facts.d: Ensure '/etc/ansible/facts.d' directory exists TAGS: [facts]
facts.d: Ensure '/etc/ansible/facts.d/config.fact' exists TAGS: [facts]
ufw: Active options TAGS: [ufw]
ufw: IPv6 support TAGS: [ufw]
ufw: Allow ssh to port {{ sshd_custom_port }} TAGS: [ufw]
ufw: Allow ssh to port {{ sshd_default_port }} TAGS: [ufw]
ufw: Allow WWW(80, 443) TAGS: [ufw]
ufw: Allow WireGuard to port {{ wireguard_port }} TAGS: [ufw]
ufw: Allow WireGuard - WWW(80, 443/tcp) TAGS: [ufw]
ufw: Set logging TAGS: [ufw]
ufw: Enable TAGS: [ufw]
apt: Check for required packages TAGS: [apt]
apt: Print check result on failure TAGS: [apt]
apt: Install required packages TAGS: [apt]
systemctl_status : Validating arguments against arg spec 'main' TAGS: [always, service]
systemctl_status : Asserting arguments TAGS: [service]
systemctl_status : Execute command TAGS: [service]
systemctl_status : Parse stdout TAGS: [service]
Print systemctl_status_services TAGS: [service]
wireguard: Active options TAGS: [wireguard]
wireguard: Template 'wg0.conf' config file TAGS: [wireguard, wireguard-template-config]
wireguard: Ensure service is {{ unit_state }} and {{ service_state }} TAGS: [wireguard]
play #2 (demo): Demo 2 TAGS: []
tasks:
Task 2.1 TAGS: []
Task 2.2 TAGS: []
play #3 (demo): very long: play name. Very long play name. Very long play name. Very long play name. TAGS: []
tasks:
Task 3.1 TAGS: []
Task 3.2 TAGS: []
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать