SSD Nodes Learn Hosting plans →
మార్గదర్శకాలు Matt Connorద్వారా Matt Connor · అప్‌డేట్ చేయబడింది 2026-08-01

Ubuntu 24.04 VPS కోసం Ansible మొదటి playbook

Ubuntu 24.04లో pipxతో Ansible ఇన్‌స్టాల్ చేసి inventory, మొదటి playbook రాయండి. fresh VPSను harden చేసే విధానం, Permission denied మరియు sudo errors పరిష్కారాలు ఇందులో ఉన్నాయి.

మీరు రూపొందించేది

Ansible ఇన్‌స్టాల్ చేసిన ఒక నియంత్రణ యంత్రం, అలాగే stock image తప్ప మరేమీ లేని ఒకటి లేదా అంతకంటే ఎక్కువ తాజా Ubuntu 24.04 VPSలు. చివరికి, మీ సర్వర్ల పేర్లను పేర్కొనే inventory ఫైల్, authentication end-to-end పనిచేస్తుందని నిర్ధారించే ad-hoc ping, మరియు కొత్త VPS కోసం మొత్తం checklistను codeగా అమలు చేసే playbook మీ వద్ద ఉంటాయి: మీ SSH keyతో deploy user, బలోపేతం చేసిన sshd, fail2ban, unattended upgrades, అలాగే మిగతా అన్నింటినీ నిరాకరించే ముందు OpenSSHను అనుమతించే firewall. దీన్ని ఒక సర్వర్‌కు లేదా ఇరవై సర్వర్లకు సూచించండి. దీన్ని రెండుసార్లు అమలు చేస్తే, రెండోసారి ఏ మార్పూ జరగదు. ఇదే మొత్తం ఉద్దేశ్యం.

VPSలను provision చేస్తూ పదిహేనేళ్ల అనుభవం తర్వాత నేను చెప్పగల నిజమైన పద్ధతి ఇదే: ప్రతి ఒక్కరూ మొదటి ఐదు సర్వర్లను చేతితో సెటప్ చేస్తారు. ఆ తర్వాత ఆరవ సర్వర్‌పై ఒక వారాంతాన్ని కోల్పోతారు, ఎందుకంటే మొదటి ఐదు సర్వర్లలో ఏమి చేశారో ఎవరికీ గుర్తుండదు. ఈ మార్గదర్శకం బహుళ Linux సర్వర్ల నిర్వహణపై ఉన్న సర్వేను మరింత విస్తరిస్తుంది. ఒకే apt installను మూడు terminalsలో టైప్ చేస్తున్నట్టు మీకు అనిపించిన రోజున దీన్ని ప్రారంభించండి.

Ansible అంటే వాస్తవానికి ఏమిటి: ఒక పేరాలో

Ansible agentless. ఇది నిర్వహించే serversలో daemonను install చేయాల్సిన అవసరం లేదు: control machine సాధారణ SSH ద్వారా connect అవుతుంది, చిన్న Python moduleను targetకు copy చేస్తుంది, దాన్ని execute చేస్తుంది, అది print చేసే JSONను read చేస్తుంది, ఆ తర్వాత దాన్ని delete చేస్తుంది. Targetకు అవసరమైన ఏకైక అంశం python3. ప్రతి stock Ubuntu imageలో ఇది ఇప్పటికే ఉంటుంది. ముఖ్యమైన పదం idempotent. దీని అర్థం సులభం: ఒక task చర్యను కాకుండా ఒక stateను వివరిస్తుంది. ఒక package కోసం state: present అంటే "ఇది install అయి ఉందని నిర్ధారించు", "installerను run చేయి" అని కాదు. ఆ state ఇప్పటికే ఉంటే, Ansible ఎలాంటి మార్పు చేయదు మరియు దాన్ని okగా report చేస్తుంది; changedగా కాదు. ఇదే లక్షణం మొత్తం productకు కేంద్రం. Playbookను మళ్లీ run చేయడం సురక్షితంగా ఉండటానికి ఇదే కారణం. సురక్షితమైన పునఃరన్‌ల వల్లే shell script infrastructureగా మారుతుంది.

