Control node: any Python-capable system (Linux/macOS/Windows); manages Linux, Windows, network gear, clouds (AWS/Azure/GCP), containers, virtually anywhere via SSH/WinRM; global enterprise adoption.
How to use Ansible?
Write YAML playbooks (desired state) + inventory → run ansible-playbook → control node pushes/executes temporary Python modules over SSH/WinRM → idempotent changes, no agents left behind.
----name:Configure Web Serverhosts:webserversbecome:yesgather_facts:yesvars:nginx_port:80app_user:www-datatasks:-name:Install Nginxapt:name:nginxstate:present-name:Start Nginxsystemd:name:nginxstate:startedenabled:yes
Multiple Plays
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
----name:Configure Web Servershosts:webserverstasks:-name:Install Nginxapt:name:nginxstate:present-name:Configure Databasehosts:dbserverstasks:-name:Install PostgreSQLapt:name:postgresqlstate:present
# Copy file-name:Copy filecopy:src:/local/path/file.confdest:/remote/path/file.confowner:rootgroup:rootmode:'0644'# Template file-name:Configure Nginxtemplate:src:nginx.conf.j2dest:/etc/nginx/nginx.confbackup:yes# Create directory-name:Create directoryfile:path:/opt/appstate:directorymode:'0755'# Create file-name:Create filefile:path:/tmp/test.txtstate:touchmode:'0644'# Line in file-name:Add line to filelineinfile:path:/etc/hostsline:'192.168.1.10example.com'state:present# Block in file-name:Add blockblockinfile:path:/etc/ssh/sshd_configblock:|Match User ansibleForceCommand /usr/bin/falsemarker:"#{mark}ANSIBLEMANAGEDBLOCK"
Service Management
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Systemd-name:Start servicesystemd:name:nginxstate:startedenabled:yes-name:Restart servicesystemd:name:nginxstate:restarted# Service (generic)-name:Start serviceservice:name:nginxstate:startedenabled:yes
User Management
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Create user-name:Create useruser:name:appuseruid:1000group:appgroupshell:/bin/bashhome:/home/appusercreate_home:yes# Add user to group-name:Add user to groupuser:name:appusergroups:dockerappend:yes
Command Execution
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Shell command-name:Run commandshell:|cd /opt/app./setup.shargs:creates:/opt/app/.installed# Command (safer, no shell)-name:Run commandcommand:/usr/bin/script.sh arg1 arg2# Raw command-name:Install Pythonraw:apt-get install -y python3
# When condition-name:Install on Debianapt:name:nginxwhen:ansible_os_family == "Debian"-name:Install on RedHatyum:name:nginxwhen:ansible_os_family == "RedHat"# Multiple conditions-name:Install packageapt:name:nginxwhen:-ansible_os_family == "Debian"-ansible_distribution_version == "22.04"# Check if file exists-name:Copy configcopy:src:config.confdest:/etc/config.confwhen:config_file is defined
# Simple loop-name:Install packagesapt:name:""state:presentloop:-nginx-mysql-redis# Loop with dictionary-name:Create usersuser:name:""uid:""loop:-{name:user1,uid:1001}-{name:user2,uid:1002}# Loop with condition-name:Install packagesapt:name:""loop:""when:item is not skipped
# Debug variables-name:Debug variabledebug:msg:""-name:Debug all varsdebug:var:hostvars[inventory_hostname]# Pause for debugging-name:Pausepause:prompt:"PressEntertocontinue"