๐Ÿ“—
smiley book
  • Smiley Books
  • AI
    • Readme
    • openai-whisper
      • ์ƒ˜ํ”Œ ์‹คํ–‰ํ•ด๋ณด๊ธฐ
      • GPU ์„œ๋ฒ„ ์ค€๋น„ํ•˜๊ธฐ
      • API๋กœ whisper๋ฅผ ์™ธ๋ถ€์— ์˜คํ”ˆํ•˜๊ธฐ
      • ํ”„๋กฌํ”„ํŠธ ์ง€์›
      • ์‹ค์‹œ๊ฐ„ message chat
      • ํ™”๋ฉด ์ด์˜๊ฒŒ ๋งŒ๋“ค๊ธฐ์™€ ๋กœ๊ทธ์ธ
      • ํŒŒ์ด์ฌ ๊ฐ€์ƒํ™˜๊ฒฝ
      • ์‹ค์‹œ๊ฐ„ voice chat
      • fine tunning(๋ฏธ์„ธ ์กฐ์ •) ์œผ๋กœ ์„ฑ๋Šฅ ์˜ฌ๋ฆฌ๊ธฐ
      • app์—์„œ api๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ…์ŠคํŠธ๋กœ ๋ฐ”๊ฟ”๋ณด๊ธฐ
    • ollama - llm์„ ์‰ฝ๊ฒŒ ๋‚ด์ปด์—์„œ ์‹คํ–‰
      • ollama webui
      • ollama docker
    • stable diffusion
      • SDXL - text to image
      • SD-webui
    • ChatGPT
      • ๋‹ต๋ณ€์ด ๋Š๊ธธ๋•Œ
      • ์—ญํ• ์„ ์ •ํ•˜์ž
      • ๊ตฌ์ฒด์ ์ธ ์งˆ๋ฌธ
      • ๊ฒฐ๊ณผํ˜•ํƒœ๋ฅผ ์ง€์ •
      • ํ”„๋กฌํ”„ํŠธ๋ฅผ ์—ฌ๋Ÿฌ์ค„๋กœ ์‚ฌ์šฉํ•˜์ž.
      • ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ ๊ธ€ ๋ฒˆ์—ญ๋ณธ
    • Prompt Engineering
    • Auto-GPT
    • Gemini
      • google ai studio
      • gemini-api
      • embedding guide
    • Huggingface
      • huggingface ์‚ฌ์šฉ๋ฒ•
      • huggingface nlp ๊ณต๋ถ€์ค‘
    • kaggle
      • download dataset
    • langchain
      • langchain์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌ
      • basic
      • slackbot
      • rag
      • document-loader
      • website-loader
      • confluence
      • memory
      • function-call
      • langsmith
      • agent-toolkit
  • Ansible
    • templates vs files and jinja2
    • dynamic inventory
    • limit ์˜ต์…˜ ๊ฐ•์ œํ•˜๊ธฐ
    • limit ์‚ฌ์šฉํ›„ gather_fact ๋ฌธ์ œ
  • AWS
    • AWS CLI
    • EKS
      • cluster manage
      • ALB Controller
      • external-dns
      • fargate
    • ECR
    • S3
    • Certificate Manager
  • Azure
    • Azure AD OAuth Client Flow
  • Container
    • Registry
    • ๋นŒ๋“œ์‹œ์— env๊ฐ’ ์„ค์ •ํ•˜๊ธฐ
  • DB
    • PXC
      • Operator
      • PMM
      • ์‚ญ์ œ
      • GTID
      • Cross Site Replication
    • Mssql
    • Mysql
  • dotnet
    • Thread Pool
    • Connection Pool
    • Thread Pool2
  • Devops
    • Recommendation
  • GIT
    • Basic
    • Submodule
  • GitHub
    • Repository
    • GitHub Action
    • GitHub PR
    • Self Hosted Runner
    • GitHub Webhook
  • GitLab
    • CI/CD
    • CI/CD Advance
    • Ssl renew
    • CI/CD Pass env to other job
  • Go Lang
    • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•
    • multi os binary build
    • kubectl๊ฐ™์€ cli๋งŒ๋“ค๊ธฐ
    • azure ad cli
    • embed static file
    • go study
      • pointer
      • module and package
      • string
      • struct
      • goroutine
  • Kubernetes
    • Kubernetes๋Š” ๋ฌด์—‡์ธ๊ฐ€
    • Tools
    • Install with kubespray
    • Kubernetes hardening guidance
    • 11 ways not to get hacked
    • ArgoCD
      • Install
      • CLI
      • Repository
      • Apps
      • AWS ALB ์‚ฌ์šฉ
      • Notification slack
      • Backup / DR
      • Ingress
      • 2021-11-16 Github error
      • Server Config
      • auth0 ์ธ์ฆ ์ถ”๊ฐ€(oauth,OIDC)
    • Extension
      • Longhorn pvc
      • External dns
      • Ingress nginx
      • Cert Manager
      • Kube prometheus
    • Helm
      • Subchart
      • Tip
    • Loki
    • Persistent Volume
    • TIP
      • Job
      • Pod
      • Log
  • KAFKA
    • raft
  • KVM
    • kvm cpu model
  • Linux
    • DNS Bind9
      • Cert-Manager
      • Certbot
      • Dynamic Update
      • Log
    • Export and variable
    • Grep ์‚ฌ์šฉ๋ฒ•
  • Modeling
    • C4 model introduce
    • Mermaid
    • reference
  • Monitoring
    • Readme
    • 0. What is Monitoring
    • 1. install prometheus and grafana
    • 2. grafana provisioning
    • 3. grafana dashboard
    • 4. grafana portable dashboard
    • 5. prometheus ui
    • 6. prometheus oauth2
    • Prometheus
      • Metric type
      • basic
      • rate vs irate
      • k8s-prometheus
    • Grafana
      • Expolorer
    • Node Exporter
      • advance
      • textfile collector
  • Motivation
    • 3 Simple Rule
  • OPENNEBULA
    • Install(ansible)
    • Install
    • Tip
    • Windows vm
  • Reading
    • comfort zone
    • ๋ฐฐ๋ ค
    • elon musk 6 rule for insane productivity
    • Feynman Technique
    • how to interview - elon musk
    • ๊ฒฝ์ฒญ
    • Readme
  • Redis
    • Install
    • Master-slave Architecture
    • Sentinel
    • Redis Cluster
    • Client programming c#
  • SEO
    • Readme
  • Security
    • criminalip.io
      • criminalip.io
  • Stock
    • robinhood-python
  • Terraform
    • moved block
    • output
  • vault
    • Readme
  • VS Code
    • dev container
    • dev container on remote server
  • Old fashione trend
    • curity
    • MAAS
      • Install maas
      • Manage maas
      • Tip