ముందస్తు అవసరాలు మరియు ప్రారంభంలో గుర్తుంచుకోవాల్సిన అంశాలు

  • ఒక నియంత్రణ యంత్రం: మీ ల్యాప్‌టాప్ లేదా చిన్న VPS. Ubuntu 24.04 అని భావిస్తున్నాను; Homebrew నుంచి pipx ఇన్‌స్టాల్ చేసిన తర్వాత macOS కూడా ఇదే విధంగా పనిచేస్తుంది.
  • KVMపై Ubuntu 24.04 నడుస్తున్న, rootగా చేరుకోగల ఒకటి లేదా అంతకంటే ఎక్కువ లక్ష్య VPSలు. వాటిలో ఏదీ ఇన్‌స్టాల్ చేయబడదు.
  • ప్రతి లక్ష్యానికి SSH key ప్రామాణీకరణ ఉండాలి. Ansible మీ ssh ఆదేశంలో ఉన్న ప్రామాణీకరణ విధానాన్నే ఉపయోగిస్తుంది. ssh root@host పాస్‌వర్డ్ కోసం అడిగితే, Ansible విఫలమవుతుంది.
  • Ubuntu 24.04లో pip install ansible, error: externally-managed-environmentతో విఫలమవుతుంది. ఇది ఉద్దేశపూర్వక distro విధానం; లోపం కాదు. pipx ఉపయోగించండి.
  • YAMLలో ఖాళీ స్థలాల అమరిక కూడా syntaxలో భాగమే. తప్పు indent వల్ల mapping values are not allowed in this context వస్తుంది. ఎక్కడైనా tab character ఉంటే ప్రక్రియ విఫలమవుతుంది.
  • playbook, sshdను మరింత భద్రపరుస్తున్న సమయంలో ప్రతి లక్ష్యంపై పనిచేస్తున్న SSH sessionను తెరిచి ఉంచండి. నేను కస్టమర్‌కు పునరుద్ధరించడంలో సహాయపడిన ప్రతి lockoutలో, "clean నుంచి పరీక్షించడానికి" చివరి sessionను మూసివేయడం కారణమైంది.

దశ 1: pip కాకుండా pipxతో కంట్రోల్ మెషీన్‌లో Ansibleని ఇన్‌స్టాల్ చేయండి

సాధారణంగా pip3 install ansible అని ప్రయత్నిస్తారు. పూర్తిగా కొత్త 24.04 ఇమేజ్‌లో అది ఒక దశ ముందే విఫలమవుతుంది: Command 'pip3' not found, but can be installed with: sudo apt install python3-pip. pipని ఇన్‌స్టాల్ చేసినా, మీరు అసలు సమస్యను మాత్రమే ఎదుర్కొంటారు:

pip3 install ansible
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.

Ubuntu 24.04 సిస్టమ్ Pythonను externally managedగా గుర్తిస్తుంది (PEP 668). అందువల్ల ఒకే ఫైళ్లపై pip మరియు apt పరస్పరం జోక్యం చేసుకోలేవు. --break-system-packagesను ఉపయోగించవద్దు. ఆ flag పేరు దాని ఉద్దేశాన్ని స్పష్టంగా చెబుతుంది. సరైన పరిష్కారం pipx. ఇది Ansible కోసం వేరుచేసిన virtualenvను సృష్టించి, binariesను మీ PATHలో ఉంచుతుంది:

sudo apt update && sudo apt install -y pipx
pipx ensurepath
pipx install --include-deps ansible

pipx ensurepath అమలు చేసిన తర్వాత కొత్త shellను తెరవండి, damit PATHలో మార్పు వర్తిస్తుంది. --include-deps అలంకార సమాచారం కాదు. ansible packageకి స్వంత console scripts ఏవీ లేవు; ansible, ansible-playbook మరియు మిగతావి దాని ansible-core dependencyకి చెందిన entry points. అందువల్ల ఆ flag లేకపోతే pipx No apps associated with package ansible or its dependenciesతో installను తిరస్కరిస్తుంది. అలాగే bare ansible-core కాకుండా ansible packageను ఇన్‌స్టాల్ చేయండి. పూర్తి packageలో community collections ఉంటాయి. ఈ playbook వాటిలోని రెండు collections (ansible.posix మరియు community.general) నుంచి modulesను ఉపయోగిస్తుంది.

ansible --version

సరైన ఫలితం ansible [core 2.19.x] వంటి lineతో ప్రారంభమై, అది అమలు చేస్తున్న Pythonను చూపిస్తుంది. ఇక్కడి పనులకు ప్రస్తుతం అందుబాటులో ఉన్న ఏదైనా core release సరిపోతుంది. ansible: command not found కనిపిస్తే, ~/.local/bin ఇంకా మీ PATHలో లేదని అర్థం. కొత్త shellను తెరవండి లేదా source ~/.bashrc అమలు చేయండి.

ఇంతే install ప్రక్రియ. targetsపై ఏదీ ఇన్‌స్టాల్ చేయబడదు.

దశ 2: ప్రతి లక్ష్యానికి SSH key యాక్సెస్

ssh-keygen -t ed25519 -C "ansible control"
ssh-copy-id root@10.0.0.10
ssh-copy-id root@10.0.0.20

తర్వాత ప్రతి host కోసం ఒక్కసారి దీనిని నిర్ధారించండి:

ssh root@10.0.0.10 true && echo ok

ఈ ఒక్క లైన్ రెండు పనులు చేస్తుంది: password లేకుండా key auth పనిచేస్తోందని నిర్ధారిస్తుంది. అలాగే ఇది host keyని known_hostsలో నమోదు చేస్తుంది. దీన్ని ఇప్పుడే చేయండి. ఎందుకంటే Ansible నమోదు చేయని host keyని run మధ్యలో కనిపించే interactive promptగా చూపిస్తుంది. అది సరిగ్గా hang అయినట్లుగా కనిపిస్తుంది.

దశ 3: inventory, ముందుగా INI, పెరిగినప్పుడు YAML

inventory అనేది Ansible యాక్సెస్ చేయగల మెషీన్‌లను జాబితా చేసే టెక్స్ట్ ఫైల్. కొత్త project directoryలో inventory.ini ను సృష్టించండి:

[vps]
web1 ansible_host=10.0.0.10
web2 ansible_host=10.0.0.20

[vps:vars]
ansible_user=root

web1 మీరు ఎంచుకునే alias. Outputలో కనిపించేది, అలాగే --limit web1 తో target చేసేది ఇదే. ansible_host అసలు address. [vps] ఒక group. ఆ groupలోని ప్రతి hostకు variablesను [vps:vars] సెట్ చేస్తుంది; Ansible ఏ userగా login అవుతుందో ansible_user నిర్దేశిస్తుంది. దాని పక్కన ansible.cfg ను ఉంచండి. అప్పుడు మీరు మళ్లీ -i ను టైప్ చేయాల్సిన అవసరం ఉండదు:

[defaults]
inventory = inventory.ini

Ansible ప్రస్తుత directory నుంచి ansible.cfg ను చదువుతుంది. ఇదే inventoryని YAMLలో ఉపయోగించాలంటే inventory.yml గా save చేసి, బదులుగా ansible.cfg ను ఆ పేరుకు point చేయండి. ప్రతి hostకు అనేక variables ఉన్నప్పుడు మీరు ఈ విధానాన్ని ఎంచుకుంటారు:

vps:
  hosts:
    web1:
      ansible_host: 10.0.0.10
    web2:
      ansible_host: 10.0.0.20
  vars:
    ansible_user: root

రెండూ సమానమైనవే. రెండు servers ఉన్నప్పుడు INIని సులభంగా పరిశీలించవచ్చు; ఇరవై servers ఉన్నప్పుడు YAML మెరుగ్గా విస్తరిస్తుంది. ఒకదాన్ని ఎంచుకుని, దాని గురించి ఇక ఆలోచించకండి.