Powered by GitBook
On this page
  • architecture
  • inventory plugin
  • ์ŠคํŽ™
  • rest api (c#)
  • controller
  • ์ค‘์š” ํฌ์ธํŠธ
  • ๊ฒฐ๋ก 

Was this helpful?

  1. Ansible

dynamic inventory

Previoustemplates vs files and jinja2Nextlimit ์˜ต์…˜ ๊ฐ•์ œํ•˜๊ธฐ

Last updated 2 years ago

Was this helpful?

ansible์—์„œ๋Š” ์ธ๋ฒคํ† ๋ฆฌ๋ฅผ ๋””๋น„๋‚˜ api๋“ฑ์—์„œ ๋ฐ›์•„์˜ฌ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

architecture

inventory plugin

ansible-doc -t inventory -l

์ธ๋ฒคํ† ๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด์‹ค์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์Šคํฌ๋ฆฝํŠธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ŠคํŽ™

์–ด๋–ค ์Šคํฌ๋ฆฝํŠธ๋“  ์‹คํ–‰๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ  json์œผ๋กœ inventory๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. (php, python, ruby, bash, perl, go, powershell, etc)

์ €๋Š” go๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

cli ์˜ต์…˜ ์ถ”๊ฐ€

rootCmd.PersistentFlags().BoolVarP(&list, "list", "l", false, "ansible inventory --list")
rootCmd.PersistentFlags().StringVar(&name, "host", "", "ansible inventory --host")

binary์—์„œ ๋‘๊ฐœ์˜ ์˜ต์…˜์„ ์ง€์›์„ ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. --list์™€ --host์ž…๋‹ˆ๋‹ค.

--list๋Š” ์ธ๋ฒคํ† ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  --host๋Š” ํŠน์ • ํ˜ธ์ŠคํŠธ์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

var rootCmd = &cobra.Command{
	Use:   "myctl",
	Short: "myctl",
	// Uncomment the following line if your bare application
	// has an action associated with it:
	Run: func(cmd *cobra.Command, args []string) {
		server.GetAnsible(name)
	},
}

์ด์ œ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋ฉด server.GetAnsible(name)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

restapi๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ json์„ ๋ฐ›์•„์˜ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

func GetAnsible(hostname string) {
	oauthTokenProvider := new(tokenProvider)

	t := oauthTokenProvider.OAuthToken()
	// fmt.Println("hostname", hostname)

	result := httpApi.GetAnsible(hostname, t)

	fmt.Print(result)

}

func GetAnsible(hostname string, oauthToken string) string {
	getInventory := "https://api.cmdb.aaa.com/inventories"

	r, err := http.NewRequest(http.MethodGet, getInventory, nil)
	if err != nil {
		panic(err)
	}

	r.Header.Add("Content-Type", "application/json")

	// appending to existing query args
	q := r.URL.Query()
	if hostname != "" {
		q.Add("name", hostname)
	}

	// assign encoded query string to http request
	r.URL.RawQuery = q.Encode()

	resp, err := http.DefaultClient.Do(r)

	if err != nil {
		panic(err)
	}

	defer resp.Body.Close()

	responseBody, err := ioutil.ReadAll(resp.Body)

	if err != nil {
		panic(err)
	}

	return string(responseBody)
}

์ด์ œ cli๋Š” ์ค€๋น„๊ฐ€ ๋ฌ์œผ๋‹ˆ rest api๋ฅผ ํ†ตํ•ด์„œ ๋””๋น„์—์„œ ๊ฐ€์ ธ์™€๋ณด์ž.

rest api (c#)

// --list์˜ ๊ฒฝ์šฐ
var query = _context.Servers
                            .Where(x => x.DeletedFlag == false)
                            .Where(x => x.StatusValue == (int)EnumStatus.Active)
                            .ApplySort(request.OrderBy, _propertyMappingService.GetPropertyMapping<GetInventoriesQuery, Server>())
                            .AsQueryable()
                            ;

// --host์ผ๊ฒฝ์šฐ hostnameํ•˜๋‚˜๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค.
if (request.Name != null)
{
    query = query.Where(x => x.Name == request.Name);
}

// az๋กœ ๊ทธ๋ฃนํ•‘์„ ํ•ด๋ดฃ๋‹ค.
var entities = query.GroupBy(x => new { x.SiteId, x.ServerType },
                        (key, group) => new Inventory
                        {
                            AZ = key.SiteId == (int)EnumSite.SV4 ? "sv4"
                                        : key.SiteId == (int)EnumSite.SV5 ? "sv5"
                                        : key.SiteId == (int)EnumSite.DC3 ? "dc3"
                                        : "Unknown",
                            ServerType = key.ServerType == (int)EnumServerType.BAREMETAL ? "baremetal"
                                        : key.ServerType == (int)EnumServerType.VM ? "vm"
                                        : "Unknown",
                            Hosts = group.Select(x => x.Name).Take(10).ToList()
                        })
                    .ToList()
                    ;

//์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” json์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

var json = new StringBuilder();
json.Append("{\"_meta\": {\"hostvars\":{}},"); // - 1 ์ค‘์š”

var allGroup = new StringBuilder();
allGroup.Append("\"all\": {\"children\": [");

var allHosts = new StringBuilder();

foreach (var item in entities)
{
    allHosts.Append("\"" + item.AZ + "-" + item.ServerType + "\",");
}

json.Append(allGroup.ToString());

json.Append(allHosts.ToString().Substring(0, allHosts.ToString().Length - 1));

json.Append("]},");

var hostsByGroup = new StringBuilder();

foreach (var item in entities)
{
    hostsByGroup.Append("\"" + item.AZ + "-" + item.ServerType + "\": {\"hosts\": [");

    var hosts = new StringBuilder();

    foreach (var host in item.Hosts)
    {
        hosts.Append("\"" + host + "\",");
    }

    hostsByGroup.Append(hosts.ToString().Substring(0, hosts.ToString().Length - 1));
    hostsByGroup.Append("]},");
}
json.Append(hostsByGroup.ToString().Substring(0, hostsByGroup.ToString().Length - 1));
json.Append("}");

return json.ToString();

๊ธ‰ํ•˜๊ฒŒ ์ง  ์ฝ”๋“œ๋ผ ๋Œ€์ถฉ ๋˜๊ฒŒ๋งŒ ํ•œ๋‹ค.

controller

์ด๋ ‡๊ฒŒ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผํ•ด์„œ json์„ ๋„˜๊ฒจ์ฃผ๋ฉด๋œ๋‹ค.

์ค‘์š” ํฌ์ธํŠธ

  • jsonํ˜•ํƒœ๊ฐ€ ์ค‘์š”ํ–ˆ๋‹ค. ์ž˜๋ชปํ•˜๋ฉด ๋™์ž‘์ด ๋˜์ง€ ์•Š์•˜๋‹ค.

    • ์ •ํ™•ํžˆ "\"" ์œผ๋กœ ํ•ด์•ผํ•œ๋‹ค. "'"๋กœ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

์ผ๋‹จ ๊ธ‰ํ•˜๊ฒŒ ์ •๋ฆฌํ•œ๊ฑฐ๋Š” ์—ฌ๊ธฐ๊นŒ์ง€

๊ฒฐ๋ก 

dynamic inventory๋ฅผ ๋งŒ๋“ค์–ด์„œ db์—์„œ ๊ฐ’์„ ์ฝ์–ด์™€์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ œ๋ถ€ํ„ฐ๋Š” ๋””๋น„์— ํ˜ธ์ŠคํŠธ ์ •๋ณด๋งŒ ์ž˜ ์ ์–ด๋‘๋ฉด ์–ธ์ œ๋‚˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ์กด์— ์žˆ๋˜ cli์— ์œ„ ๊ธฐ๋Šฅ๋งŒ ์ถ”๊ฐ€ํ•˜์—ฌ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

json.Append("{\"_meta\": {\"hostvars\":{}},"); ์ด๋ถ€๋ถ„์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ถ€๋ถ„์ธ๋ฐ ์ด๋ถ€๋ถ„์ด ์—†์œผ๋ฉด ansible์ด ๋ชจ๋“  ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•ด์„œ --host๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๋งž๋Š”๊ฒฝ์šฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—„์ฒญ ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

c#์—์„œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ทธ๊ฑธ json์œผ๋กœ ๋ณ€๊ฒฝ์•ˆํ•œ ์ด์œ ๋Š” ์ผ๋‹จ ์ด๊ฒŒ ํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๊ธฐ๋„ ์ž‡์ง€๋งŒ ansible inventory json์ด ์ข€ ์ด์ƒํ•ด์„œ ๊ทธ๋ฃน์ด๋ฆ„์„ json์— key๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒฝ์šฐ๊ฐ€ ์ž‡๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํด๋ž˜์Šค์— ๋ณ€์ˆ˜๋ช…์„ ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ๊ทธ๋ฃน์ด๋ฆ„์ด ๋™์ ์ด๋ผ. ํด๋ž˜์Šค ์ด๋ฆ„์„ ๋™์ ์œผ๋กœ ์ง€์ •ํ• ์ˆ˜๊ฐ€ ์—†์–ด์„œ ์ผ๋‹จ ์ŠคํŠธ๋ง์œผ๋กœ ์ผ๋‹จ ๋˜๊ฒŒ๋งŒ ํ–‡๋‹ค. ์ด๋Ÿฐ์‹์˜ ๊ทธ๋ฃน๋„ค์ž„์„ ๋ณ€์ˆ˜์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ• ์ˆ˜๊ฐ€ ์—†๋‹ค. ๊ทธ๋ฃน์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค ํด๋ž˜์Šค๊ฐ€ ๋ฐ”๋€Œ์–ด์•ผํ•˜๋ฏ€๋กœ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€์•Š๊ณ  ๊ทธ๋ƒฅ string์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

children์—์„œ๋Š” ๊ผญ ๊ทธ๋ฃน๋งŒ ๋‚˜์™€์•ผํ•œ๋‹ค. ๊ทธ๋ฃน์ด ์•„๋‹Œ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋‚˜์˜ค๋ฉด ์•ˆ๋œ๋‹ค.. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ ํ˜•ํƒœ์—ฌ์•ผํ•œ๋‹ค. all -> ๊ทธ๋ฃน๋“ค์ด ๋‹ค ๋‚˜์˜ค๊ณ  -> ๊ทธ๋ฃน๋“ค์„ ์•„๋ž˜์—์„œ ๋‹ค์‹œ ์ •์˜ํ•œํ›„ -> hosts๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋“  host๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. all -> children -> ๊ทธ๋ฃน -> hosts๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ์™œ ๊ทธ๋Ÿฐ์ง€ ๋ชจ๋ฅด๊ฒŸ๋‹ค.

https://teamsmiley.gitbook.io/devops/go-lang/create-cli