దశ 4: ad-hoc ఆదేశాలు, ప్రతిదీ పనిచేస్తుందని నిర్ధారించే ఆకుపచ్చ pong

ansible all -m ping

ఇది ICMP కాదు. ping module పూర్తి పరీక్షను నిర్వహిస్తుంది: SSH login, module copy, లక్ష్యంపై Python execution, cleanup. సరైన ఫలితం ఆకుపచ్చగా ఉంటుంది. ప్రతి host కోసం ఒక block కనిపిస్తుంది:

web1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

ఆకుపచ్చ SUCCESS అంటే authentication, Python interpreter, transport అన్నీ పనిచేస్తున్నాయని అర్థం. Playbook కూడా పనిచేస్తుంది. ఎరుపు UNREACHABLE! అంటే ఏ module అమలు కాకముందే transport విఫలమైందని అర్థం. ఖచ్చితమైన string మరియు పరిష్కారం దిగువ failure modes విభాగంలో ఉన్నాయి. తెలుసుకోవాల్సిన మరో రెండు ad-hoc ఆదేశాలు:

ansible all -a "uptime"
ansible all -m apt -a "update_cache=true upgrade=dist" --become

Ad-hoc ఆదేశాలు ఒక్కసారి చేసే పనులు మరియు తనిఖీల కోసం ఉపయోగించాలి. మీరు రెండుసార్లు అమలు చేసే ఏ పనినైనా playbook‌లో ఉంచాలి.

దశ 5: మొదటి playbook, కొత్త VPS checklistని codeగా రూపొందించడం

కొత్త serverలో మొదటి 10 నిమిషాల్లో చేతితో చేసే పనులన్నీ ఇవే. దీన్ని site.ymlగా సేవ్ చేయండి:

---
- name: Baseline a fresh Ubuntu VPS
  hosts: vps
  become: true

  vars:
    deploy_user: deploy
    deploy_pubkey: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}"
    baseline_packages:
      - fail2ban
      - unattended-upgrades
      - ufw
    baseline_services:
      - fail2ban
      - unattended-upgrades

  tasks:
    - name: Create the deploy user
      ansible.builtin.user:
        name: "{{ deploy_user }}"
        groups: sudo
        append: true
        shell: /bin/bash

    - name: Install the deploy user's SSH key
      ansible.posix.authorized_key:
        user: "{{ deploy_user }}"
        key: "{{ deploy_pubkey }}"

    - name: Passwordless sudo for the deploy user
      ansible.builtin.copy:
        dest: /etc/sudoers.d/deploy
        content: "{{ deploy_user }} ALL=(ALL) NOPASSWD:ALL\n"
        mode: "0440"
        validate: /usr/sbin/visudo -cf %s

    - name: Install baseline packages
      ansible.builtin.apt:
        name: "{{ baseline_packages }}"
        state: present
        update_cache: true

    - name: Enable and start baseline services
      ansible.builtin.service:
        name: "{{ item }}"
        state: started
        enabled: true
      loop: "{{ baseline_services }}"

    - name: Harden sshd with a drop-in
      ansible.builtin.copy:
        dest: /etc/ssh/sshd_config.d/00-hardening.conf
        content: |
          PasswordAuthentication no
          KbdInteractiveAuthentication no
          PermitRootLogin prohibit-password
          X11Forwarding no
        mode: "0644"
        validate: /usr/sbin/sshd -t -f %s
      notify: Restart ssh

    - name: Allow OpenSSH through ufw
      community.general.ufw:
        rule: allow
        name: OpenSSH

    - name: Enable ufw with default deny
      community.general.ufw:
        state: enabled
        policy: deny

  handlers:
    - name: Restart ssh
      ansible.builtin.service:
        name: ssh
        state: restarted

కేవలం కాపీ చేయడం కాకుండా అర్థం చేసుకోవాల్సిన పంక్తులు:

Variables vars: కింద ఉంటాయి. వాటిని "{{ deploy_user }}"తో సూచిస్తారు. విలువ braceతో ప్రారంభమైతే మొత్తం expressionను quote చేయండి. లేకపోతే YAML parser దాన్ని తప్పుగా చదువుతుంది. lookup('file', ...) runtimeలో control machine నుంచి మీ public keyని చదువుతుంది. అందువల్ల playbookలో key material ఉండదు.

Loop. loop: "{{ baseline_services }}" ప్రతి item కోసం service taskను ఒక్కసారి అమలు చేస్తుంది. Outputలో ప్రతి item ప్రత్యేక పంక్తిలో కనిపిస్తుంది. apt task మొత్తం package listను ఒకేసారి తీసుకుంటుంది. Packages కోసం ఒక apt transaction వేగంగా ఉంటుంది. ఇదే సిఫారసు చేయబడిన విధానం. ఒక్కో అంశంపై నిజంగా ఒక్కసారి మాత్రమే పనిచేసే modules కోసం loops ఉపయోగించండి.

Handler అర్థం చేసుకోవాల్సిన ముఖ్యమైన భావన. notify: Restart ssh అంటే "ఇప్పుడే sshని restart చేయండి" అని కాదు. అది handlerను queue చేస్తుంది. Handler play ముగిసినప్పుడు ఒక్కసారి మాత్రమే నడుస్తుంది. Notify చేసిన task నిజంగా changedని report చేసినప్పుడే అది నడుస్తుంది. రేపు playbookను మళ్లీ అమలు చేయండి. Drop-in file ఇప్పటికే సరైనదిగా ఉంటుంది. Copy task okని report చేస్తుంది. sshd restart చేయబడదు. validate: పంక్తి triggerకు safety checkగా పనిచేస్తుంది. పాత configurationను మార్చే ముందు sshd fileను తనిఖీ చేస్తుంది. అందువల్ల typo ఉంటే task విఫలమవుతుంది, daemon పనిచేయకుండా పోదు.

PermitRootLogin prohibit-password, no కాదు — ఉద్దేశపూర్వకంగా. ఈ playbook keyతో rootగా login అవుతుంది. prohibit-password passwordతో చేసే root loginsను నిలిపివేస్తుంది. మీ ప్రస్తుత login మాత్రం కొనసాగుతుంది. Deploy user పనిచేస్తున్నట్లు నిర్ధారించిన తర్వాత, ssh deploy@10.0.0.10 sudo trueను ఉపయోగించండి — plain address, ఎందుకంటే web1 Ansibleకు మాత్రమే తెలిసిన alias — inventoryలో ansible_user=deployకు మార్చండి. తరువాతి runలో దాన్ని noగా కఠినతరం చేయండి. మీరు serverకు దూరంగా lock out కాకుండా hardeningను సరైన క్రమంలో చేయండి.

00- prefix ముఖ్యమైనది. చాలా keywords విషయంలో sshd parse చేసే మొదటి occurrenceనే అనుసరిస్తుంది. Ubuntu యొక్క sshd_config lexical orderలో స్వంత bodyకి ముందు sshd_config.d/*.confను చేర్చుతుంది. Ubuntu 24.04 cloud imagesలో ఆ directoryలో ఇప్పటికే 60-cloudimg-settings.conf ఉంటుంది. Cloud-init ద్వారా password loginsను enable చేసే providers 50-cloud-init.confను PasswordAuthentication yesతో చేర్చుతారు. మన fileకు 00-hardening.conf అని పేరు పెట్టడం వల్ల అది ముందుగా sort అవుతుంది. అందువల్ల ఈ రెండింటినీ అధిగమించి మన configuration అమలవుతుంది.

Task order firewall safetyను నిర్ణయిస్తుంది. Deny policyతో Allow OpenSSH, Enable ufw కంటే ముందు నడుస్తుంది. Ansible tasksను జాబితాలో ఉన్న క్రమంలోనే అమలు చేస్తుంది. కాబట్టి wall పైకి ఎగరడానికి ముందు అవసరమైన hole ఉంటుంది. ఇక్కడ ఉపయోగకరంగా ఉండటానికి fail2banకు అదనపు configuration అవసరం లేదు. Ubuntu defaultsలో sshdను స్వయంచాలకంగా monitor చేస్తుంది. Jails వాస్తవంగా ఏమి చేస్తాయో, ఏమి tune చేయాలో Ubuntu 24.04లో fail2ban guideలో వివరించాం.

దశ 6: --checkతో డ్రై రన్ చేసి, ఆపై వాస్తవంగా అమలు చేయండి

ansible-playbook site.yml --check

Check mode కనెక్ట్ అయి, ఇది ఏం చేస్తుందో లెక్కిస్తుంది. కానీ ఎలాంటి మార్పులు చేయదు. దిగువన ఉన్న PLAY RECAP లోని changed= సంఖ్యను చూడండి. ప్రతి hostను మార్చే పనుల సంఖ్య అదే. ఒక ముఖ్యమైన పరిమితి ఉంది. తరువాతి task, ముందరి task చేసిన మార్పులపై ఆధారపడినప్పుడు ఈ పరిమితి కనిపిస్తుంది. Ubuntu యొక్క ప్రామాణిక server imageలో ufw ముందుగానే ఉంటుంది. అందువల్ల ఈ playbook డ్రై రన్ లోపాలు లేకుండా పూర్తవుతుంది. అయితే ufw లేని minimal imageలో ufw tasks check modeలో విఫలమవుతాయి. కారణం, check mode packageను వాస్తవంగా install చేయదు. అందువల్ల moduleకు call చేయడానికి ఏదీ ఉండదు. ఇది డ్రై రన్‌ల పరిమితి. మీ playbookలోని bug కాదు. ప్లాన్ సరిగ్గా కనిపిస్తే:

ansible-playbook site.yml

ప్రతి task ప్రతి hostకు ఒక lineను ముద్రిస్తుంది. changed పసుపు రంగులో, ok ఆకుపచ్చ రంగులో కనిపిస్తుంది. Recap ఇలా ఉండాలి:

PLAY RECAP *********************************************************************
web1 : ok=10  changed=9  unreachable=0  failed=0  skipped=0  rescued=0  ignored=0
web2 : ok=10  changed=9  unreachable=0  failed=0  skipped=0  rescued=0  ignored=0

పది ok అంటే fact-gathering, ఎనిమిది tasks, అలాగే handler. మీ changed నాది కంటే ఒకటి లేదా రెండు తేడాగా ఉండవచ్చు. Ubuntu యొక్క ప్రామాణిక imageలో ufw మరియు unattended-upgrades ముందుగానే ఉంటాయి. అలాగే apt వాటిని install చేసిన వెంటనే fail2ban స్వయంగా ప్రారంభమవుతుంది. అందువల్ల మొదటి runలోనే ఒక task ok అని నివేదించడం సమంజసం. అంటే task ప్రకటించే state ఇప్పటికే అమల్లో ఉందని అర్థం. సున్నాగా ఉండాల్సిన సంఖ్యలు unreachable మరియు failed. become: true గురించి ఒక విషయం: మీరు rootగా కనెక్ట్ అవుతున్నంత వరకు ఇది కేవలం ఒక అధికారిక తనిఖీ మాత్రమే. కానీ ansible_user ను deploy కు మార్చిన వెంటనే sudo వాస్తవంగా ఉపయోగించబడుతుంది. ఈ playbook install చేసే NOPASSWD sudoers file వల్లే -K మీ command lineలో కనిపించదు. అది లేకపోతే Missing sudo password వస్తుంది. దీని వివరణ కింద ఉంది.

దశ 7: దీన్ని రెండుసార్లు అమలు చేయండి, idempotence ఇలా ఉంటుంది

అదే command‌ను వెంటనే మళ్లీ అమలు చేయండి:

web1 : ok=9  changed=0  unreachable=0  failed=0  skipped=0  rescued=0  ignored=0

changed=0 మరియు ok ఒకటి చొప్పున తగ్గాయి, ఎందుకంటే తెలియజేయని handler ఎప్పుడూ అమలు కాలేదు. ఏదీ మళ్లీ install కాలేదు, sshd restart కాలేదు, ufw‌ను మార్చలేదు. Playbook provisioner మాత్రమే కాకుండా audit సాధనంగా కూడా పనిచేసేది ఇదే కారణంగా: వచ్చే నెల inventoryకి web3ను జోడించి మళ్లీ అమలు చేస్తే, కొత్త box నిర్మించబడుతుంది, పాత boxes ధృవీకరించబడతాయి. మీరు మార్చని boxలో nonzero changed కనిపిస్తే, అది drift. Playbookలో మార్చాల్సినదాన్ని ఎవరో చేతితో మార్చారని ఇది సూచిస్తుంది.

ఇక్కడి నుంచి ఈ విధానం మరింత విస్తరిస్తుంది. రాయదగిన తదుపరి playbook, అదే VPSలో WireGuard VPNను ఏర్పాటు చేసి, SSHకు tunnel ద్వారా మాత్రమే సమాధానం వచ్చేలా ufw rule‌ను కఠినతరం చేస్తుంది. ఆ తర్వాత ప్రతి app serverలో Docker మరియు Composeను install చేసే playbook రాయండి. site.yml మూడు screens దాటితే దాన్ని rolesగా విభజించండి, కానీ అంతకు ముందు కాదు.

మీరు చూడగలిగే స్ట్రింగ్‌లతో వైఫల్య పరిస్థితులు

Permission denied తో UNREACHABLE.

web1 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: root@10.0.0.10: Permission denied (publickey).",
    "unreachable": true
}

ఏ module అమలు కాకముందే SSH transport విఫలమైంది: ansible_user తప్పుగా ఉంది, key ఆ host‌కు ఎప్పుడూ copy కాలేదు, లేదా తప్పు key అందించబడుతోంది. సాధారణ ssh root@10.0.0.10 తో మళ్లీ పరీక్షించండి. అందించబడిన keyలు ఏవో చూడటానికి తర్వాత ssh -v అమలు చేయండి. Password SSH పనిచేసి, Ansible పనిచేయకపోతే, మీరు ssh-copy-id ను ఉపయోగించలేదు.

sudo password లేదు.

web1 | FAILED! => {
    "msg": "Missing sudo password"
}

మీరు become: true ను సెట్ చేసి, root కాని userగా కనెక్ట్ అయ్యారు. ఆ userకు sudo కోసం password అవసరం. కమాండ్ లైన్‌లో -K (--ask-become-pass) జోడించండి, లేదా ఆ userకు NOPASSWD sudoers entry ఇవ్వండి. ఇదే కారణంగా playbook, మీరు ఆ userకు మారకముందే, deploy కోసం ఒక entryని install చేస్తుంది.

error: externally-managed-environment. మీరు Ubuntu 24.04లోని system Pythonపై pip అమలు చేశారు. ఇది step 1లో వివరించబడింది: pip కాదు, pipx ఉపయోగించాలి; --break-system-packages కూడా ఉపయోగించకూడదు.

mapping values are not allowed in this context.

ERROR! Syntax Error while loading YAML.
  mapping values are not allowed in this context

దాదాపు ఎల్లప్పుడూ indentation సమస్యే కారణం: key తప్పు స్థాయిలో ఉంది, లేదా colon తర్వాత space లేదు. చూపబడిన line number తప్పు ఉన్న చోటును కాకుండా, దాని సమీపంలోని స్థానాన్ని సూచిస్తుంది. కాబట్టి దాని ముందు ఉన్న lineనూ తనిఖీ చేయండి. దీనికి సంబంధించిన found character '\t' that cannot start any token లో tab చేరిందని అర్థం; YAMLలో tabలు అనుమతించబడవు. ప్రతి runకు ముందు ansible-playbook site.yml --syntax-check అమలు చేయడం అలవాటుగా చేసుకోండి. YAML కోసం మీ editorలో two-space indentation సెట్ చేయండి.

/usr/bin/python3: not found. ప్రామాణిక Ubuntu 24.04 imagesలో ఇది అరుదు. Minimal లేదా netboot imagesలో ఇది సాధారణం. Targetలో Python లేకపోవడం వల్ల module execution విఫలమవుతుంది. raw moduleతో దాన్ని bootstrap చేయండి. Remote hostలో ఏదీ అవసరం లేని ఏకైక module ఇదే: ansible all -m raw -a "apt-get update && apt-get install -y python3" --become. తర్వాత playbookను మళ్లీ అమలు చేయండి.

FAQ

నేను నిర్వహించే serversలో Ansibleని install చేయాలా?

లేదు. Ansible agentless. Control machine చిన్న Python modulesను SSH ద్వారా పంపి, వాటిని run చేసి, తొలగిస్తుంది. Targetకు python3 మరియు SSH access మాత్రమే అవసరం. ఇవి రెండూ సాధారణ Ubuntu imagesలో ఇప్పటికే ఉంటాయి. ఈ guideలో జరిగే ఏకైక install మీ control machineలోనే జరుగుతుంది.

Ansible "Permission denied (publickey)" అని ఎందుకు చెబుతుంది?

Permission denied (publickey)తో ఉన్న UNREACHABLE! block అంటే Ansible ఏదైనా run చేయడానికి ముందే SSH authentication విఫలమైందని అర్థం. Inventoryలోని ansible_user మీరు నిజంగా setup చేసిన accountతో సరిపోతుందో, ఆ hostకు ssh-copy-id run చేశారో, అలాగే plain ssh user@host password లేకుండా login అవుతుందో తనిఖీ చేయండి. సాధారణ ssh commandను సరిచేసే పరిష్కారమే Ansible సమస్యను కూడా సరిచేస్తుంది. రెండూ ఒకే transportను ఉపయోగిస్తాయి.

Ansibleలో idempotent అంటే ఏమిటి?

ఒక task చేయాల్సిన actionను కాకుండా, కావలసిన stateను ప్రకటిస్తుంది: "ఈ package ఉండాలి", "ఈ fileలో ఈ line ఉండాలి". ఆ state ఇప్పటికే ఉంటే Ansible ఏమీ చేయదు. అది changedకు బదులుగా okని report చేస్తుంది. అందుకే playbookను రెండుసార్లు run చేసినప్పుడు రెండోసారి changed=0 కనిపిస్తుంది. Rerun ప్రమాదకరమైన re-install కాకుండా సురక్షితమైన auditగా ఉంటుంది.

Ubuntu 24.04లో Ansibleను install చేయడానికి pip లేదా pipx ఉపయోగించాలా?

pipx ఉపయోగించండి. Ubuntu 24.04 system Pythonను externally managedగా గుర్తిస్తుంది. అందువల్ల pip install ansible కావాలనే error: externally-managed-environmentతో fail అవుతుంది. pipx install --include-deps ansible Ansibleను ప్రత్యేక virtualenvలో ఉంచుతుంది. అలాగే ansible, ansible-playbook మరియు మిగిలిన commandsను మీ PATHలో సక్రమంగా అందుబాటులో ఉంచుతుంది.

ansible మరియు ansible-core packages మధ్య తేడా ఏమిటి?

ansible-core engineతో పాటు ansible.builtin modulesను మాత్రమే కలిగి ఉంటుంది. ansible package coreతో పాటు ఎంపిక చేసిన community collectionsను కూడా కలిగి ఉంటుంది. వీటిలో ఈ guideలో ఉపయోగించిన ansible.posix (authorized_key module) మరియు community.general (ufw module) ఉన్నాయి. మొదట పూర్తి packageతో ప్రారంభించండి. అవసరం ఉన్నప్పుడు మాత్రమే coreతో పాటు మీరు ఎంచుకున్న collectionsకు పరిమితం చేయండి.