├── vault ├── vault-pass ├── vault-pass 2 ├── inventory ├── create-user.yml └── ansible.cfg ├── lesson7 ├── vault │ ├── vault-pass │ ├── vault-pass 2 │ ├── inventory │ ├── create-user.yml │ └── ansible.cfg ├── facts │ ├── inventory │ ├── ansible1.fact │ ├── localfacts.fact │ ├── facts.yml │ ├── checkfacts.yaml │ ├── localfactcheck.yml │ ├── ansible.cfg │ ├── checkcache.py │ ├── lab6.yml │ ├── lab5.yaml │ ├── newlocalfacts.yml │ ├── ipfact.yml │ ├── addcustomfacts.yml │ ├── setupfactcache.yaml │ ├── changeconfig.yaml │ ├── localfacts.yml │ ├── ansible1_facts.txt │ └── factplay.txt └── arrays │ ├── ansible.cfg │ ├── inventory │ ├── vars │ ├── users-list │ ├── users-list 2 │ ├── users-dictionary │ └── users-dictionary 2 │ ├── multi-dictionary.yml │ └── multi-list.yml ├── ansible1.fact ├── inventory ├── roles ├── mywebhost │ ├── tests │ │ ├── inventory │ │ └── test.yml │ ├── vars │ │ └── main.yml │ ├── defaults │ │ └── main.yml │ ├── handlers │ │ └── main.yml │ ├── tasks │ │ └── main.yml │ ├── templates │ │ └── vhost.conf.j2 │ ├── .travis.yml │ ├── README.md │ └── meta │ │ └── main.yml ├── motd │ ├── defaults │ │ └── main.yml │ ├── meta │ │ └── main.yml │ ├── tasks │ │ └── main.yml │ ├── templates │ │ └── motd.j2 │ └── README.md └── requirements.yml ├── README.md ├── loopvars.yml ├── lab ├── lab-vars │ ├── allvars.yml │ └── allvars 2.yml ├── lab-inventory ├── ansible.cfg ├── custom.fact ├── lab-facts ├── lab-copy-facts.yml ├── lab-tasks │ ├── file 2.yml │ ├── file.yml │ ├── lamp 2.yml │ └── lamp.yml └── lab-playbook.yml ├── report.txt ├── vars ├── groups ├── lab12 ├── users ├── defaults ├── users-list └── users-dictionary ├── test.yaml ├── install_services.yml ├── debugme1.yml ├── facts.yml ├── sudoers.j2 ├── services.fact ├── checkfacts.yaml ├── packages.fact ├── nginx-role.yml ├── task4.yml ├── localfactcheck.yml ├── networkvars.yml ├── quicktest.yml ├── countdown ├── hostsfile.yml ├── ipfact.yml ├── user.yml ├── exercise134-vars.yaml ├── motd-role.yml ├── hosts.j2 ├── imports.yml ├── create_partition.yml ├── loop-over-variable.yml ├── tasks ├── service.yaml └── firewall.yaml ├── when_multiple.yml ├── requirements.yml ├── bonus.yaml ├── enforce-selinux.yml ├── file.yml ├── verbose_debug.yml ├── ansible.cfg ├── install-and-setup.yml ├── delete-cron-job.yml ├── setup-at-task.yml ├── lab-test.yml ├── assertstat.yml ├── changed.yml ├── assertnic.yml ├── setup-boot-target.yml ├── enforce-selinux-simplified.yml ├── register_loop.yml ├── task7file.yml ├── inventory.yml ├── loopservices.yml ├── register.yml ├── ifsize.yml ├── set-fact.yaml ├── resize-lvs.yml ├── userpw.yml ├── debugme.yml ├── failure.yml ├── uri.yml ├── multi-dictionary.yml ├── idempotentcommand.yaml ├── distro.yml ├── when_multiple_complex.yml ├── hostvars.yml ├── blocks.yml ├── setup-crontab.yml ├── vsftpd-err.yml ├── vsftpd.j2 ├── get-diskname.yml ├── lab5.yaml ├── loopusers.yml ├── restart.yml ├── listing1313.yaml ├── listing725.yaml ├── vsftpd-template.yml ├── vsftpd.yml ├── command-output-test.yml ├── register_command.yml ├── uninstall-httpd.yml ├── newlocalfacts.yml ├── multi-list.yml ├── selinux.yml ├── checkseconddisk.yml ├── apache-vhost-role.yml ├── bashversion.yml ├── packagefacts.yml ├── assertsize-wrong.yml ├── lab12-tasks.yml ├── exercise134-tasks.yaml ├── get_devices.yml ├── subscription.yml ├── assertsize.yml ├── includes-and-imports.yml ├── register_homes.yml ├── setupnewhost.yml ├── install-httpd.yml ├── addcustomfacts.yml ├── rhel_storage.yml ├── handlers.yml ├── settargetandreboot.yml ├── handlers2.yml ├── setupfactcache.yaml ├── changeconfig.yaml ├── copy.yml ├── block2.yaml ├── setup_repo.yml ├── localfacts.yml ├── copy_facts.yml ├── setup_sudo.yml ├── lab.yml ├── pascal.py ├── lesson11-lab ├── setup_repo.yml └── setup_repo_client.yml ├── setup-storage-test.yml ├── setup-storage-lvm.yml ├── setup-storage-lvm-2.yml ├── web-setup-and-test.yml ├── setup_users.yml ├── setup_repo_client.yml ├── setup-storage.yml ├── users-advanced.yml ├── users_vault.yml ├── checkseconddiskv2.yml ├── storage-advanced.yml ├── userkeys.yml ├── lab7.yml ├── software-advanced.yml ├── sept25.txt └── feb25.txt /vault/vault-pass: -------------------------------------------------------------------------------- 1 | password 2 | -------------------------------------------------------------------------------- /vault/vault-pass 2: -------------------------------------------------------------------------------- 1 | password 2 | -------------------------------------------------------------------------------- /lesson7/vault/vault-pass: -------------------------------------------------------------------------------- 1 | password 2 | -------------------------------------------------------------------------------- /lesson7/vault/vault-pass 2: -------------------------------------------------------------------------------- 1 | password 2 | -------------------------------------------------------------------------------- /ansible1.fact: -------------------------------------------------------------------------------- 1 | [whatever] 2 | type=production 3 | -------------------------------------------------------------------------------- /inventory: -------------------------------------------------------------------------------- 1 | ansible1 2 | ansible2 3 | ansible3 4 | -------------------------------------------------------------------------------- /lesson7/facts/inventory: -------------------------------------------------------------------------------- 1 | ansible2.example.com 2 | -------------------------------------------------------------------------------- /roles/mywebhost/tests/inventory: -------------------------------------------------------------------------------- 1 | localhost 2 | 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | supporting files for my RHCE9 video course 2 | -------------------------------------------------------------------------------- /lesson7/facts/ansible1.fact: -------------------------------------------------------------------------------- 1 | [whatever] 2 | type=production 3 | -------------------------------------------------------------------------------- /roles/mywebhost/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # vars file for mywebhost -------------------------------------------------------------------------------- /loopvars.yml: -------------------------------------------------------------------------------- 1 | randomstuff: 2 | - cow 3 | - goat 4 | - chicken 5 | -------------------------------------------------------------------------------- /roles/mywebhost/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # defaults file for mywebhost -------------------------------------------------------------------------------- /lab/lab-vars/allvars.yml: -------------------------------------------------------------------------------- 1 | --- 2 | web_root: /var/www/html 3 | ftp_root: /var/ftp 4 | -------------------------------------------------------------------------------- /report.txt: -------------------------------------------------------------------------------- 1 | HOSTNAME= 2 | MEMORY= 3 | SECOND_DISK= 4 | PRIMARY_DISK_SIZE= 5 | 6 | -------------------------------------------------------------------------------- /vars/groups: -------------------------------------------------------------------------------- 1 | usergroups: 2 | - groupname: sales 3 | - groupname: account 4 | -------------------------------------------------------------------------------- /lab/lab-vars/allvars 2.yml: -------------------------------------------------------------------------------- 1 | --- 2 | web_root: /var/www/html 3 | ftp_root: /var/ftp 4 | -------------------------------------------------------------------------------- /test.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: mytest 3 | hosts: all 4 | task: 5 | - name: task1 6 | 7 | -------------------------------------------------------------------------------- /install_services.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: setup lamp 3 | hosts: lamp 4 | roles: 5 | - lamp 6 | -------------------------------------------------------------------------------- /roles/motd/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # defaults file for motd 3 | system_manager: anna@example.com 4 | -------------------------------------------------------------------------------- /lesson7/facts/localfacts.fact: -------------------------------------------------------------------------------- 1 | [localfacts] 2 | package = samba 3 | service = smb 4 | state = enabled 5 | -------------------------------------------------------------------------------- /roles/mywebhost/tests/test.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: localhost 3 | remote_user: root 4 | roles: 5 | - mywebhost -------------------------------------------------------------------------------- /debugme1.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: simple debug example 3 | hosts: all 4 | tasks: 5 | - name: print debug message 6 | debug: 7 | -------------------------------------------------------------------------------- /facts.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: show facts 3 | hosts: all 4 | tasks: 5 | - name: print facts 6 | debug: 7 | var: ansible_facts 8 | -------------------------------------------------------------------------------- /sudoers.j2: -------------------------------------------------------------------------------- 1 | {% for item in sudo_groups %} 2 | {% if item.sudo %} 3 | {{ item.name}} ALL=(ALL:ALL) NOPASSWD:ALL 4 | {% endif %} 5 | {% endfor %} 6 | -------------------------------------------------------------------------------- /services.fact: -------------------------------------------------------------------------------- 1 | [services] 2 | smb_service = smbd 3 | ftp_service = vsftpd 4 | db_service = mariadb 5 | web_service = httpd 6 | firewall_service = firewalld -------------------------------------------------------------------------------- /checkfacts.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: checking the fact cache 3 | hosts: all 4 | gather_facts: False 5 | tasks: 6 | - debug: 7 | var: ansible_facts 8 | -------------------------------------------------------------------------------- /lesson7/facts/facts.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: show facts 3 | hosts: all 4 | tasks: 5 | - name: print facts 6 | debug: 7 | var: ansible_facts 8 | -------------------------------------------------------------------------------- /packages.fact: -------------------------------------------------------------------------------- 1 | [packages] 2 | smb_package = samba 3 | ftp_package = vsftpd 4 | db_package = mariadb-server 5 | web_package = httpd 6 | firewall_package = firewalld -------------------------------------------------------------------------------- /roles/mywebhost/handlers/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # handlers file for mywebhost 3 | # 4 | - name: restart httpd 5 | service: 6 | name: httpd 7 | state: restarted 8 | -------------------------------------------------------------------------------- /roles/requirements.yml: -------------------------------------------------------------------------------- 1 | # from Ansible Galaxy 2 | - src: geerlingguy.docker 3 | 4 | - src: geerlingguy.nginx 5 | version: 1.13 6 | name: nginx-1.13 7 | 8 | 9 | -------------------------------------------------------------------------------- /lab/lab-inventory: -------------------------------------------------------------------------------- 1 | [all] 2 | ansible1.example.com 3 | ansible2.example.com 4 | 5 | [lamp] 6 | ansible1.example.com 7 | 8 | [file] 9 | ansible2.example.com 10 | -------------------------------------------------------------------------------- /lesson7/facts/checkfacts.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: checking the fact cache 3 | hosts: all 4 | gather_facts: False 5 | tasks: 6 | - debug: 7 | var: ansible_facts 8 | -------------------------------------------------------------------------------- /nginx-role.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: use galaxy nginx role 3 | hosts: ansible2.example.com 4 | user: ansible 5 | become: true 6 | 7 | roles: 8 | - role: geerlingguy.nginx 9 | -------------------------------------------------------------------------------- /task4.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: configure SSH 3 | hosts: all 4 | tasks: 5 | - include_role: 6 | name: ssh-setup 7 | when: "ansible_facts['os_family'] == 'RedHat'" 8 | -------------------------------------------------------------------------------- /localfactcheck.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: show facts 3 | hosts: all 4 | tasks: 5 | - name: print facts 6 | debug: 7 | msg: "{{ ansible_facts['ansible_local']['package'] }}" 8 | -------------------------------------------------------------------------------- /lesson7/facts/localfactcheck.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: show facts 3 | hosts: all 4 | tasks: 5 | - name: print facts 6 | debug: 7 | msg: "{{ ansible_facts['ansible_local']['package'] }}" 8 | -------------------------------------------------------------------------------- /networkvars.yml: -------------------------------------------------------------------------------- 1 | --- 2 | network_provider: nm 3 | network_connections: 4 | - name: ens224 5 | type: ethernet 6 | ip: 7 | address: 8 | - 192.168.4.231/24 9 | zone: external 10 | -------------------------------------------------------------------------------- /quicktest.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: test command result 3 | hosts: all 4 | tasks: 5 | - name: check a fact 6 | debug: 7 | msg: echo today is 06 8 | when: '"07" in ansible_date_time.day' 9 | -------------------------------------------------------------------------------- /vars/lab12: -------------------------------------------------------------------------------- 1 | users: 2 | - username: sharon 3 | groups: admins 4 | - username: blair 5 | groups: admins 6 | - username: ashley 7 | groups: students 8 | - username: ahmed 9 | groups: students 10 | -------------------------------------------------------------------------------- /countdown: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | COUNTER=$1 4 | COUNTER=$(( COUNTER * 60 )) 5 | 6 | while true 7 | do 8 | echo $COUNTER seconds remaining in break 9 | COUNTER=$(( COUNTER - 1 )) 10 | sleep 1 11 | done 12 | -------------------------------------------------------------------------------- /hostsfile.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: update /etc/hosts file dynamically 3 | hosts: all 4 | tasks: 5 | - name: update /etc/hosts 6 | template: 7 | src: templates/hosts.j2 8 | dest: /etc/hosts 9 | -------------------------------------------------------------------------------- /ipfact.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: all 3 | gather_facts: yes 4 | tasks: 5 | - name: show IP address 6 | debug: 7 | msg: > 8 | This host uses IP address {{ ansible_facts.default_ipv4.address }} 9 | -------------------------------------------------------------------------------- /user.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: create a user using a variable 3 | hosts: all 4 | vars: 5 | user: lisa 6 | tasks: 7 | - name: create a user {{ user }} 8 | user: 9 | name: "{{ user }}" 10 | -------------------------------------------------------------------------------- /exercise134-vars.yaml: -------------------------------------------------------------------------------- 1 | users: 2 | - username: sharon 3 | groups: admins 4 | - username: blair 5 | groups: admins 6 | - username: ashley 7 | groups: students 8 | - username: ahmed 9 | groups: students 10 | -------------------------------------------------------------------------------- /motd-role.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: run a task before a role 3 | hosts: all 4 | pre_tasks: 5 | - name: update yum cache 6 | yum: 7 | update_cache: yes 8 | roles: 9 | - motd 10 | 11 | 12 | -------------------------------------------------------------------------------- /roles/motd/meta/main.yml: -------------------------------------------------------------------------------- 1 | galaxy_info: 2 | author: Sander van V 3 | description: your description 4 | company: your company (optional) 5 | license: license (GPLv2, CC-BY, etc) 6 | min_ansible_version: 2.5 7 | 8 | -------------------------------------------------------------------------------- /hosts.j2: -------------------------------------------------------------------------------- 1 | {% for host in groups['all'] %} 2 | {{ hostvars[host]['ansible_facts']['default_ipv4']['address']}} {{ hostvars[host]['ansible_facts']['fqdn'] }} {{ hostvars[host]['ansible_facts']['hostname'] }} 3 | {% endfor %} 4 | -------------------------------------------------------------------------------- /roles/motd/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # tasks file for motd 3 | - name: copy motd file 4 | template: 5 | src: templates/motd.j2 6 | dest: /etc/motd 7 | owner: root 8 | group: root 9 | mode: 0444 10 | -------------------------------------------------------------------------------- /vars/users: -------------------------------------------------------------------------------- 1 | --- 2 | users: 3 | - username: linda 4 | groups: sales 5 | - username: lori 6 | groups: sales 7 | - username: lisa 8 | groups: account 9 | - username: lucy 10 | groups: account 11 | -------------------------------------------------------------------------------- /vars/defaults: -------------------------------------------------------------------------------- 1 | sudo_groups: 2 | - name: developers 3 | groupid: 5000 4 | sudo: false 5 | - name: admins 6 | groupid: 5001 7 | sudo: true 8 | - name: dbas 9 | groupid: 5002 10 | sudo: false 11 | -------------------------------------------------------------------------------- /imports.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: setup apache 3 | hosts: all 4 | tasks: 5 | - name: setup apache task 6 | import_tasks: install-and-setup.yml 7 | vars: 8 | package: httpd 9 | service: httpd 10 | -------------------------------------------------------------------------------- /roles/motd/templates/motd.j2: -------------------------------------------------------------------------------- 1 | Welcome to {{ ansible_hostname }} 2 | 3 | This file was created on {{ ansible_date_time.date }} 4 | Go away if you have no business being here 5 | 6 | Contact {{ system_manager }} if anything is wrong 7 | -------------------------------------------------------------------------------- /create_partition.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: create partition 3 | hosts: lamp 4 | tasks: 5 | - name: create partition 6 | parted: 7 | device: /dev/sdb 8 | number: 1 9 | state: present 10 | part_end: 4GiB 11 | -------------------------------------------------------------------------------- /vault/inventory: -------------------------------------------------------------------------------- 1 | control.example.com 2 | ansible1.example.com 3 | ansible2.example.com 4 | 5 | [lamp] 6 | ansible1.example.com 7 | 8 | [file] 9 | ansible2.example.com 10 | 11 | [nodes:children] 12 | lamp 13 | file 14 | 15 | 16 | -------------------------------------------------------------------------------- /lesson7/vault/inventory: -------------------------------------------------------------------------------- 1 | control.example.com 2 | ansible1.example.com 3 | ansible2.example.com 4 | 5 | [lamp] 6 | ansible1.example.com 7 | 8 | [file] 9 | ansible2.example.com 10 | 11 | [nodes:children] 12 | lamp 13 | file 14 | 15 | 16 | -------------------------------------------------------------------------------- /loop-over-variable.yml: -------------------------------------------------------------------------------- 1 | - name: show loop over variable 2 | hosts: all 3 | vars_files: 4 | - loopvars.yml 5 | tasks: 6 | - name: show the working 7 | debug: 8 | msg: this is {{ item }} 9 | loop: "{{ randomstuff }}" 10 | -------------------------------------------------------------------------------- /vault/create-user.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: create a user 3 | hosts: all 4 | vars_files: 5 | - secret.yml 6 | tasks: 7 | - name: creating user 8 | user: 9 | name: "{{ username }}" 10 | password: "{{ pwhash }}" 11 | -------------------------------------------------------------------------------- /lab/ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | inventory = inventory 3 | remote_user = ansible 4 | host_key_checking = false 5 | 6 | [privilege_escalation] 7 | become = True 8 | become_method = sudo 9 | become_user = root 10 | become_ask_pass = False 11 | 12 | -------------------------------------------------------------------------------- /vault/ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | inventory = inventory 3 | remote_user = ansible 4 | host_key_checking = false 5 | 6 | [privilege_escalation] 7 | become = True 8 | become_method = sudo 9 | become_user = root 10 | become_ask_pass = False 11 | 12 | -------------------------------------------------------------------------------- /lab/custom.fact: -------------------------------------------------------------------------------- 1 | [packages] 2 | smb_package = smb 3 | ftp_package = vsftpd 4 | db_package = mariadb-server 5 | web_package = httpd 6 | 7 | [services] 8 | smb_service = smb 9 | ftp_service = vsftpd 10 | db_service = mariadb 11 | web_service = httpd 12 | -------------------------------------------------------------------------------- /lab/lab-facts: -------------------------------------------------------------------------------- 1 | [packages] 2 | smb_package = smb 3 | ftp_package = vsftpd 4 | db_package = mariadb-server 5 | web_package = httpd 6 | 7 | [services] 8 | smb_service = smb 9 | ftp_service = vsftpd 10 | db_service = mariadb 11 | web_service = httpd 12 | -------------------------------------------------------------------------------- /lesson7/vault/create-user.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: create a user 3 | hosts: all 4 | vars_files: 5 | - secret.yml 6 | tasks: 7 | - name: creating user 8 | user: 9 | name: "{{ username }}" 10 | password: "{{ pwhash }}" 11 | -------------------------------------------------------------------------------- /lesson7/arrays/ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | inventory = inventory 3 | remote_user = ansible 4 | host_key_checking = false 5 | 6 | [privilege_escalation] 7 | become = True 8 | become_method = sudo 9 | become_user = root 10 | become_ask_pass = False 11 | 12 | -------------------------------------------------------------------------------- /lesson7/arrays/inventory: -------------------------------------------------------------------------------- 1 | control.example.com 2 | ansible1.example.com 3 | ansible2.example.com 4 | ansible1 5 | 6 | [lamp] 7 | ansible1.example.com 8 | 9 | [file] 10 | ansible2.example.com 11 | 12 | [nodes:children] 13 | lamp 14 | file 15 | 16 | 17 | -------------------------------------------------------------------------------- /lesson7/facts/ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | inventory = inventory 3 | remote_user = ansible 4 | host_key_checking = false 5 | 6 | [privilege_escalation] 7 | become = True 8 | become_method = sudo 9 | become_user = root 10 | become_ask_pass = False 11 | 12 | -------------------------------------------------------------------------------- /lesson7/vault/ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | inventory = inventory 3 | remote_user = ansible 4 | host_key_checking = false 5 | 6 | [privilege_escalation] 7 | become = True 8 | become_method = sudo 9 | become_user = root 10 | become_ask_pass = False 11 | 12 | -------------------------------------------------------------------------------- /tasks/service.yaml: -------------------------------------------------------------------------------- 1 | - name: install {{ package }} 2 | yum: 3 | name: "{{ package }}" 4 | state: latest 5 | - name: start {{ service }} 6 | service: 7 | name: "{{ service }}" 8 | enabled: true 9 | state: started 10 | -------------------------------------------------------------------------------- /when_multiple.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: using multiple conditions 3 | hosts: all 4 | tasks: 5 | - package: 6 | name: httpd 7 | state: installed 8 | when: 9 | - ansible_distribution == "CentOS" 10 | - ansible_memfree_mb < 512 11 | -------------------------------------------------------------------------------- /requirements.yml: -------------------------------------------------------------------------------- 1 | collections: 2 | - name: f5networks.f5_modules 3 | source: https://cloud.redhat.com/api/automation-hub/ 4 | - name: ansible.netcommon 5 | source: https://galaxy.ansible.com 6 | - name: ciscosmb 7 | source: https://galaxy.ansible.com 8 | -------------------------------------------------------------------------------- /bonus.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: bonus lab 3 | hosts: all 4 | tasks: 5 | - name: set hostname 6 | hostname: 7 | name: "{{ inventory_hostname }}" 8 | - name: reboot servers 9 | reboot: 10 | test_command: whoami 11 | -------------------------------------------------------------------------------- /enforce-selinux.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: set SELinux to enforcing 3 | hosts: localhost 4 | gather_facts: no 5 | become: yes 6 | tasks: 7 | - name: set SELinux to enforcing 8 | ansible.posix.selinux: 9 | policy: targeted 10 | state: enforcing 11 | -------------------------------------------------------------------------------- /file.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: create a file 3 | hosts: all 4 | tasks: 5 | - name: create a file 6 | file: 7 | path: /tmp/removeme 8 | owner: ansible 9 | mode: 0640 10 | state: touch 11 | setype: public_content_rw_t 12 | -------------------------------------------------------------------------------- /vars/users-list: -------------------------------------------------------------------------------- 1 | users: 2 | - username: linda 3 | homedir: /home/linda 4 | shell: /bin/bash 5 | - username: lisa 6 | homedir: /home/lisa 7 | shell: /bin/bash 8 | - username: anna 9 | homedir: /home/anna 10 | shell: /bin/bash 11 | 12 | -------------------------------------------------------------------------------- /verbose_debug.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: test debug verbosity 3 | hosts: localhost 4 | become: false 5 | vars: 6 | showthis: this only shows when using -vv 7 | tasks: 8 | - name: showing verbosity 9 | debug: 10 | var: showthis 11 | verbosity: 2 12 | -------------------------------------------------------------------------------- /ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | inventory = inventory 3 | remote_user = ansible 4 | host_key_checking = false 5 | deprecation_warning = false 6 | 7 | [privilege_escalation] 8 | become = True 9 | become_method = sudo 10 | become_user = root 11 | become_ask_pass = False 12 | 13 | -------------------------------------------------------------------------------- /install-and-setup.yml: -------------------------------------------------------------------------------- 1 | - name: install the {{ package }} package 2 | yum: 3 | name: "{{ package }}" 4 | state: latest 5 | - name: start the {{ service }} service 6 | service: 7 | name: "{{ service }}" 8 | enabled: true 9 | state: started 10 | -------------------------------------------------------------------------------- /lesson7/arrays/vars/users-list: -------------------------------------------------------------------------------- 1 | users: 2 | - username: linda 3 | homedir: /home/linda 4 | shell: /bin/bash 5 | - username: lisa 6 | homedir: /home/lisa 7 | shell: /bin/bash 8 | - username: anna 9 | homedir: /home/anna 10 | shell: /bin/bash 11 | 12 | -------------------------------------------------------------------------------- /delete-cron-job.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: remove a specific cron job 3 | hosts: file 4 | tasks: 5 | - name: remove cron job 6 | cron: 7 | name: "write message to file" 8 | cron_file: keep-alive-messages 9 | state: absent 10 | user: ansible 11 | -------------------------------------------------------------------------------- /lesson7/arrays/vars/users-list 2: -------------------------------------------------------------------------------- 1 | users: 2 | - username: linda 3 | homedir: /home/linda 4 | shell: /bin/bash 5 | - username: lisa 6 | homedir: /home/lisa 7 | shell: /bin/bash 8 | - username: anna 9 | homedir: /home/anna 10 | shell: /bin/bash 11 | 12 | -------------------------------------------------------------------------------- /setup-at-task.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: run an at task 3 | hosts: lamp 4 | 5 | tasks: 6 | - name: create my at file 7 | at: 8 | command: "date > /tmp/my-at-file" 9 | count: 1 10 | units: minutes 11 | unique: yes 12 | state: present 13 | -------------------------------------------------------------------------------- /lab-test.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: test ftp upload 3 | hosts: localhost 4 | tasks: 5 | - name: install lftp 6 | yum: 7 | name: lftp 8 | - name: upload file 9 | shell: | 10 | lftp ansible2.example.com < 100000000 11 | -------------------------------------------------------------------------------- /lesson7/arrays/vars/users-dictionary: -------------------------------------------------------------------------------- 1 | users: 2 | linda: 3 | username: linda 4 | homedir: /home/linda 5 | shell: /bin/bash 6 | lisa: 7 | username: lisa 8 | homedir: /home/lisa 9 | shell: /bin/bash 10 | anna: 11 | username: anna 12 | homedir: /home/anna 13 | shell: /bin/bash 14 | 15 | -------------------------------------------------------------------------------- /set-fact.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: set_fact demo 3 | hosts: localhost 4 | tasks: 5 | - set_fact: 6 | myvar: myvalue 7 | - debug: 8 | msg: the value is {{ myvar }} 9 | 10 | - name: other play 11 | hosts: localhost 12 | tasks: 13 | - debug: 14 | msg: checking if set_fact is valid {{ myvar }} 15 | 16 | -------------------------------------------------------------------------------- /lesson7/arrays/vars/users-dictionary 2: -------------------------------------------------------------------------------- 1 | users: 2 | linda: 3 | username: linda 4 | homedir: /home/linda 5 | shell: /bin/bash 6 | lisa: 7 | username: lisa 8 | homedir: /home/lisa 9 | shell: /bin/bash 10 | anna: 11 | username: anna 12 | homedir: /home/anna 13 | shell: /bin/bash 14 | 15 | -------------------------------------------------------------------------------- /resize-lvs.yml: -------------------------------------------------------------------------------- 1 | - name: resize LVs if size is not right 2 | hosts: all 3 | tasks: 4 | - name: set correct capacity 5 | lvol: 6 | vg: "{{ item.vgroup }}" 7 | lv: "{{ item.name }}" 8 | size: "{{ item.size }}" 9 | resizefs: yes 10 | force: yes 11 | loop: "{{ logical_volumes }}" 12 | -------------------------------------------------------------------------------- /userpw.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: create user with encrypted pass 3 | hosts: ansible2 4 | vars: 5 | password: "$6$mypassword$ypwXYJSRz53YfYqv5iO0pBsTw6EZBFoY8XuacnQMK4VWwFv3Ss/Fe7E3U3hEl8wJuKq/WaMghS5DgbS7bXQhD1" 6 | tasks: 7 | - name: create the user 8 | user: 9 | name: anna 10 | password: "{{ password }}" 11 | 12 | -------------------------------------------------------------------------------- /debugme.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: show how debug works 3 | hosts: all 4 | vars: 5 | user: linda 6 | tasks: 7 | - name: show value of a fact 8 | debug: 9 | msg: this system has {{ ansible_facts['memfree_mb'] }} available ram 10 | - name: show a custom variable 11 | debug: 12 | var: user 13 | verbosity: 1 14 | -------------------------------------------------------------------------------- /failure.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: demonstrating failed_when 3 | hosts: all 4 | tasks: 5 | - name: run a script 6 | command: echo hello world 7 | ignore_errors: yes 8 | register: command_result 9 | failed_when: "'world' in command_result.stdout" 10 | - name: see if we get here 11 | debug: 12 | msg: hello 13 | -------------------------------------------------------------------------------- /uri.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: test webserver access 3 | hosts: localhost 4 | become: no 5 | tasks: 6 | - name: connect to the web server 7 | uri: 8 | url: http://ansible2.example.com 9 | return_content: yes 10 | register: this 11 | failed_when: "'welcome' not in this.content" 12 | - debug: 13 | var: this.content 14 | -------------------------------------------------------------------------------- /multi-dictionary.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: show dictionary also known as hash 3 | hosts: ansible1.example.com 4 | vars_files: 5 | - vars/users-dictionary 6 | tasks: 7 | - name: print dictionary values 8 | debug: 9 | msg: "User {{ users.linda.username }} has homedirectory {{ users.linda.homedir }} and shell {{ users.linda.shell }}" 10 | -------------------------------------------------------------------------------- /idempotentcommand.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: make command idempotent 3 | hosts: ansible2.example.com 4 | gather_facts: no 5 | tasks: 6 | - name: find out if anna already exists 7 | shell: id anna 8 | register: isanna 9 | - debug: 10 | var: isanna 11 | - name: create user anna 12 | command: useradd anna 13 | when: isanna.rc != 0 14 | -------------------------------------------------------------------------------- /distro.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: when demo 3 | hosts: all 4 | vars: 5 | supported_distros: 6 | - Ubuntu 7 | - CentOS 8 | - Fedora 9 | tasks: 10 | - name: install RH family specific packages 11 | yum: 12 | name: "{{ mypackage }}" 13 | state: present 14 | when: ansible_distribution in supported_distros 15 | 16 | 17 | -------------------------------------------------------------------------------- /lesson7/arrays/multi-dictionary.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: show dictionary also known as hash 3 | hosts: ansible1.example.com 4 | vars_files: 5 | - vars/users-dictionary 6 | tasks: 7 | - name: print dictionary values 8 | debug: 9 | msg: "User {{ users.linda.username }} has homedirectory {{ users.linda.homedir }} and shell {{ users.linda.shell }}" 10 | -------------------------------------------------------------------------------- /when_multiple_complex.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: using multiple conditions 3 | hosts: all 4 | tasks: 5 | - package: 6 | name: httpd 7 | state: removed 8 | when: > 9 | ( ansible_distribution == "RedHat" and 10 | ansible_memfree_mb < 512 ) 11 | or 12 | ( ansible_distribution == "CentOS" and 13 | ansible_memfree_mb < 1024 ) 14 | -------------------------------------------------------------------------------- /hostvars.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: checking out magic variables 3 | hosts: all 4 | vars: 5 | user: anna 6 | groups: staff 7 | tasks: 8 | - name: printing hostvars 9 | debug: 10 | var: {{ hostvars['ansible1'] 11 | - name: creating user {{ user }} as a member of group {{ groups }} 12 | user: 13 | name: "{{ user }}" 14 | groups: "{{ groups }}" 15 | -------------------------------------------------------------------------------- /blocks.yml: -------------------------------------------------------------------------------- 1 | - name: simple block example 2 | hosts: all 3 | tasks: 4 | - name: setting up http 5 | block: 6 | - name: installing http 7 | yum: 8 | name: httpd 9 | state: present 10 | - name: restart httpd 11 | service: 12 | name: httpd 13 | state: started 14 | when: ansible_distribution == "RedHat" 15 | -------------------------------------------------------------------------------- /setup-crontab.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: setup cron job 3 | hosts: file 4 | tasks: 5 | - name: run a cron job 6 | cron: 7 | name: "write message to file" 8 | minute: "*/2" 9 | hour: 8-18 10 | user: ansible 11 | job: echo "entry written at $(date)" >> /tmp/cron-keepalive 12 | cron_file: keep-alive-messages 13 | state: present 14 | -------------------------------------------------------------------------------- /vsftpd-err.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: deploy vsftpd 3 | hosts: ansible2.example.com 4 | tasks: 5 | - name: install vsftpd 6 | yum: name=vsftpd 7 | - name: enable vsftpd 8 | service: name=vsftpd enabled=true 9 | - name: create readme file 10 | copy: 11 | content: "wat moet je hier\n" 12 | dest: /var/ftp/pub/README 13 | force: no 14 | mode: 0444 15 | ... 16 | -------------------------------------------------------------------------------- /vsftpd.j2: -------------------------------------------------------------------------------- 1 | {{ ansible_managed }} 2 | anonymous_enable={{ anonymous_enable }} 3 | local_enable={{ local_enable }} 4 | write_enable={{ write_enable }} 5 | anon_upload_enable={{ anon_upload_enable }} 6 | dirmessage_enable=YES 7 | xferlog_enable=YES 8 | connect_from_port_20=YES 9 | pam_service_name=vsftpd 10 | userlist_enable=YES 11 | #my IP address={{ ansible_facts['default_ipv4']['address'] }} 12 | -------------------------------------------------------------------------------- /get-diskname.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: check device names 3 | hosts: all 4 | tasks: 5 | - name: get device name 6 | set_fact: 7 | device_name: "{{ item.key }}" 8 | no_log: true 9 | with_dict: "{{ ansible_devices }}" 10 | - name: show all values for the device name 11 | debug: var=ansible_devices[device_name] 12 | - name: show only device name 13 | debug: var=device_name 14 | -------------------------------------------------------------------------------- /lab5.yaml: -------------------------------------------------------------------------------- 1 | - name: ansible1 facts 2 | hosts: ansible1 3 | vars: 4 | remote_dir: /etc/ansible/facts.d 5 | facts_file: ansible1.fact 6 | tasks: 7 | - name: create fact dir 8 | file: 9 | state: directory 10 | recurse: yes 11 | path: "{{ remote_dir }}" 12 | - name: install new facts 13 | copy: 14 | src: "{{ facts_file }}" 15 | dest: "{{ remote_dir }}" 16 | -------------------------------------------------------------------------------- /loopusers.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: create users using a loop 3 | hosts: all 4 | tasks: 5 | - name: create users 6 | user: 7 | name: "{{ item.name }}" 8 | state: present 9 | groups: "{{ item.groups }}" 10 | loop: 11 | - name: anna 12 | groups: wheel 13 | - name: linda 14 | groups: users 15 | - name: bob 16 | groups: users 17 | 18 | -------------------------------------------------------------------------------- /restart.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: restart sshd only if crond is running 3 | hosts: all 4 | tasks: 5 | - name: get the crond server status 6 | command: /usr/bin/systemctl is-active crond 7 | ignore_errors: yes 8 | register: result 9 | - name: restart sshd based on crond status 10 | service: 11 | name: sshd 12 | state: restarted 13 | when: result.rc == 0 14 | -------------------------------------------------------------------------------- /lesson7/facts/lab6.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: add a custom fact 3 | hosts: ansible1 4 | tasks: 5 | - name: creating the directory 6 | file: 7 | name: /etc/ansible/facts.d/ 8 | state: directory 9 | - name: creating the fact file 10 | copy: 11 | content: | 12 | [facts] 13 | type=production 14 | dest: /etc/ansible/facts.d/local.fact 15 | vim 16 | -------------------------------------------------------------------------------- /lesson7/facts/lab5.yaml: -------------------------------------------------------------------------------- 1 | - name: ansible1 facts 2 | hosts: ansible1.example.com 3 | vars: 4 | remote_dir: /etc/ansible/facts.d 5 | facts_file: ansible1.fact 6 | tasks: 7 | - name: create fact dir 8 | file: 9 | state: directory 10 | recurse: yes 11 | path: "{{ remote_dir }}" 12 | - name: install new facts 13 | copy: 14 | src: "{{ facts_file }}" 15 | dest: "{{ remote_dir }}" 16 | -------------------------------------------------------------------------------- /listing1313.yaml: -------------------------------------------------------------------------------- 1 | - name: create user with encrypted password 2 | hosts: ansible3 3 | vars: 4 | password: mypassword 5 | user: anna 6 | tasks: 7 | - name: configure user {{ user }} 8 | user: 9 | name: "{{ user }}" 10 | groups: wheel 11 | append: yes 12 | state: present 13 | - name: set a password for {{ user }} 14 | shell: 'echo {{ password }} | passwd --stdin {{ user }}' 15 | 16 | -------------------------------------------------------------------------------- /listing725.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: demonstrating the fail module 3 | hosts: all 4 | ignore_errors: yes 5 | tasks: 6 | - name: run a script 7 | command: echo hello world 8 | register: command_result 9 | - name: report a failure 10 | fail: 11 | msg: the command has failed 12 | when: "'world' in command_result.stdout" 13 | - name: see if we get here 14 | debug: 15 | msg: second task executed 16 | -------------------------------------------------------------------------------- /vsftpd-template.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: configure VSFTPD using a template 3 | hosts: all 4 | vars: 5 | anonymous_enable: yes 6 | local_enable: yes 7 | write_enable: yes 8 | anon_upload_enable: yes 9 | tasks: 10 | - name: install vsftpd 11 | yum: 12 | name: vsftpd 13 | - name: use template to copy FTP config 14 | template: 15 | src: vsftpd.j2 16 | dest: /etc/vsftpd/vsftpd.conf 17 | 18 | -------------------------------------------------------------------------------- /vsftpd.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: deploy vsftpd 3 | hosts: ansible2.example.com 4 | vars: 5 | package: vsfptd 6 | tasks: 7 | - name: install vsftpd 8 | yum: {{ package }} 9 | - name: enable vsftpd 10 | service: name=vsftpd enabled=true 11 | - name: create readme file 12 | copy: 13 | content: "wat moet je hier\n" 14 | dest: /var/ftp/pub/README 15 | force: no 16 | mode: 0444 17 | ... 18 | -------------------------------------------------------------------------------- /command-output-test.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: test command output 3 | hosts: ansible1.example.com 4 | tasks: 5 | - name: test for VG existence 6 | command: vgs myvg 7 | register: vgout 8 | ignore_errors: True 9 | - name: show variable value 10 | debug: 11 | var: vgout 12 | - name: print message 13 | debug: 14 | msg: vg does not exist 15 | when: "'not found' in vgout.stderr" 16 | -------------------------------------------------------------------------------- /register_command.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: test register 3 | hosts: all 4 | vars_prompt: 5 | - name: username 6 | prompt: which user are you looking for 7 | tasks: 8 | - shell: cat /etc/passwd 9 | register: passwd_contents 10 | - debug: 11 | var: passwd_contents 12 | - debug: 13 | msg: echo "passwd contains user {{ username }}" 14 | when: passwd_contents.stdout.find(username) != -1 15 | -------------------------------------------------------------------------------- /uninstall-httpd.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: remove httpd 3 | hosts: ansible2 4 | tasks: 5 | - name: close firewall 6 | firewalld: 7 | service: http 8 | permanent: yes 9 | state: disabled 10 | - name: remove file 11 | file: 12 | path: /var/www/html/index.html 13 | state: absent 14 | - name: remove package 15 | package: 16 | name: httpd 17 | state: absent 18 | 19 | -------------------------------------------------------------------------------- /lab/lab-copy-facts.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Install remote facts 3 | hosts: all 4 | vars: 5 | remote_dir: /etc/ansible/facts.d 6 | facts_file: custom.fact 7 | tasks: 8 | - name: create remote directory 9 | file: 10 | state: directory 11 | recurse: yes 12 | path: "{{ remote_dir }}" 13 | - name: install new facts 14 | copy: 15 | src: "{{ facts_file }}" 16 | dest: "{{ remote_dir }}" 17 | -------------------------------------------------------------------------------- /newlocalfacts.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install custom facts 3 | hosts: lamp 4 | vars: 5 | remote_dir: /etc/ansible/facts.d 6 | facts_file: localfacts.fact 7 | tasks: 8 | - name: create fact directory 9 | file: 10 | state: directory 11 | recurse: yes 12 | path: "{{ remote_dir }}" 13 | - name: install new facts 14 | copy: 15 | src: "{{ facts_file }}" 16 | dest: "{{ remote_dir }}" 17 | 18 | -------------------------------------------------------------------------------- /multi-list.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: show lists also known as arrays 3 | hosts: ansible1.example.com 4 | vars_files: 5 | - vars/users-list 6 | tasks: 7 | - name: print array values 8 | debug: 9 | msg: "User {{ item.username }} has homedirectory {{ item.homedir }} and shell {{ item.shell }}" 10 | loop: "{{ users }}" 11 | - name: print the second array value 12 | debug: 13 | msg: the second item is {{ users[1] }} 14 | -------------------------------------------------------------------------------- /lesson7/facts/newlocalfacts.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install custom facts 3 | hosts: lamp 4 | vars: 5 | remote_dir: /etc/ansible/facts.d 6 | facts_file: localfacts.fact 7 | tasks: 8 | - name: create fact directory 9 | file: 10 | state: directory 11 | recurse: yes 12 | path: "{{ remote_dir }}" 13 | - name: install new facts 14 | copy: 15 | src: "{{ facts_file }}" 16 | dest: "{{ remote_dir }}" 17 | 18 | -------------------------------------------------------------------------------- /selinux.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: show selinux 3 | hosts: all 4 | tasks: 5 | - name: install required pacakges 6 | yum: 7 | name: policycoreutils-python-utils 8 | state: present 9 | - name: set selinux context 10 | sefcontext: 11 | target: /tmp/removeme 12 | setype: tmp_t 13 | state: present 14 | notify: 15 | - run restorecon 16 | handlers: 17 | - name: run restorecon 18 | command: restorecon -v /tmp/removeme 19 | -------------------------------------------------------------------------------- /lesson7/arrays/multi-list.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: show lists also known as arrays 3 | hosts: ansible1.example.com 4 | vars_files: 5 | - vars/users-list 6 | tasks: 7 | - name: print array values 8 | debug: 9 | msg: "User {{ item.username }} has homedirectory {{ item.homedir }} and shell {{ item.shell }}" 10 | loop: "{{ users }}" 11 | - name: print the second array value 12 | debug: 13 | msg: the second item is {{ users[1] }} 14 | -------------------------------------------------------------------------------- /checkseconddisk.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: ansible1.example.com, ansible2.example.com 3 | tasks: 4 | 5 | # Assuming sdX disk naming convention. 6 | 7 | # If we'd rather skip the task than fail when there's no second SCSI disk: 8 | - debug: 9 | msg: "You have a second disk" 10 | when: ansible_facts['devices']['sdb'] is defined 11 | 12 | - debug: 13 | msg: "You have no second disk" 14 | when: ansible_facts['devices']['sdb'] is not defined 15 | 16 | -------------------------------------------------------------------------------- /apache-vhost-role.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: create apache vhost 3 | hosts: lamp 4 | pre_tasks: 5 | - name: pre_tasks message 6 | debug: 7 | msg: setting up web server 8 | 9 | roles: 10 | - mywebhost 11 | 12 | post_tasks: 13 | - name: install contents from local file 14 | copy: 15 | src: files/html/ 16 | dest: "/var/www/vhosts/{{ ansible_hostname }}" 17 | - name: post_tasks message 18 | debug: 19 | msg: web server is configured 20 | 21 | -------------------------------------------------------------------------------- /bashversion.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: use debug to check package facts 3 | hosts: ansible2.example.com 4 | tasks: 5 | - name: get information about packages 6 | package_facts: 7 | manager: auto 8 | - name: list installed packages 9 | debug: 10 | var: ansible_facts.packages 11 | - name: show Bash version 12 | debug: 13 | msg: "Version {{ansible_facts.packages['bash'][0].version}}" 14 | when: "'bash' in ansible_facts.packages" 15 | -------------------------------------------------------------------------------- /packagefacts.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: use debug to check package facts 3 | hosts: ansible2.example.com 4 | tasks: 5 | - name: get information about packages 6 | package_facts: 7 | manager: auto 8 | - name: list installed packages 9 | debug: 10 | var: ansible_facts.packages 11 | - name: show Bash version 12 | debug: 13 | msg: "Version {{ansible_facts.packages['bash'][0].version}}" 14 | when: "'bash' in ansible_facts.packages" 15 | -------------------------------------------------------------------------------- /roles/mywebhost/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # tasks file for mywebhost 3 | - name: install httpd 4 | yum: 5 | name: httpd 6 | state: latest 7 | - name: start and enable httpd 8 | service: 9 | name: httpd 10 | state: started 11 | enabled: true 12 | - name: install host config file 13 | template: 14 | src: vhost.conf.j2 15 | dest: /etc/httpd/conf.d/vhost.conf 16 | owner: root 17 | group: root 18 | mode: 0644 19 | notify: 20 | - restart httpd 21 | -------------------------------------------------------------------------------- /tasks/firewall.yaml: -------------------------------------------------------------------------------- 1 | - name: install the firewall 2 | package: 3 | name: "{{ firewall_package }}" 4 | state: latest 5 | - name: start the firewall 6 | service: 7 | name: "{{ firewall_service }}" 8 | enabled: true 9 | state: started 10 | - name: open the port for the service 11 | firewalld: 12 | service: "{{ item }}" 13 | immediate: true 14 | permanent: true 15 | state: enabled 16 | loop: "{{ firewall_rules }}" 17 | -------------------------------------------------------------------------------- /assertsize-wrong.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: localhost 3 | vars_prompt: 4 | - name: filesize 5 | prompt: "specify a file size in megabytes" 6 | tasks: 7 | - name: check if file size is valid 8 | assert: 9 | that: 10 | - filesize <= 100 11 | - filesize >= 1 12 | fail_msg: "file size must be between 0 and 100" 13 | success_msg: "file size is good, lets continue" 14 | - name: create a file 15 | command: dd if=/dev/zero of=/bigfile bs=1 count={{ filesize }} 16 | -------------------------------------------------------------------------------- /lab12-tasks.yml: -------------------------------------------------------------------------------- 1 | - name: create groups 2 | group: 3 | name: "{{ item.groups }}" 4 | state: present 5 | loop: "{{ users }}" 6 | - name: create users 7 | user: 8 | name: "{{ item.username }}" 9 | groups: "{{ item.groups }}" 10 | generate_ssh_key: yes 11 | ssh_key_comment: "{{ item.username }}@{{ ansible_fqdn }}" 12 | password: $6$mysalt$NN1QGsmCO0hcvplH4ahY6ocho6F6TgcY8yNdMFAeO.LAeFodNPGA6KsQM5Or1AKbE4QKSqnEsC/SE0Zz3ts9y1 13 | loop: "{{ users }}" 14 | -------------------------------------------------------------------------------- /exercise134-tasks.yaml: -------------------------------------------------------------------------------- 1 | - name: create groups 2 | group: 3 | name: "{{ item.groups }}" 4 | state: present 5 | loop: "{{ users }}" 6 | - name: create users 7 | user: 8 | name: "{{ item.username }}" 9 | groups: "{{ item.groups }}" 10 | generate_ssh_key: yes 11 | ssh_key_comment: "{{ item.username }}@{{ ansible_fqdn }}" 12 | password: $6$mysalt$NN1QGsmCO0hcvplH4ahY6ocho6F6TgcY8yNdMFAeO.LAeFodNPGA6KsQM5Or1AKbE4QKSqnEsC/SE0Zz3ts9y1 13 | loop: "{{ users }}" 14 | -------------------------------------------------------------------------------- /get_devices.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: get storage devices 3 | hosts: ansible4.example.com 4 | tasks: 5 | 6 | - name: get device name 7 | set_fact: 8 | device_name: "{{ item.key }}" 9 | no_log: False 10 | with_dict: "{{ ansible_devices }}" 11 | when: "item.value.host.startswith('SCSI')" 12 | 13 | - name: show all values for selected device name 14 | debug: var=ansible_devices[device_name] 15 | 16 | - name: show only device name 17 | debug: var=device_name 18 | -------------------------------------------------------------------------------- /subscription.yml: -------------------------------------------------------------------------------- 1 | - name: use subscription manager to register and set up repos 2 | hosts: ansible2 3 | tasks: 4 | - name: register and subscribe ansible2 5 | redhat_subscription: 6 | username: bob@example.com 7 | password: verysecretpassword 8 | state: present 9 | - name: configure additional repo access 10 | rhsm_repository: 11 | name: 12 | - rh-gluster-3-client-for-rhel-8-x86_64-rpms 13 | - rhel-8-for-x86_64-appstream-debug-rpms 14 | state: present 15 | 16 | -------------------------------------------------------------------------------- /assertsize.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: localhost 3 | vars_prompt: 4 | - name: filesize 5 | prompt: "specify a file size in megabytes" 6 | tasks: 7 | - name: check if file size is valid 8 | assert: 9 | that: 10 | - "{{ (filesize | int) <= 100 }}" 11 | - "{{ (filesize | int) >= 1 }}" 12 | fail_msg: "file size must be between 0 and 100" 13 | success_msg: "file size is good, lets continue" 14 | - name: create a file 15 | command: dd if=/dev/zero of=/bigfile bs=1 count={{ filesize }} 16 | -------------------------------------------------------------------------------- /includes-and-imports.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: setup a service 3 | hosts: ansible2 4 | tasks: 5 | - name: include the services task file 6 | include_tasks: tasks/service.yaml 7 | vars: 8 | package: httpd 9 | service: httpd 10 | when: ansible_facts['os_family'] == 'RedHat' 11 | - name: include the firewall file 12 | import_tasks: tasks/firewall.yaml 13 | vars: 14 | firewall_package: firewalld 15 | firewall_service: firewalld 16 | firewall_rules: 17 | - http 18 | - https 19 | -------------------------------------------------------------------------------- /roles/mywebhost/templates/vhost.conf.j2: -------------------------------------------------------------------------------- 1 | # {{ ansible_managed }} 2 | 3 | 4 | ServerAdmin webmaster@{{ ansible_fqdn }} 5 | ServerName {{ ansible_fqdn }} 6 | ErrorLog logs/{{ ansible_hostname }}-error.log 7 | CustomLog logs/{{ ansible_hostname }}-common.log common 8 | DocumentRoot /var/www/vhosts/{{ ansible_hostname }}/ 9 | 10 | 11 | Options +Indexes +FollowSymlinks +Includes 12 | Order allow,deny 13 | Allow from all 14 | 15 | 16 | -------------------------------------------------------------------------------- /register_homes.yml: -------------------------------------------------------------------------------- 1 | - name: registered variable usage as a loop list 2 | hosts: all 3 | tasks: 4 | - name: create target directory 5 | file: 6 | path: /mnt/bkspool 7 | state: directory 8 | - name: retrieve the list of home directories 9 | command: ls /home 10 | register: home_dirs 11 | - name: add home dirs to the backup spooler 12 | file: 13 | path: /mnt/bkspool/{{ item }} 14 | src: /home/{{ item }} 15 | state: link 16 | loop: "{{ home_dirs.stdout_lines }}" 17 | -------------------------------------------------------------------------------- /lesson7/facts/ipfact.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: all 3 | gather_facts: yes 4 | tasks: 5 | - name: show IP address 6 | debug: 7 | msg: > 8 | This host uses IP address {{ ansible_facts.default_ipv4.address }} 9 | - name: show IP address again 10 | debug: 11 | msg: This host uses IP address {{ ansible_facts['default_ipv4']['address'] }} 12 | - name: lets inject! 13 | debug: 14 | msg: This host uses inected variables {{ ansible_default_ipv4.address }} 15 | - name: and another one 16 | debug: 17 | var: ansible_default_ipv4['address'] 18 | -------------------------------------------------------------------------------- /setupnewhost.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: add host to inventory 3 | hosts: localhost 4 | tasks: 5 | - fail: 6 | msg: "add the options -e newhost=hostname -e newhostip=ip.ad.dr.ess and try again" 7 | when: (newhost is undefined) or (newhostip is undefined) 8 | - name: add new host to inventory 9 | lineinfile: 10 | path: inventory 11 | state: present 12 | line: "{{ newhost }}" 13 | - name: add new host to /etc/hosts 14 | lineinfile: 15 | path: /etc/hosts 16 | state: present 17 | line: "{{ newhostip }} {{ newhost }}" 18 | tags: addhost 19 | -------------------------------------------------------------------------------- /install-httpd.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install httpd 3 | hosts: ansible2 4 | tasks: 5 | - name: install package 6 | package: 7 | name: httpd 8 | state: present 9 | - name: create an index.html 10 | copy: 11 | content: 'welcome to this webserver' 12 | dest: /var/www/html/index.html 13 | - name: start the service 14 | service: 15 | name: httpd 16 | state: started 17 | enabled: true 18 | - name: open firewall 19 | firewalld: 20 | service: http 21 | permanent: yes 22 | state: enabled 23 | -------------------------------------------------------------------------------- /lab/lab-tasks/file 2.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install and start file services 3 | yum: 4 | name: 5 | - "{{ ansible_local.custom.packages.smb_package }}" 6 | - "{{ ansible_local.custom.packages.ftp_package }}" 7 | state: latest 8 | 9 | - name: start samba server 10 | service: 11 | name: "{{ ansible_local.custom.services.smb_service }}" 12 | state: started 13 | enabled: true 14 | 15 | - name: start the ftp service 16 | service: 17 | name: "{{ ansible_local.custom.services.ftp_service }}" 18 | state: started 19 | enabled: true 20 | -------------------------------------------------------------------------------- /lab/lab-tasks/file.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install and start file services 3 | yum: 4 | name: 5 | - "{{ ansible_local.custom.packages.smb_package }}" 6 | - "{{ ansible_local.custom.packages.ftp_package }}" 7 | state: latest 8 | 9 | - name: start samba server 10 | service: 11 | name: "{{ ansible_local.custom.services.smb_service }}" 12 | state: started 13 | enabled: true 14 | 15 | - name: start the ftp service 16 | service: 17 | name: "{{ ansible_local.custom.services.ftp_service }}" 18 | state: started 19 | enabled: true 20 | -------------------------------------------------------------------------------- /lab/lab-tasks/lamp 2.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install and start the servers 3 | yum: 4 | name: 5 | - "{{ ansible_local.custom.packages.ftp_package }}" 6 | - "{{ ansible_local.custom.packages.web_package }}" 7 | state: latest 8 | 9 | - name: start database server 10 | service: 11 | name: "{{ ansible_local.custom.services.ftp_service }}" 12 | state: started 13 | enabled: true 14 | 15 | - name: start the web service 16 | service: 17 | name: "{{ ansible_local.custom.services.web_service }}" 18 | state: started 19 | enabled: true 20 | 21 | -------------------------------------------------------------------------------- /lab/lab-tasks/lamp.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install and start the servers 3 | yum: 4 | name: 5 | - "{{ ansible_local.custom.packages.ftp_package }}" 6 | - "{{ ansible_local.custom.packages.web_package }}" 7 | state: latest 8 | 9 | - name: start database server 10 | service: 11 | name: "{{ ansible_local.custom.services.ftp_service }}" 12 | state: started 13 | enabled: true 14 | 15 | - name: start the web service 16 | service: 17 | name: "{{ ansible_local.custom.services.web_service }}" 18 | state: started 19 | enabled: true 20 | 21 | -------------------------------------------------------------------------------- /addcustomfacts.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: ansible1.example.com 3 | gather_facts: no 4 | tasks: 5 | - name: Create custom fact on ansible1 6 | blockinfile: 7 | path: /etc/ansible/facts.d/local.fact 8 | create: true 9 | block: | 10 | [localfacts] 11 | type: production 12 | - hosts: ansible2.example.com 13 | gather_facts: no 14 | tasks: 15 | - name: Create custom fact on ansible2 16 | blockinfile: 17 | path: /etc/ansible/facts.d/local.fact 18 | create: true 19 | block: | 20 | [localfacts] 21 | type: testing 22 | 23 | -------------------------------------------------------------------------------- /rhel_storage.yml: -------------------------------------------------------------------------------- 1 | -- 2 | - name: use the storage RHEL system role to create LVM on /dev/sdb 3 | hosts: all 4 | roles: 5 | - name: storage 6 | storage_pools: 7 | - name: vgdata 8 | type: lvm 9 | disks: 10 | - /dev/sdb 11 | volumes: 12 | - name: lvdata 13 | size: 1g 14 | mount_point: /lvdata 15 | fs_type: xfs 16 | - name: lvfinance 17 | size: 5g 18 | mount_point: /lvfinance 19 | fs_type: ext4 20 | when: ansible_facts['devices']['sdb'] is defined 21 | 22 | -------------------------------------------------------------------------------- /handlers.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: set up web server 3 | hosts: all 4 | force_handlers: true 5 | tasks: 6 | - name: install httpd 7 | yum: 8 | name: httpd 9 | state: latest 10 | - name: copy index.html 11 | copy: 12 | src: /tmp/index.html 13 | dest: /var/www/html/index.html 14 | notify: 15 | - restart_web 16 | - name: copy nothing - intended to fail 17 | copy: 18 | src: /tmp/nothing 19 | dest: /var/www/html/nothing.html 20 | handlers: 21 | - name: restart_web 22 | service: 23 | name: httpd 24 | state: restarted 25 | -------------------------------------------------------------------------------- /lesson7/facts/addcustomfacts.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: ansible1.example.com 3 | gather_facts: no 4 | tasks: 5 | - name: Create custom fact on ansible1 6 | blockinfile: 7 | path: /etc/ansible/facts.d/local.fact 8 | create: true 9 | block: | 10 | [localfacts] 11 | type: production 12 | - hosts: ansible2.example.com 13 | gather_facts: no 14 | tasks: 15 | - name: Create custom fact on ansible2 16 | blockinfile: 17 | path: /etc/ansible/facts.d/local.fact 18 | create: true 19 | block: | 20 | [localfacts] 21 | type: testing 22 | 23 | -------------------------------------------------------------------------------- /settargetandreboot.yml: -------------------------------------------------------------------------------- 1 | - name: change target and reboot 2 | hosts: all 3 | gather_facts: no 4 | vars: 5 | default_target: multi-user.target 6 | tasks: 7 | - name: get current target 8 | command: 9 | cmd: systemctl get-default 10 | changed_when: false 11 | register: default 12 | - name: set default target 13 | command: 14 | cmd: systemctl set-default {{ default_target }} 15 | when: default_target not in default['stdout'] 16 | notify: reboot_server 17 | 18 | handlers: 19 | - name: reboot_server 20 | reboot: 21 | test_command: uptime 22 | reboot_timeout: 300 23 | 24 | -------------------------------------------------------------------------------- /handlers2.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: set up web server 3 | hosts: all 4 | tasks: 5 | - name: install httpd 6 | yum: 7 | name: httpd 8 | state: latest 9 | - name: copy index.html 10 | copy: 11 | src: /tmp/index.html 12 | dest: /var/www/html/index.html 13 | notify: 14 | - restart_web 15 | - name: run handlers now 16 | meta: flush_handlers 17 | - name: copy nothing - intended to fail 18 | copy: 19 | src: /tmp/nothing 20 | dest: /var/www/html/nothing.html 21 | handlers: 22 | - name: restart_web 23 | service: 24 | name: httpd 25 | state: restarted 26 | -------------------------------------------------------------------------------- /roles/mywebhost/.travis.yml: -------------------------------------------------------------------------------- 1 | --- 2 | language: python 3 | python: "2.7" 4 | 5 | # Use the new container infrastructure 6 | sudo: false 7 | 8 | # Install ansible 9 | addons: 10 | apt: 11 | packages: 12 | - python-pip 13 | 14 | install: 15 | # Install ansible 16 | - pip install ansible 17 | 18 | # Check ansible version 19 | - ansible --version 20 | 21 | # Create ansible.cfg with correct roles_path 22 | - printf '[defaults]\nroles_path=../' >ansible.cfg 23 | 24 | script: 25 | # Basic role syntax check 26 | - ansible-playbook tests/test.yml -i tests/inventory --syntax-check 27 | 28 | notifications: 29 | webhooks: https://galaxy.ansible.com/api/v1/notifications/ -------------------------------------------------------------------------------- /setupfactcache.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: setup local redis fact cache 3 | hosts: localhost 4 | become: yes 5 | tasks: 6 | - name: install redis 7 | package: 8 | name: redis 9 | state: latest 10 | - name: start and enable 11 | service: 12 | name: redis 13 | state: started 14 | enabled: yes 15 | - name: enable python module 16 | pip: 17 | name: redis 18 | - debug: 19 | msg: | 20 | IMPORTANT - change all ansible.cfg files to include the following 21 | fact_caching = redis 22 | fact_caching_timeout = 3600 23 | fact_caching_connnection = localhost[colon]6379[colon]0 24 | gather_facts[colon]no 25 | -------------------------------------------------------------------------------- /changeconfig.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: find config 3 | hosts: localhost 4 | become: true 5 | tasks: 6 | - name: find ansible.cfg files 7 | find: 8 | paths: /home/ansible/rhce8-live 9 | patterns: 'ansible.cfg' 10 | recurse: yes 11 | register: output 12 | - debug: 13 | var: item.path 14 | with_items: "{{ output.files }}" 15 | - blockinfile: 16 | path: "{{ item.path }}" 17 | insertafter: "defaults" 18 | marker: "####" 19 | block: | 20 | fact_caching = redis 21 | fact_caching_timeout = 3600 22 | fact_caching_connection = localhost:6379:0 23 | with_items: "{{ output.files }}" 24 | -------------------------------------------------------------------------------- /lesson7/facts/setupfactcache.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: setup local redis fact cache 3 | hosts: localhost 4 | become: yes 5 | tasks: 6 | - name: install redis 7 | package: 8 | name: redis 9 | state: latest 10 | - name: start and enable 11 | service: 12 | name: redis 13 | state: started 14 | enabled: yes 15 | - name: enable python module 16 | pip: 17 | name: redis 18 | - debug: 19 | msg: | 20 | IMPORTANT - change all ansible.cfg files to include the following 21 | fact_caching = redis 22 | fact_caching_timeout = 3600 23 | fact_caching_connnection = localhost[colon]6379[colon]0 24 | gather_facts[colon]no 25 | -------------------------------------------------------------------------------- /copy.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: file copy modules 3 | hosts: all 4 | tasks: 5 | - name: copy file demo 6 | copy: 7 | src: /etc/hosts 8 | dest: /tmp/ 9 | - name: add some lines to /tmp/hosts 10 | blockinfile: 11 | path: /tmp/hosts 12 | block: | 13 | 192.168.4.110 host1.example.com 14 | 192.168.4.120 host2.example.com 15 | state: present 16 | - name: verify file checksum 17 | stat: 18 | path: /tmp/hosts 19 | checksum_algorithm: md5 20 | register: result 21 | - debug: 22 | msg: "The checksum of /tmp/hosts is {{ result.stat.checksum }}" 23 | - name: fetch a file 24 | fetch: 25 | src: /tmp/hosts 26 | dest: /tmp/ 27 | -------------------------------------------------------------------------------- /lesson7/facts/changeconfig.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: find config 3 | hosts: localhost 4 | become: true 5 | tasks: 6 | - name: find ansible.cfg files 7 | find: 8 | paths: /home/ansible/rhce8-live 9 | patterns: 'ansible.cfg' 10 | recurse: yes 11 | register: output 12 | - debug: 13 | var: item.path 14 | with_items: "{{ output.files }}" 15 | - blockinfile: 16 | path: "{{ item.path }}" 17 | insertafter: "defaults" 18 | marker: "####" 19 | block: | 20 | fact_caching = redis 21 | fact_caching_timeout = 3600 22 | fact_caching_connection = localhost:6379:0 23 | with_items: "{{ output.files }}" 24 | -------------------------------------------------------------------------------- /block2.yaml: -------------------------------------------------------------------------------- 1 | - name: using blocks 2 | hosts: all 3 | tasks: 4 | - name: intended to be successful 5 | block: 6 | - name: remove a file 7 | shell: 8 | cmd: rm /var/www/html/index.html 9 | - name: printing status 10 | debug: 11 | msg: block task was operated 12 | rescue: 13 | - name: create a file 14 | shell: 15 | cmd: touch /tmp/rescuefile 16 | - name: printing rescue status 17 | debug: 18 | msg: rescue task was operated 19 | always: 20 | - name: always write a message to logs 21 | shell: 22 | cmd: logger hello 23 | - name: always printing this message 24 | debug: 25 | msg: this message is always printed 26 | 27 | -------------------------------------------------------------------------------- /setup_repo.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install apache to export repo 3 | hosts: localhost 4 | tasks: 5 | - name: install apache server 6 | yum: 7 | name: httpd 8 | state: latest 9 | - name: start apache server 10 | service: 11 | name: httpd 12 | state: started 13 | enabled: yes 14 | - name: open firewall 15 | firewalld: 16 | service: http 17 | state: enabled 18 | permanent: http 19 | 20 | - name: setup the repo directory 21 | hosts: localhost 22 | tasks: 23 | - name: make directory 24 | file: 25 | path: /var/www/html/repo 26 | state: directory 27 | - debug: 28 | msg: you need to manually copy content from the installation iso to the repo directory 29 | 30 | -------------------------------------------------------------------------------- /localfacts.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install custom facts 3 | hosts: lamp 4 | vars: 5 | remote_dir: /etc/ansible/facts.d 6 | facts_file: localfacts.fact 7 | tasks: 8 | - name: create fact directory 9 | file: 10 | state: directory 11 | recurse: yes 12 | path: "{{ remote_dir }}" 13 | - name: install new facts 14 | copy: 15 | src: "{{ facts_file }}" 16 | dest: "{{ remote_dir }}" 17 | 18 | - name: install and start 19 | hosts: lamp 20 | tasks: 21 | - name: install 22 | yum: 23 | name: "{{ ansible_local.localfacts.localfacts.package }}" 24 | - name: start 25 | service: 26 | name: "{{ ansible_local.localfacts.localfacts.service }}" 27 | state: started 28 | -------------------------------------------------------------------------------- /lesson7/facts/localfacts.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install custom facts 3 | hosts: lamp 4 | vars: 5 | remote_dir: /etc/ansible/facts.d 6 | facts_file: localfacts.fact 7 | tasks: 8 | - name: create fact directory 9 | file: 10 | state: directory 11 | recurse: yes 12 | path: "{{ remote_dir }}" 13 | - name: install new facts 14 | copy: 15 | src: "{{ facts_file }}" 16 | dest: "{{ remote_dir }}" 17 | 18 | - name: install and start 19 | hosts: lamp 20 | tasks: 21 | - name: install 22 | yum: 23 | name: "{{ ansible_local.localfacts.localfacts.package }}" 24 | - name: start 25 | service: 26 | name: "{{ ansible_local.localfacts.localfacts.service }}" 27 | state: started 28 | -------------------------------------------------------------------------------- /copy_facts.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: copy custom facts 3 | hosts: all 4 | vars: 5 | remote_dir: /etc/ansible/facts.d/ 6 | fact_file: 7 | - packages.fact 8 | - services.fact 9 | tasks: 10 | - name: create directory for local facts 11 | file: 12 | state: directory 13 | path: "{{ remote_dir }}" 14 | 15 | - name: copy facts 16 | copy: 17 | src: "{{ item }}" 18 | dest: "{{ remote_dir }}" 19 | loop: "{{ fact_file }}" 20 | 21 | - name: re-gather facts 22 | setup: 23 | 24 | - name: Test facts 25 | debug: 26 | msg: 27 | - "db_package = {{ ansible_local['packages']['packages']['db_package'] }}" 28 | - "firewall_service = {{ ansible_local['services']['services']['firewall_service'] }}" 29 | -------------------------------------------------------------------------------- /setup_sudo.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: configure sudo 3 | hosts: ansible2 4 | vars_files: 5 | - vars/defaults 6 | - vars/groups 7 | tasks: 8 | - name: add groups 9 | group: 10 | name: "{{ item.groupname }}" 11 | loop: "{{ usergroups }}" 12 | - name: add users 13 | user: 14 | name: "{{ item.username }}" 15 | groups: "{{ item.groups }}" 16 | loop: "{{ users }}" 17 | - name: add SSH public keys 18 | authorized_key: 19 | user: "{{ item.username }}" 20 | key: "{{ lookup('file', 'files/'+ item.username + '/id_rsa.pub') }}" 21 | loop: "{{ users }}" 22 | 23 | - name: allow group members in sudo 24 | template: 25 | src: sudoers.j2 26 | dest: /etc/sudoers.d/sudogroups 27 | validate: 'visudo -cf %s' 28 | mode: 0440 29 | -------------------------------------------------------------------------------- /lab.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: database server is running 3 | hosts: lamp_prod 4 | vars: 5 | database_packages: 6 | - mariadb-server 7 | - python3-PyMySQL 8 | 9 | tasks: 10 | - name: mariadb packages are installed 11 | yum: 12 | name: "{{ item }}" 13 | state: present 14 | loop: "{{ database_packages }}" 15 | when: ( ansible_distribution == "RedHat" or ansible_distribution == "CentOS" ) and ansible_distribution_major_version == "8" 16 | - name: start the db service 17 | service: 18 | name: mariadb 19 | state: started 20 | enabled: true 21 | notify: 22 | - set db password 23 | 24 | handlers: 25 | - name: set db password 26 | mysql_user: 27 | name: root 28 | password: password 29 | 30 | -------------------------------------------------------------------------------- /pascal.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | from subprocess import Popen,PIPE 4 | import sys 5 | 6 | try: 7 | import json 8 | except ImportError: 9 | import simplejson as json 10 | 11 | 12 | 13 | result = {} 14 | 15 | result['all'] = {} 16 | 17 | 18 | 19 | pipe = Popen(['getent', 'hosts'], stdout=PIPE, universal_newlines=True) 20 | 21 | 22 | result['all']['hosts'] = [] 23 | 24 | for line in pipe.stdout.readlines(): 25 | s = line.split() 26 | result['all']['hosts']=result['all']['hosts']+s 27 | 28 | 29 | result['all']['vars'] = {} 30 | 31 | 32 | if len(sys.argv) == 2 and sys.argv[1] == '--list': 33 | print(json.dumps(result)) 34 | 35 | elif len(sys.argv) == 3 and sys.argv[1] == '--host': 36 | print(json.dumps({})) 37 | 38 | else: 39 | print("Requires an argument, please use --list or --host ") 40 | -------------------------------------------------------------------------------- /lesson11-lab/setup_repo.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install FTP to export repo 3 | hosts: localhost 4 | tasks: 5 | - name: install FTP server 6 | yum: 7 | name: vsftpd 8 | state: latest 9 | - name: start FTP server 10 | service: 11 | name: vsftpd 12 | state: started 13 | enabled: yes 14 | - name: open firewall for FTP 15 | firewalld: 16 | service: ftp 17 | state: enabled 18 | permanent: yes 19 | 20 | - name: setup the repo directory 21 | hosts: localhost 22 | tasks: 23 | - name: make directory 24 | file: 25 | path: /var/ftp/repo 26 | state: directory 27 | - name: download packages 28 | yum: 29 | name: nmap 30 | download_only: yes 31 | dowload_dir: /var/ftp/repo 32 | - name: createrepo 33 | command: createrepo /var/ftp/repo 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /setup-storage-test.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: configure Apache storage configuration 3 | hosts: lamp 4 | vars_files: 5 | - vars/storage.yml 6 | tasks: 7 | - name: verify partition existence 8 | parted: 9 | device: /dev/sdb 10 | state: present 11 | number: "{{ item.number }}" 12 | part_start: "{{ item.start }}" 13 | part_end: "{{ item.end }}" 14 | loop: "{{ partitions }}" 15 | - name: verify VG existence 16 | debug: 17 | msg: TODO 18 | loop: "{{ vgs }}" 19 | - name: create LVs if needed 20 | debug: 21 | msg: TODO 22 | loop: "{{ lvs }}" 23 | when: true 24 | - name: verify XFS filesystem on each LV 25 | debug: 26 | msg: TODO 27 | loop: "{{ lvs }}" 28 | - name: mount LVs 29 | debug: 30 | msg: TODO 31 | loop: "{{ lvs }}" 32 | 33 | -------------------------------------------------------------------------------- /setup-storage-lvm.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: configure Apache storage configuration 3 | hosts: lamp 4 | vars_files: 5 | - vars/storage.yml 6 | tasks: 7 | - name: verify partition existence 8 | parted: 9 | device: /dev/sdb 10 | state: present 11 | number: "{{ item.number }}" 12 | part_start: "{{ item.start }}" 13 | part_end: "{{ item.end }}" 14 | loop: "{{ partitions }}" 15 | - name: verify VG existence 16 | lvg: 17 | vg: "{{ item.name }}" 18 | pvs: "{{ item.devices }}" 19 | loop: "{{ vgs }}" 20 | - name: create LVs if needed 21 | lvol: 22 | vg: "{{ item.vgroup }}" 23 | lv: "{{ item.name }}" 24 | size: "{{ item.size }}" 25 | loop: "{{ lvs }}" 26 | when: item.name not in ansible_lvm["lvs"] 27 | - name: verify XFS filesystem on each LV 28 | debug: 29 | msg: TODO 30 | loop: "{{ lvs }}" 31 | - name: mount LVs 32 | debug: 33 | msg: TODO 34 | loop: "{{ lvs }}" 35 | 36 | -------------------------------------------------------------------------------- /setup-storage-lvm-2.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: configure Apache storage configuration 3 | hosts: lamp 4 | vars_files: 5 | - vars/storage.yml 6 | tasks: 7 | - name: verify partition existence 8 | parted: 9 | device: /dev/sdb 10 | state: present 11 | number: "{{ item.number }}" 12 | part_start: "{{ item.start }}" 13 | part_end: "{{ item.end }}" 14 | loop: "{{ partitions }}" 15 | - name: verify VG existence 16 | lvg: 17 | vg: "{{ item.name }}" 18 | pvs: "{{ item.devices }}" 19 | loop: "{{ vgs }}" 20 | - name: create LVs if needed 21 | lvol: 22 | vg: "{{ item.vgroup }}" 23 | lv: "{{ item.name }}" 24 | size: "{{ item.size }}" 25 | loop: "{{ lvs }}" 26 | when: item.name not in ansible_lvm["lvs"] 27 | - name: verify XFS filesystem on each LV 28 | debug: 29 | msg: TODO 30 | loop: "{{ lvs }}" 31 | - name: mount LVs 32 | debug: 33 | msg: TODO 34 | loop: "{{ lvs }}" 35 | 36 | -------------------------------------------------------------------------------- /web-setup-and-test.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: enable webserver 3 | hosts: ansible1 4 | tasks: 5 | - name: install httpd and firewalld 6 | yum: 7 | name: 8 | - httpd 9 | - firewalld 10 | state: latest 11 | - name: install welcome page 12 | copy: 13 | content: "hello world" 14 | dest: /var/www/html/index.html 15 | - name: start web services 16 | service: 17 | name: httpd 18 | enabled: true 19 | state: started 20 | - name: start firewalld services 21 | service: 22 | name: firewalld 23 | enabled: true 24 | state: started 25 | - name: open firewalld 26 | firewalld: 27 | service: http 28 | permanent: true 29 | state: enabled 30 | immediate: yes 31 | 32 | - name: test webserver access 33 | hosts: localhost 34 | become: no 35 | tasks: 36 | - name: connect to the web server 37 | uri: 38 | url: http://ansible1.example.com 39 | return_content: yes 40 | status_code: 200 41 | -------------------------------------------------------------------------------- /setup_users.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: create some users 3 | hosts: all 4 | vars_files: 5 | - vars/users 6 | - vars/groups 7 | tasks: 8 | - name: add groups 9 | group: 10 | name: "{{ item.groupname }}" 11 | loop: "{{ usergroups }}" 12 | - name: add users 13 | user: 14 | name: "{{ item.username }}" 15 | groups: "{{ item.groups }}" 16 | loop: "{{ users }}" 17 | - name: add SSH public keys 18 | authorized_key: 19 | user: "{{ item.username }}" 20 | key: "{{ lookup('file', 'files/'+ item.username + '/id_rsa.pub') }}" 21 | loop: "{{ users }}" 22 | - name: add sales group members to sudo 23 | copy: 24 | content: "%sales ALL=(ALL) NOPASSWD: ALL" 25 | dest: /etc/sudoers.d/sales 26 | mode: 0440 27 | - name: disable root SSH login 28 | lineinfile: 29 | dest: /etc/ssh/sshd_config 30 | regexp: "^PermitRootLogin" 31 | line: "PermitRootLogin no" 32 | notify: restart sshd 33 | 34 | handlers: 35 | - name: restart sshd 36 | service: 37 | name: sshd 38 | state: restarted 39 | -------------------------------------------------------------------------------- /setup_repo_client.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: configure repository 3 | hosts: all 4 | vars: 5 | my_package: nmap 6 | tasks: 7 | - name: get package facts 8 | package_facts: 9 | manager: auto 10 | - name: show package facts for my_package 11 | debug: 12 | var: ansible_facts.packages[my_package] 13 | when: my_package in ansible_facts.packages 14 | - name: connect to example repo 15 | yum_repository: 16 | name: lesson11 17 | description: RHCE9 lesson 11 repo 18 | file: lesson 11 19 | baseurl: ftp://control.example.com/repo/ 20 | gpgcheck: yes 21 | # - name: install repo GPG key 22 | # rpm_key: 23 | # key: ftp://control.example.com/repo/repo-gpg-key 24 | # state: present 25 | - name: install package 26 | yum: 27 | name: "{{ my_package }}" 28 | state: present 29 | - name: update package facts 30 | package_facts: 31 | manager: auto 32 | - name: show package facts for my_package 33 | debug: 34 | var: ansible_facts.packages[my_package] 35 | when: my_package in ansible_facts.packages 36 | 37 | -------------------------------------------------------------------------------- /lesson11-lab/setup_repo_client.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: configure repository 3 | hosts: all 4 | vars: 5 | my_package: nmap 6 | tasks: 7 | - name: get package facts 8 | package_facts: 9 | manager: auto 10 | - name: show package facts for my_package 11 | debug: 12 | var: ansible_facts.packages[my_package] 13 | when: my_package in ansible_facts.packages 14 | - name: connect to example repo 15 | yum_repository: 16 | name: lesson11 17 | description: RHCE9 lesson 11 repo 18 | file: lesson 11 19 | baseurl: ftp://control.example.com/repo/ 20 | gpgcheck: yes 21 | # - name: install repo GPG key 22 | # rpm_key: 23 | # key: ftp://control.example.com/repo/repo-gpg-key 24 | # state: present 25 | - name: install package 26 | yum: 27 | name: "{{ my_package }}" 28 | state: present 29 | - name: update package facts 30 | package_facts: 31 | manager: auto 32 | - name: show package facts for my_package 33 | debug: 34 | var: ansible_facts.packages[my_package] 35 | when: my_package in ansible_facts.packages 36 | 37 | -------------------------------------------------------------------------------- /setup-storage.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: configure Apache storage configuration 3 | hosts: lamp 4 | vars_files: 5 | - vars/storage.yml 6 | tasks: 7 | - name: verify partition existence 8 | parted: 9 | device: /dev/sdb 10 | state: present 11 | number: "{{ item.number }}" 12 | part_start: "{{ item.start }}" 13 | part_end: "{{ item.end }}" 14 | loop: "{{ partitions }}" 15 | - name: verify VG existence 16 | lvg: 17 | vg: "{{ item.name }}" 18 | pvs: "{{ item.devices }}" 19 | loop: "{{ vgs }}" 20 | - name: create LVs if needed 21 | lvol: 22 | vg: "{{ item.vgroup }}" 23 | lv: "{{ item.name }}" 24 | size: "{{ item.size }}" 25 | loop: "{{ lvs }}" 26 | when: item.name not in ansible_lvm["lvs"] 27 | - name: verify XFS filesystem on each LV 28 | filesystem: 29 | dev: "/dev/{{ item.vgroup }}/{{ item.name }}" 30 | fstype: xfs 31 | loop: "{{ lvs }}" 32 | - name: mount LVs 33 | mount: 34 | path: "{{ item.path }}" 35 | src: "/dev/{{ item.vgroup }}/{{ item.name }}" 36 | fstype: xfs 37 | state: mounted 38 | loop: "{{ lvs }}" 39 | 40 | -------------------------------------------------------------------------------- /users-advanced.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: create users on localhost 3 | hosts: localhost 4 | vars_files: 5 | - exercise134-vars.yaml 6 | tasks: 7 | - name: include user and group setup 8 | import_tasks: exercise134-tasks.yaml 9 | - name: create a directory to store the file 10 | file: 11 | name: "{{ item.username }}" 12 | state: directory 13 | loop: "{{ users }}" 14 | - name: copy the local user ssh key to temporary {{ item.username }} key 15 | shell: 'cat /home/{{ item.username }}/.ssh/id_rsa.pub > {{ item.username }}/id_rsa.pub' 16 | loop: "{{ users }}" 17 | - name: verify that file exists 18 | command: ls -l {{ item.username }}/ 19 | loop: "{{ users }}" 20 | tags: setuplocal 21 | 22 | - name: create users on managed host 23 | hosts: ansible4 24 | vars_files: 25 | - exercise134-vars.yaml 26 | tasks: 27 | - name: include user and group setup 28 | import_tasks: exercise134-tasks.yaml 29 | - name: copy authorized keys 30 | authorized_key: 31 | user: "{{ item.username }}" 32 | key: "{{ lookup('file', './'+ item.username +'/id_rsa.pub') }}" 33 | loop: "{{ users }}" 34 | - name: copy sudoers file 35 | copy: 36 | content: '%admins ALL=(ALL:ALL) NOPASSWD:ALL' 37 | dest: /etc/sudoers.d/admins 38 | tags: setupremote 39 | -------------------------------------------------------------------------------- /users_vault.yml: -------------------------------------------------------------------------------- 1 | $ANSIBLE_VAULT;1.1;AES256 2 | 34333165653737316566323439363364313637396330663665303961386634633535383434633863 3 | 3463656638393765646232646436396335633466666265620a613063346533323863663138613834 4 | 34656538616332636637653235613632613762623836333836363364643663356138646330663835 5 | 3431303038396464320a623166623364313933376431396238376537633664643833313138623263 6 | 64393038316161613534613637653165313637623633353563623163346533343535343263303139 7 | 36613934656438653632336434363964653464346363653335356133626364616339663162653636 8 | 63326437646639303162623963633931336530336334303037306632623565373335633634363232 9 | 66383536333764313164636662366337346361396131356231303631316238383036326631326630 10 | 64653164336362353738626164316232626463653430316635343063303035616339663162363039 11 | 38633838626433646631313534316136303964393931323165623734373332366631613339393234 12 | 32323637323062383332366537653665343930393933336366313533383161346661393531633635 13 | 32613839346637366636313037373231643934643565386333626634303337633861626265613061 14 | 65333762303063363966353765306632613166633162333230363165646134323030656535643137 15 | 37343838653764393138343532626135346431346261336330393139643163323235373832366138 16 | 37346565646265636661653066656234356636353334313366383931313363376165666330353562 17 | 62393131333239646533 18 | -------------------------------------------------------------------------------- /checkseconddiskv2.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Play second disk checker 3 | hosts: all 4 | gather_facts: no 5 | become: no 6 | tasks: 7 | # Note: uses the length filter 8 | # 9 | # lsblk has a TYPE column that distinguishes between disks, partitions, 10 | # and optical media and does not make assumptions about the disk 11 | # driver (i.e. also works with NVME drives) 12 | # 13 | # command and shell modules in combination with register are useful for 14 | # gathering info not in facts and idempotent so long the they run 15 | # commands that don't make changes. However, they mistakenly assume 16 | # a change was made if successful so you need "changed_when: false" 17 | # to correct the playbook summary lines. 18 | - name: Gather disk info 19 | shell: lsblk -o NAME,TYPE | awk '/disk/ { print $1; }' 20 | changed_when: false 21 | register: lsblk 22 | - name: printf-style debugging 23 | ansible.builtin.debug: 24 | var: lsblk 25 | - name: Ensure debug message is printed 26 | ansible.builtin.debug: 27 | msg: "You have a second disk" 28 | when: lsblk.stdout_lines | length > 1 29 | - name: Ensure debug message is printed 30 | ansible.builtin.debug: 31 | msg: "You DO NOT have a second disk" 32 | when: lsblk.stdout_lines | length < 2 33 | 34 | -------------------------------------------------------------------------------- /storage-advanced.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: set up hosts that have an sdb device 3 | hosts: all 4 | tasks: 5 | - name: getting out with a nice failure message if there is no second disk 6 | fail: 7 | msg: there is no second disk 8 | when: ansible_facts['devices']['sdb'] is not defined 9 | - name: create a partition 10 | parted: 11 | device: /dev/sdb 12 | number: 1 13 | state: present 14 | - name: create a volume group 15 | lvg: 16 | pvs: /dev/sdb1 17 | vg: vgfiles 18 | - name: run the setup module so that we can use updated facts 19 | setup: 20 | - name: get vg size and convert to integer in new variable 21 | set_fact: 22 | vgsize: "{{ ansible_facts['lvm']['vgs']['vgfiles']['size_g'] | int }}" 23 | - name: show vgsize value 24 | debug: 25 | var: "{{ vgsize }}" 26 | - name: create an LVM on big volume groups 27 | lvol: 28 | vg: vgfiles 29 | lv: lvfiles 30 | size: 6g 31 | when: vgsize | int > 5 32 | - name: create an LVM on small volume groups 33 | lvol: 34 | vg: vgfiles 35 | lv: lvfiles 36 | size: 3g 37 | when: vgsize | int <= 5 38 | - name: formatting the XFS filesystem 39 | filesystem: 40 | dev: /dev/vgfiles/lvfiles 41 | fstype: xfs 42 | - name: mounting /dev/vgfile/lvfiles 43 | mount: 44 | path: /files 45 | state: mounted 46 | src: /dev/vgfiles/lvfiles 47 | fstype: xfs 48 | -------------------------------------------------------------------------------- /roles/motd/README.md: -------------------------------------------------------------------------------- 1 | Role Name 2 | ========= 3 | 4 | A brief description of the role goes here. 5 | 6 | Requirements 7 | ------------ 8 | 9 | Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. 10 | 11 | Role Variables 12 | -------------- 13 | 14 | A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. 15 | 16 | Dependencies 17 | ------------ 18 | 19 | A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. 20 | 21 | Example Playbook 22 | ---------------- 23 | 24 | Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: 25 | 26 | - hosts: servers 27 | roles: 28 | - { role: username.rolename, x: 42 } 29 | 30 | License 31 | ------- 32 | 33 | BSD 34 | 35 | Author Information 36 | ------------------ 37 | 38 | An optional section for the role authors to include contact information, or a website (HTML is not allowed). 39 | -------------------------------------------------------------------------------- /roles/mywebhost/README.md: -------------------------------------------------------------------------------- 1 | Role Name 2 | ========= 3 | 4 | A brief description of the role goes here. 5 | 6 | Requirements 7 | ------------ 8 | 9 | Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. 10 | 11 | Role Variables 12 | -------------- 13 | 14 | A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well. 15 | 16 | Dependencies 17 | ------------ 18 | 19 | A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles. 20 | 21 | Example Playbook 22 | ---------------- 23 | 24 | Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: 25 | 26 | - hosts: servers 27 | roles: 28 | - { role: username.rolename, x: 42 } 29 | 30 | License 31 | ------- 32 | 33 | BSD 34 | 35 | Author Information 36 | ------------------ 37 | 38 | An optional section for the role authors to include contact information, or a website (HTML is not allowed). 39 | -------------------------------------------------------------------------------- /userkeys.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: create remote management user 3 | hosts: ansible2 4 | tasks: 5 | - name: create user ansible 6 | user: 7 | name: ansible 8 | - name: give them sudo privileges 9 | lineinfile: 10 | path: /etc/sudoers.d/ansible 11 | state: present 12 | create: true 13 | mode: 0440 14 | line: 'ansible ALL=(ALL) NOPASSWD: ALL' 15 | validate: /usr/sbin/visudo -cf %s 16 | - debug: 17 | msg: the remote management user is now created and has sudo privileges 18 | 19 | - name: manage user keys 20 | hosts: localhost 21 | become: true 22 | tasks: 23 | - name: create a directory to store the file that authorized_keys is going to distribute 24 | file: 25 | name: ansiblekey 26 | state: directory 27 | delegate_to: localhost 28 | - name: copy the local user ansible ssh key to this directory 29 | shell: 'cat /home/ansible/.ssh/id_rsa.pub > ansiblekey/id_rsa.pub' 30 | - debug: 31 | msg: the local management user key is now in a place where it can be used 32 | 33 | 34 | - name: create another remote user with a key 35 | hosts: ansible2 36 | tasks: 37 | - name: copy the management user authorized key to the management host 38 | authorized_key: 39 | user: ansible 40 | key: "{{ lookup('file', './ansiblekey/id_rsa.pub') }}" 41 | - name: create a remote user with an SSH key pair 42 | user: 43 | name: anna 44 | generate_ssh_key: true 45 | ssh_key_bits: 2048 46 | ssh_key_file: .ssh/ansiblekey_rsa 47 | 48 | -------------------------------------------------------------------------------- /lab/lab-playbook.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: all 3 | vars: 4 | firewall: firewalld 5 | 6 | tasks: 7 | - name: install the firewall 8 | yum: 9 | name: "{{ firewall }}" 10 | state: latest 11 | 12 | - name: start the firewall 13 | service: 14 | name: "{{ firewall }}" 15 | state: started 16 | enabled: true 17 | 18 | 19 | - hosts: lamp 20 | tasks: 21 | - name: include the variable file 22 | include_vars: lab-vars/allvars.yml 23 | 24 | - name: include the tasks 25 | include: lab-tasks/lamp.yml 26 | 27 | - name: open the port for the web server 28 | firewalld: 29 | service: http 30 | state: enabled 31 | immediate: true 32 | permanent: true 33 | 34 | - name: create index.html 35 | copy: 36 | content: "{{ ansible_fqdn }}({{ ansible_default_ipv4.address }}) managed by Ansible\n" 37 | dest: "{{ web_root }}/index.html" 38 | 39 | - hosts: file 40 | tasks: 41 | - name: include the variabe file 42 | include_vars: lab-vars/allvars.yml 43 | 44 | - name: include the tasks 45 | include: lab-tasks/file.yml 46 | 47 | - name: open the port for the ftp service 48 | firewalld: 49 | service: smb 50 | state: enabled 51 | immediate: true 52 | permanent: true 53 | 54 | - name: open the port for the smb service 55 | firewalld: 56 | service: ftp 57 | state: enabled 58 | immediate: true 59 | permanent: true 60 | 61 | 62 | -------------------------------------------------------------------------------- /lab7.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: install vsftpd 3 | hosts: ansible2.example.com 4 | tasks: 5 | - name: get basic vsftpd operational 6 | yum: 7 | name: vsftpd 8 | state: installed 9 | - name: start and enable vsftpd 10 | service: 11 | name: vsftpd 12 | enabled: yes 13 | state: started 14 | - name: open port in firewall 15 | firewalld: 16 | service: ftp 17 | permanent: yes 18 | immediate: yes 19 | state: enabled 20 | 21 | - name: configure VSFTPD using a template 22 | hosts: ansible2.example.com 23 | vars: 24 | anonymous_enable: yes 25 | local_enable: yes 26 | write_enable: yes 27 | anon_upload_enable: yes 28 | tasks: 29 | - name: use template to copy FTP config 30 | template: 31 | src: vsftpd.j2 32 | dest: /etc/vsftpd/vsftpd.conf 33 | 34 | - name: configure vsftpd permissions and selinux 35 | hosts: ansible2.example.com 36 | tasks: 37 | - name: install required selinux tools 38 | yum: 39 | name: policycoreutils-python-utils 40 | state: present 41 | - name: set permissions 42 | file: 43 | path: /var/ftp/pub 44 | mode: '0777' 45 | - name: set selinux boolean 46 | seboolean: 47 | name: ftpd_anon_write 48 | state: yes 49 | persistent: yes 50 | - name: manage selinux settings 51 | sefcontext: 52 | target: /var/ftp/pub 53 | setype: public_content_rw_t 54 | state: present 55 | notify: 56 | - run restorecon 57 | handlers: 58 | - name: run restorecon 59 | command: restorecon -vR /var/ftp/pub 60 | 61 | -------------------------------------------------------------------------------- /roles/mywebhost/meta/main.yml: -------------------------------------------------------------------------------- 1 | galaxy_info: 2 | author: your name 3 | description: your role description 4 | company: your company (optional) 5 | 6 | # If the issue tracker for your role is not on github, uncomment the 7 | # next line and provide a value 8 | # issue_tracker_url: http://example.com/issue/tracker 9 | 10 | # Choose a valid license ID from https://spdx.org - some suggested licenses: 11 | # - BSD-3-Clause (default) 12 | # - MIT 13 | # - GPL-2.0-or-later 14 | # - GPL-3.0-only 15 | # - Apache-2.0 16 | # - CC-BY-4.0 17 | license: license (GPL-2.0-or-later, MIT, etc) 18 | 19 | min_ansible_version: 2.9 20 | 21 | # If this a Container Enabled role, provide the minimum Ansible Container version. 22 | # min_ansible_container_version: 23 | 24 | # 25 | # Provide a list of supported platforms, and for each platform a list of versions. 26 | # If you don't wish to enumerate all versions for a particular platform, use 'all'. 27 | # To view available platforms and versions (or releases), visit: 28 | # https://galaxy.ansible.com/api/v1/platforms/ 29 | # 30 | # platforms: 31 | # - name: Fedora 32 | # versions: 33 | # - all 34 | # - 25 35 | # - name: SomePlatform 36 | # versions: 37 | # - all 38 | # - 1.0 39 | # - 7 40 | # - 99.99 41 | 42 | galaxy_tags: [] 43 | # List tags for your role here, one per line. A tag is a keyword that describes 44 | # and categorizes the role. Users find roles by searching for tags. Be sure to 45 | # remove the '[]' above, if you add tags to this list. 46 | # 47 | # NOTE: A tag is limited to a single word comprised of alphanumeric characters. 48 | # Maximum 20 tags per role. 49 | 50 | dependencies: [] 51 | # List your role dependencies here, one per line. Be sure to remove the '[]' above, 52 | # if you add dependencies to this list. 53 | -------------------------------------------------------------------------------- /software-advanced.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: add host to inventory 3 | hosts: localhost 4 | tasks: 5 | - fail: 6 | msg: "add the options -e newhost=hostname -e newhostip=ip.ad.dr.ess and try again" 7 | when: (newhost is undefined) or (newhostip is undefined) 8 | - name: add new host to inventory 9 | lineinfile: 10 | path: inventory 11 | state: present 12 | line: "{{ newhost }}" 13 | - name: add new host to /etc/hosts 14 | lineinfile: 15 | path: /etc/hosts 16 | state: present 17 | line: "{{ newhostip }} {{ newhost }}" 18 | tags: addhost 19 | 20 | - name: configure a new RHEL host 21 | hosts: "{{ newhost }}" 22 | remote_user: root 23 | become: false 24 | tasks: 25 | - name: configure user ansible 26 | user: 27 | name: ansible 28 | groups: wheel 29 | append: yes 30 | state: present 31 | - name: set a password for this user 32 | shell: 'echo password | passwd --stdin ansible' 33 | - name: enable sudo without passwords 34 | lineinfile: 35 | path: /etc/sudoers 36 | regexp: '^%wheel' 37 | line: '%wheel ALL=(ALL) NOPASSWD: ALL' 38 | validate: /usr/sbin/visudo -cf %s 39 | - name: create SSH directory in user ansible home 40 | file: 41 | path: /home/ansible/.ssh 42 | state: directory 43 | owner: ansible 44 | group: ansible 45 | - name: copy SSH public key to remote host 46 | copy: 47 | src: /home/ansible/.ssh/id_rsa.pub 48 | dest: /home/ansible/.ssh/authorized_keys 49 | tags: setuphost 50 | 51 | - name: use subscription manager to register and set up repos 52 | hosts: "{{ newhost }}" 53 | vars_files: 54 | - exercise123-vault.yaml 55 | tasks: 56 | - name: register and subscribe {{ newhost }} 57 | redhat_subscription: 58 | username: "{{ rhsm_user }}" 59 | password: "{{ rhsm_password }}" 60 | state: present 61 | - name: configure additional repo access 62 | rhsm_repository: 63 | name: 64 | - rh-gluster-3-client-for-rhel-8-x86_64-rpms 65 | - rhel-8-for-x86_64-appstream-debug-rpms 66 | state: present 67 | tags: registerhost 68 | -------------------------------------------------------------------------------- /sept25.txt: -------------------------------------------------------------------------------- 1 | 1 ssh-keygen 2 | 2 for i in control ansible1 ansible2; do ssh-copy-id $i; done 3 | 3 ansible -i inventory all -u ansible -m command -a "id" 4 | 4 vim inventory 5 | 5 ansible -i inventory all -u ansible -m command -a "id" 6 | 6 ansible -i inventory all -u ansible -b -K -m command -a "ls -l /root" 7 | 7 ansible -i inventory all -u student -k -b -K -m shell -a 'echo "ansible ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/ansible' 8 | 8 ansible -i inventory all -u ansible -b -K -m command -a "ls -l /root" 9 | 9 ansible -i inventory all -u ansible -b -m command -a "ls -l /root" 10 | 10 git clone https://github.com/sandervanvugt/rhce9 11 | 11 cd rhce9/ 12 | 12 history 13 | 13 exit 14 | 14 history 15 | 15 sudo vim /etc/ssh/sshd_config 16 | 16 vim /etc/ansible/hosts 17 | 17 cd rhce9/ 18 | 18 cp ../inventory . 19 | 19 vim ansible.cfg 20 | 20 ansible all -m command -a "ls -l /root" 21 | 21 ansible --version 22 | 22 cd 23 | 23 ansible --version 24 | 24 vim /etc/ansible/ansible.cfg 25 | 25 cd rhce9/ 26 | 26 ls 27 | 27 vim setupnewhost.yml 28 | 28 podman login registry.redhat.io 29 | 29 podman pull registry.redhat.io/ansible-automation-platform-24/ee-supported-rhel9:latest 30 | 30 podman images 31 | 31 ansible-navigator images 32 | 32 ls 33 | 33 ls | grep http 34 | 34 vim install-httpd.yml 35 | 35 ansible-navigator run install-httpd.yml 36 | 36 ls 37 | 37 ls -lrt 38 | 38 less install-httpd-artifact-2025-09-22T15\:47\:07.983832+00\:00.json 39 | 39 ansible-navigator collecitons 40 | 40 ansible-navigator collections 41 | 41 ansible-navigator images 42 | 42 ansible-navigator images --pp never 43 | 43 podman pull registry.redhat.io/ansible-automation-platform-24/ee-minimal-rhel9:latest 44 | 44 ansible-navigator images --pp never 45 | 45 ansible-navigator --eei registry.redhat.io/ansible-automation-platform-24/ee-supported-rhel9:latest --pp never 46 | 46 ansible-navigator --eei registry.redhat.io/ansible-automation-platform-24/ee-minimal-rhel9:latest --pp never 47 | 47 cd .. 48 | 48 git clone https://github.com/sandervanvugt/ansiblebg 49 | 49 git clone https://github.com/sandervanvugt/ansible_ccat 50 | 50 cd ansible_ccat/ 51 | 51 ls 52 | 52 ansible-navigator run enforce-selinux.yml --eei registry.redhat.io/ansible-automation-platform-24/ee-minimal-rhel9:latest --pp never 53 | 53 mkdir collections 54 | 54 ansible-galaxy collection install ansible.posix -p collections 55 | 55 ansible-navigator run enforce-selinux.yml --eei registry.redhat.io/ansible-automation-platform-24/ee-minimal-rhel9:latest --pp never 56 | 56 history 57 | 57 cd ../rhce9/ 58 | 58 ansible-galaxy collection install community.crypto -p collections 59 | 59 ansible-galaxy collection list 60 | 60 ansible-navigator 61 | 61 vim ansible.cfg 62 | 62 ansible-galaxy collection list 63 | 63 vim ansible.cfg 64 | 64 ansible-galaxy collection list 65 | 65 ansible ansible1 -m setup | less 66 | 66 ls 67 | 67 cd .. 68 | 68 git clone https://github.com/sandervanvugt/ansiblefundamentals 69 | 69 cd ansiblefundamentals/ 70 | 70 ls 71 | 71 vim variables_example.yaml 72 | 72 ansible-playbook variables_example.yaml 73 | 73 ansible-playbook -i ../rhce9/inventory variables_example.yaml 74 | 74 vim variables_example.yaml 75 | 75 ansible-playbook -i ../rhce9/inventory variables_example.yaml -e user=linda 76 | 76 vim variables_example.yaml 77 | 77 vim myusers.yml 78 | 78 ansible-playbook -i ../rhce9/inventory variables_example.yaml 79 | 79 vim variables_example.yaml 80 | 80 ansible-playbook -i ../rhce9/inventory variables_example.yaml 81 | 81 vim variables_example.yaml 82 | 82 ansible-doc -l 83 | 83 ansible-doc -t 84 | 84 ansible-doc -t keyword -l 85 | 85 ansible-doc -t keyword vars_files 86 | 86 ansible-doc -t help 87 | 87 mkdir host_vars 88 | 88 vim host_vars/ansible1 89 | 89 vim host_vars/ansible2 90 | 90 history 91 | 91 vim variables_example.yaml 92 | 92 ansible-playbook -i ../rhce9/inventory variables_example.yaml 93 | 93 vim variables_example.yaml 94 | 94 ansible-playbook -i ../rhce9/inventory variables_example.yaml 95 | 95 history 96 | 96 cd ../rhce9/ 97 | 97 ls | grep register 98 | 98 ls -l | grep register 99 | 99 vim register.yml 100 | 100 ansible-playbook register.yml 101 | 101 vim register.yml 102 | 102 ansible-playbook register.yml 103 | 103 ansible-vault create sensitive-values 104 | 104 cat sensitive-values 105 | 105 ansible-vault view sensitive-values 106 | 106 ansible-vault edit sensitive-values 107 | 107 ansible-vault --help 108 | 108 ansible-vault create secret.yml 109 | 109 grep secret.yml * 110 | 110 vim create-user.yml 111 | 111 ansible-doc user 112 | 112 vim create-user.yml 113 | 113 ansible-playbook create-user.yml 114 | 114 ansible-playbook --ask-vault-pass create-user.yml 115 | 115 ansible ansible1 -a "tail -1 /etc/shadow" 116 | 116 echo password > ../vault-pass 117 | 117 chmod 600 ../vault-pass 118 | 118 ansible-playbook --vault-password-file=../vault-pass create-user.yml 119 | 119 ansible ansible1 -m command -a "useradd bill" 120 | 120 ansible ansible1 -m user -a "name=bill" 121 | 121 history 122 | 122 vim facts.yml 123 | 123 ansible-playbook facts.yml | less 124 | 124 ansible -m setup ansible1 | less 125 | 125 vim ipfact.yml 126 | 126 ansible-playbook ipfact.yml 127 | 127 vim ipfact.yml 128 | 128 ansible-playbook ipfact.yml 129 | 129 vim ipfact.yml 130 | 130 ansible-playbook ipfact.yml 131 | 131 vim ipfact.yml 132 | 132 ansible-playbook ipfact.yml 133 | 133 ansible-playbook facts.yml | less 134 | 134 ls 135 | 135 cd .. 136 | 136 find . -name "users-dictionary" 137 | 137 cd ansible_ccat/arrays/ 138 | 138 ls 139 | 139 vim multi-list.yml 140 | 140 vim vars/users-list 141 | 141 vim multi-dictionary.yml 142 | 142 vim vars/users-dictionary 143 | 143 cd 144 | 144 history > /tmp/sept25.txt 145 | 145 ip a 146 | 146 ansible-playbook --help | less 147 | 147 ansible ansible1 -m setup | less 148 | 148 ls 149 | 149 cd rhce9/ 150 | 150 ansible ansible1 -m setup | less 151 | 151 cd ../ansible_ccat/ 152 | 152 ls 153 | 153 cd arrays/ 154 | 154 ls 155 | 155 cat inventory 156 | 156 rm inventory 157 | 157 vim inventory 158 | 158 vim multi-list.yml 159 | 159 vim vars/users-list 160 | 160 ansible-playbook multi-list.yml 161 | 161 ls 162 | 162 vim multi-dictionary.yml 163 | 163 vim vars/users-dictionary 164 | 164 ansible-playbook multi-dictionary.yml 165 | 165 vim vars/users-dictionary 166 | 166 vim multi-dictionary.yml 167 | 167 vim vars/users-dictionary 168 | 168 ansible-playbook multi-dictionary.yml 169 | 169 cd .. 170 | 170 cd ../rhce9/ 171 | 171 vim newlocalfacts.yml 172 | 172 vim localfacts.yml 173 | 173 find . -name "localfacts.fact" 174 | 174 cp lesson7/facts/localfacts.fact . 175 | 175 vim localfacts.fact 176 | 176 ansible-playbook newlocalfacts.yml 177 | 177 ansible ansible1 -m setup -a "filter=ansible_local" 178 | 178 vim localfacts.yml 179 | 179 grep set_fact * 180 | 180 vim set-fact.yaml 181 | 181 vim storage-advanced.yml 182 | 182 vim get-diskname.yml 183 | 183 vim loopservices.yml 184 | 184 ansible-doc service 185 | 185 ansible-doc dnf 186 | 186 ansible-doc service 187 | 187 vim loopservices.yml 188 | 188 ansible-playbook loopservices.yml 189 | 189 vim loop-over-variable.yml 190 | 190 vim loopvars.yml 191 | 191 vim loop-over-variable.yml 192 | 192 ansible loop-over-variable.yml 193 | 193 ansible-playbook loop-over-variable.yml 194 | 194 vim loopusers.yml 195 | 195 ansible-playbook loopusers.yml 196 | 196 vim distro.yml 197 | 197 ansible-playbook distro.yml 198 | 198 vim distro.yml 199 | 199 ansible-playbook distro.yml 200 | 200 vim distro.yml 201 | 201 ansible-playbook distro.yml 202 | 202 vim quicktest.yml 203 | 203 ansible-playbook quicktest.yml 204 | 204 vim quicktest.yml 205 | 205 ansible-playbook quicktest.yml 206 | 206 vim when_multiple.yml 207 | 207 ansible-playbook when_multiple.yml 208 | 208 vim when_multiple_complex.yml 209 | 209 ansible-playbook when_multiple_complex.yml 210 | 210 vim ifsize.yml 211 | 211 ansible-playbook ifsize.yml 212 | 212 vim ifsize.yml 213 | 213 ansible-playbook ifsize.yml 214 | 214 vim register.yml 215 | 215 ansible-playbook register.yml 216 | 216 vim register_command.yml 217 | 217 ansible-playbook register_command.yml 218 | 218 vim register_command.yml 219 | 219 history 220 | 220 vim handlers.yml 221 | 221 touch /tmp/index.html 222 | 222 ansible-playbook handlers.yml 223 | 223 vim handlers.yml 224 | 224 ansible-playbook handlers.yml 225 | 225 ansible control -m file -a "name=/var/www/html/index.html state=absent" 226 | 226 ansible-playbook handlers.yml 227 | 227 vim blocks.yml 228 | 228 vim block2.yaml 229 | 229 ansible-playbook block2.yaml 230 | 230 vim failure.yml 231 | 231 ansible-playbook failure.yml 232 | 232 vim listing725.yaml 233 | 233 ansible-playbook listing725.yaml 234 | 234 ansible ansible1 -a whoami 235 | 235 vim changed.yml 236 | 236 ansible-playbook changed.yml 237 | 237 vim changed.yml 238 | 238 ansible-playbook changed.yml 239 | 239 vim includes-and-imports.yml 240 | 240 vim tasks/firewall.yaml 241 | 241 vim tasks/service.yaml 242 | 242 ansible-playbook includes-and-imports.yml 243 | 243 ansible-galaxy collection install ansible.posix 244 | 244 ansible-playbook includes-and-imports.yml 245 | 245 vim imports.yml 246 | 246 vim vsftpd.j2 247 | 247 vim vsftpd.yml 248 | 248 ansible-playbook vsftpd.yml 249 | 249 vim vsftpd.yml 250 | 250 ansible-playbook vsftpd.yml 251 | 251 vim vsftpd.yml 252 | 252 ansible-playbook vsftpd.yml 253 | 253 vim vsftpd.yml 254 | 254 vim vsftpd-template.yml 255 | 255 ansible-playbook vsftpd-template.yml 256 | 256 cat /etc/vsftpd/vsftpd.conf 257 | 257 sudo cat /etc/vsftpd/vsftpd.conf 258 | 258 vim hostsfile.yml 259 | 259 vim hosts.j2 260 | 260 vim hostsfile.yml 261 | 261 ansible-playbook hostsfile.yml 262 | 262 cat /etc/hosts 263 | 263 ansible ansible1 -a "hostnamectl hostname ansible1.example.com" 264 | 264 ansible ansible2 -a "hostnamectl hostname ansible2.example.com" 265 | 265 ansible 192.168.29.140 -a "hostnamectl hostname ansible2.example.com" 266 | 266 ssh ansible2 267 | 267 ssh 192.168.29.140 268 | 268 history 269 | 269 ansible-galaxy role install geerlingguy.nginx 270 | 270 cd ~/.ansible/roles/geerlingguy.nginx/ 271 | 271 ls 272 | 272 cd tasks 273 | 273 ls 274 | 274 vim main.yml 275 | 275 vim setup-RedHat.yml 276 | 276 cd ~/rhce9/ 277 | 277 ansible-galaxy role list 278 | 278 vim nginx-role.yml 279 | 279 ansible-playbook nginx-role.yml 280 | 280 ansible-galaxy role init myrole 281 | 281 ansible-galaxy role list 282 | 282 ls 283 | 283 mv myrole/ ~/.ansible/roles/ 284 | 284 cd ~/.ansible/roles 285 | 285 ls 286 | 286 tree myrole 287 | 287 cd - 288 | 288 vim motd-role.yml 289 | 289 cd - 290 | 290 ansible-galaxy init role motd 291 | 291 ansible-galaxy role init motd 292 | 292 cd tasks 293 | 293 cd motd/ 294 | 294 vim tasks/main.yml 295 | 295 ansible-doc copy 296 | 296 cd - 297 | 297 cd ~/rhce9/ 298 | 298 ansible-playbook motd-role.yml 299 | 299 sudo vim /etc/hosts 300 | 300 sudo dnf install -y rhel-system-roles 301 | 301 rpm -ql rhel-system-roles 302 | 302 cd /usr/share/doc 303 | 303 ls 304 | 304 cd rhel-system-roles/ 305 | 305 ls 306 | 306 cd selinux/ 307 | 307 ls 308 | 308 cp example-selinux-playbook.yml ~/rhce9 309 | 309 cd ~/rhce9 310 | 310 vim example-selinux-playbook.yml 311 | 311 ansible-playbook example-selinux-playbook.yml 312 | 312 ls -lZd /web 313 | 313 vim assertstat.yml 314 | 314 vim assertsize.yml 315 | 315 ansible-playbook assertsize 316 | 316 ansible-playbook assertsize.yml 317 | 317 ./countdown 15 318 | 318 ls | grep stora 319 | 319 vim setup-storage-test.yml 320 | 320 vim storage-step1.yml 321 | 321 ansible-playbook storage-step1.yml 322 | 322 vim storage-step1.yml 323 | 323 vim storage-advanced.yml 324 | 324 ansible-playbook storage-advanced.yml 325 | 325 ansible-galaxy collection install community.general 326 | 326 vim storage-advanced.yml 327 | 327 ansible-playbook storage-advanced.yml 328 | 328 history > /tmp/sept25.txt 329 | -------------------------------------------------------------------------------- /feb25.txt: -------------------------------------------------------------------------------- 1 | 1 sudo subscription-manager register 2 | 2 id 3 | 3 sudo vim /etc/hosts 4 | 4 ping ansible1 5 | 5 ping ansible2 6 | 6 history 7 | 7 sudo dnf install -y git 8 | 8 git clone https://github.com/sandervanvugt/rhce9 9 | 9 history 10 | 10 cd rhce9/ 11 | 11 ls 12 | 12 history 13 | 13 sudo dnf repolist 14 | 14 sudo subscription-manager repost --list | grep -A3 automation-platform 15 | 15 sudo subscription-manager repos --list | grep -A3 automation-platform 16 | 16 sudo subscription-manager repos --enable ansible-automation-platform-2.4-for-rhel-9-aarch-roms 17 | 17 sudo dnf install ansible-core ansible-navigator 18 | 18 sudo dnf install ansible-core 19 | 19 sudo subscription-manager repos --enable ansible-automation-platform-2.4-for-rhel-9-aarch-rpms 20 | 20 sudo subscription-manager repost --list | grep -A3 automation-platform-2.4 21 | 21 sudo dnf repolist 22 | 22 sudo subscription-manager repos --list | grep ansible-automation 23 | 23 sudo subscription-manager repos --enable ansible-automation-platform-2.4-for-rhel-9-aarch64-rpms 24 | 24 history 25 | 25 sudo dnf repolist 26 | 26 sudo dnf install -y ansible-navigator 27 | 27 ansible --version 28 | 28 vim inventory 29 | 29 ansible -i inventory all -u root -k -m user -a "name=ansible" 30 | 30 ansible -i inventory all -u root -k -m shell -a "echo password | passwd --stdin ansible" 31 | 31 ssh-keygen 32 | 32 ssh-copy-id ansible1 33 | 33 ssh-copy-id ansible2 34 | 34 ansible -i inventory all -u ansible -b -m command -a "ls -l /root" -K 35 | 35 ansible -i inventory all -u ansible -b -K -m copy -a 'content="ansible ALL=(ALL) NOPASSWD: ALL" dest=/etc/sudoers.d/ansible' 36 | 36 ansible -i inventory all -m command -a "ls -l /root" -b 37 | 37 vim ansible.cfg 38 | 38 ansible all -a "ls -l /root" 39 | 39 history 40 | 40 vim /etc/ansible/hosts 41 | 41 vim /etc/ansible/ansible.cfg 42 | 42 ansible-config init --disabled > ansible.cfg-annoted 43 | 43 vim ansible.cfg-annoted 44 | 44 ansible --version 45 | 45 cd .. 46 | 46 ansible --version 47 | 47 cd rhce9/ 48 | 48 ansible-navigator images 49 | 49 podman login registry.redhat.io 50 | 50 ansible-navigator images 51 | 51 vim ansible-navigator.yml 52 | 52 ls 53 | 53 vim vsftpd.yml 54 | 54 vim simple.yml 55 | 55 ansible-navigator run simple.yml 56 | 56 vim ansible-navigator.yml 57 | 57 ansible-navigator run simple.yml 58 | 58 ansible-navigator run simple.yml -m stdout 59 | 59 vim ansible-navigator.yml 60 | 60 ls -lrt 61 | 61 vim simple-artifact-2025-02-24T14\:46\:40.715621+00\:00.json 62 | 62 ansible-doc -l 63 | 63 ansible-navigator collections 64 | 64 ansible-navigator images 65 | 65 podman pull registry.redhat.io/ansible-automation-platform-24/ee-minimal-rhel9:latest 66 | 66 podman images 67 | 67 ansible-navigator --eei registry.redhat.io/ansible-automation-platform-24/ee-minimal-rhel9:latest --pp never 68 | 68 cd .. 69 | 69 git clone https://github.com/sandervanvugt/ansiblebg 70 | 70 cd rhel9 71 | 71 ls 72 | 72 cd rhce9 73 | 73 ls 74 | 74 el enf* 75 | 75 ls enf* 76 | 76 ansible-navigator run enforce-selinux.yml --eei registry.redhat.io/ansible-automation-platform-24/ee-minimal-rhel9:latest --pp never 77 | 77 mkdir collections 78 | 78 ansible-galaxy collection install ansible.posix -p collections 79 | 79 ansible-navigator run enforce-selinux.yml --eei registry.redhat.io/ansible-automation-platform-24/ee-minimal-rhel9:latest --pp never 80 | 80 ssh ansible1 81 | 81 ls collections/ls 82 | 82 ls collections/ 83 | 83 ls collections/ansible_collections/ 84 | 84 ansible-playbook enforce-selinux.yml 85 | 85 pwd 86 | 86 vim ansible.cfg 87 | 87 ansible all -a "ls -l /root" 88 | 88 vim enforce-selinux 89 | 89 vim enforce-selinux.yml 90 | 90 ansible-playbook enforce-selinux.yml 91 | 91 ansible-navigator run enforce-selinux.yml --eei registry.redhat.io/ansible-automation-platform-24/ee-minimal-rhel9:latest --pp never 92 | 92 ansible-navigator settings --samples > my.yaml 93 | 93 ansible-navigator settings --sample > my.yaml 94 | 94 vim my.yaml 95 | 95 history 96 | 96 ansible-navigator run enforce-selinux.yml --eei registry.redhat.io/ansible-automation-platform-24/ee-minimal-rhel9:latest --pp never 97 | 97 history | grep confi 98 | 98 vim ansible.cfg-annoted 99 | 99 ansible-doc -l 100 | 100 vim enforce-selinux.yml 101 | 101 vim enforce-selinux-simplified.yml 102 | 102 ansible-playbook enforce-selinux-simplified.yml 103 | 103 sudo ls -l /root 104 | 104 ansible-playbook enforce-selinux-simplified.yml -K 105 | 105 ansible-galaxy collection install community.crypto -p collections 106 | 106 ansible-galaxy collection list 107 | 107 ansible-galaxy collection list --collections-path collections 108 | 108 ansible-navigator 109 | 109 vim ansible.cfg 110 | 110 ansible-galaxy collection list 111 | 111 vim ansible.cfg 112 | 112 ansible-galaxy collection list 113 | 113 vim ansible.cfg 114 | 114 vim myplaybook.yml 115 | 115 sudo dnf provides */semanage 116 | 116 vim myplaybook.yml 117 | 117 ansible-doc file 118 | 118 ansible-doc -l 119 | 119 ansible-doc seboolean 120 | 120 vim myplaybook.yml 121 | 121 ansible-playbook myplaybook.yml 122 | 122 vim myplaybook.yml 123 | 123 ansible-playbook myplaybook.yml 124 | 124 vim myplaybook.yml 125 | 125 ansible-playbook myplaybook.yml 126 | 126 ls 127 | 127 vim user.yml 128 | 128 ansible-playbook user.yml 129 | 129 vim user.yml 130 | 130 ansible-playbook user.yml 131 | 131 vim user.yml 132 | 132 ansible all -m copy -a "src=/etc/hosts dest=/etc/hosts" 133 | 133 cat /etc/hosts 134 | 134 vim user.yml 135 | 135 ansible-playbook user.yml 136 | 136 ansible-playbook user.yml -e user=linda 137 | 137 vim user.yml 138 | 138 vim vars/usrs.yml 139 | 139 ansible-playbook user.yml -e user=linda 140 | 140 ansible-playbook user.yml 141 | 141 vim user.yml 142 | 142 ansible-doc -l 143 | 143 ansible-doc -t 144 | 144 ansible-doc -t keyword 145 | 145 ansible-doc -t keyword -l 146 | 146 ansible-doc -t keyword vars_files 147 | 147 ansible-doc -t keyword become 148 | 148 mkdir host_vars 149 | 149 vim host_vars/ansible1 150 | 150 ansible-playbook user.yml 151 | 151 vim user.yml 152 | 152 ansible-playbook user.yml 153 | 153 vim host_vars/ansible1 154 | 154 cd host_vars/ 155 | 155 mv ansible1 ansible1.yml 156 | 156 cd .. 157 | 157 ansible-playbook user.yml 158 | 158 vim host_vars/ansible2 159 | 159 ansible-playbook user.yml 160 | 160 ls host_vars/ 161 | 161 mkdir group_vars 162 | 162 vim group_vars/all 163 | 163 ansible-playbook user.yml 164 | 164 ansible-inventory --graph --vars 165 | 165 vim user.yml 166 | 166 ansible-doc user 167 | 167 vim user.yml 168 | 168 ansible-playbook user.yml 169 | 169 vim user.yml 170 | 170 ansible-playbook user.yml 171 | 171 id anna 172 | 172 ansible all -a "id anna" 173 | 173 vim user.yml 174 | 174 ansible-doc debug 175 | 175 vim user.yml 176 | 176 ansible-playbook user.yml 177 | 177 vim user.yml 178 | 178 ansible-playbook user.yml 179 | 179 vim user.yml 180 | 180 ansible-playbook user.yml 181 | 181 vim register.yml 182 | 182 ansible-playbook register.yml 183 | 183 vim register_command.yml 184 | 184 ansible-playbook register_command.yml 185 | 185 history > /tmp/feb25.txt 186 | 186 sudo dnf install pcp-system-tools pcp pcp-gui 187 | 187 ansible-vault --help 188 | 188 ansible-vault create sensitive_values 189 | 189 cat sensitive_values 190 | 190 ansible-vault view sensitive_values 191 | 191 ansible-vault edit sensitive_values 192 | 192 ansible-vault create secret.yml 193 | 193 grep secret.yml * 194 | 194 vim users_vault.yml 195 | 195 vim user.yml 196 | 196 ansible-doc user 197 | 197 ansible-playbook user.yml 198 | 198 ansible-playbook --ask-vault-pass user.yml 199 | 199 echo password > vault-pass 200 | 200 chmod 600 vault-pass 201 | 201 ansible-playbook --vault-password-file-vault-pass user.yml 202 | 202 ansible-playbook --vault-password-file=vault-pass user.yml 203 | 203 ansible ansible2 -m setup 204 | 204 ansible ansible2 -m setup | less 205 | 205 vim facts.yml 206 | 206 ansible-playbook facts.yml 207 | 207 ansible-playbook facts.yml | less 208 | 208 vim ipfact.yml 209 | 209 ansible-playbook ipfact.yml 210 | 210 vim ipfact.yml 211 | 211 ansible-playbook ipfact.yml 212 | 212 vim ipfact.yml 213 | 213 ansible-playbook ipfact.yml 214 | 214 vim ipfact.yml 215 | 215 ansible-playbook ipfact.yml 216 | 216 vim ipfact.yml 217 | 217 ansible ansible2 -m setup | less 218 | 218 ls arrays 219 | 219 ls 220 | 220 ls vars 221 | 221 cd .. 222 | 222 cd vars 223 | 223 cd - 224 | 224 cd vars 225 | 225 vim users-dictionary 226 | 226 vim users-list 227 | 227 cd .. 228 | 228 grep users-list * 229 | 229 vim multi-list.yml 230 | 230 ansible-playbook multi-list.yml 231 | 231 ls 232 | 232 vim multi-list.yml 233 | 233 ansible-playbook multi-list.yml 234 | 234 vim multi-dictionary.yml 235 | 235 ansible-playbook multi-dictionary.yml 236 | 236 vim newlocalfacts.yml 237 | 237 vim inventory 238 | 238 vim newlocalfacts.yml 239 | 239 ls *fact 240 | 240 find . -type d 241 | 241 find . -name "*fact" 242 | 242 vim newlocalfacts.yml 243 | 243 vim lesson7/facts/localfacts.fact 244 | 244 ansible-playbook newlocalfacts.yml 245 | 245 ansible ansible2 -m setup -a "filter=ansible_local" 246 | 246 history 247 | 247 vim loopservices.yml 248 | 248 ansible-playbook loopservices.yml 249 | 249 ansible-doc dnf 250 | 250 ansible-doc service 251 | 251 vim loopusers.yml 252 | 252 ansible-playbook loopusers.yml 253 | 253 vim loop-over-variable.yml 254 | 254 vim loopvars.yml 255 | 255 vim loop-over-variable.yml 256 | 256 vim distro.yml 257 | 257 ansible-playbook distro -e my_package=httpd 258 | 258 ansible-playbook distro.yml -e my_package=httpd 259 | 259 vim distro.yml 260 | 260 ansible-playbook distro.yml -e my_package=httpd 261 | 261 vim distro.yml 262 | 262 ansible-playbook distro.yml -e mypackage=httpd 263 | 263 vim quicktest.yml 264 | 264 ansible-playbook quicktest.yml 265 | 265 vim quicktest.yml 266 | 266 ansible-playbook quicktest.yml 267 | 267 vim when_multiple.yml 268 | 268 ansible-playbook when_multiple.yml 269 | 269 vim when_multiple.yml 270 | 270 ansible-playbook when_multiple.yml 271 | 271 vim when_multiple.yml 272 | 272 vim when_multiple_complex.yml 273 | 273 vim ifsize.yml 274 | 274 ansible-playbook ifsize.yml 275 | 275 vim register.yml 276 | 276 ansible-playbook register.yml 277 | 277 cat register_command.yml 278 | 278 vim handlers.yml 279 | 279 ansible-playbook handlers.yml 280 | 280 vim handlers.yml 281 | 281 touch /tmp/index.html 282 | 282 ansible-playbook handlers.yml 283 | 283 vim handlers.yml 284 | 284 ansible-playbook handlers.yml 285 | 285 ansible all -m file -a "name=/var/www/html/index.html state=absent" 286 | 286 ansible-playbook handlers.yml 287 | 287 vim blocks.yml 288 | 288 vim blocks2.yml 289 | 289 vim block2.yaml 290 | 290 ansible-playbook block2.yaml 291 | 291 vim idem.yml 292 | 292 ansible-playbook idem.yml 293 | 293 vim idem.yml 294 | 294 ansible-playbook idem.yml 295 | 295 vim failure.yml 296 | 296 ansible-playbook failure.yml 297 | 297 vim failure.yml 298 | 298 ansible-playbook failure.yml 299 | 299 vim listing725.yaml 300 | 300 ansible-playbook listing725.yaml 301 | 301 history 302 | 302 vim includes-and-imports.yml 303 | 303 vim vsftpd.j2 304 | 304 vim vsftpd-template.yml 305 | 305 ansible-playbook vsftpd-template.yml 306 | 306 ansible ansible2 -a "cat /etc/vsftpd/vsftpd.conf" 307 | 307 ls host* 308 | 308 vim hostsfile.yml 309 | 309 vim hosts.j2 310 | 310 vim hostsfile.yml 311 | 311 ansible-playbook hostsfile.yml 312 | 312 vim hostsfile.yml 313 | 313 ansible-playbook hostsfile.yml 314 | 314 ansible ansible1 -a "cat /etc/hosts.test" 315 | 315 vim hosts.j2 316 | 316 vim selinux.yml 317 | 317 ansible-galaxy role install nginxinc.nginx 318 | 318 cd ../.ansible/roles/nginxinc.nginx/ 319 | 319 ls 320 | 320 ls tasks 321 | 321 ls templates/ 322 | 322 ls files/ 323 | 323 cd - 324 | 324 vim playrole.yml 325 | 325 ansible-playbook playrole.yml 326 | 326 ansible-galaxy collection install community.general 327 | 327 ansible-doc -l | grep firewalld 328 | 328 ansible-playbook playrole.yml 329 | 329 ansible-galaxy role install geerlingguy.nginx 330 | 330 ansible-galaxy role list 331 | 331 vim nginx-role.yml 332 | 332 ansible-playbook nginx-role.yml 333 | 333 ansible-galaxy role init motd 334 | 334 tree motd 335 | 335 vim motd/tasks/main.yml 336 | 336 ls mot* 337 | 337 vim motd-role.yml 338 | 338 sudo dnf install rhel-system-roles 339 | 339 cd /usr/share/doc/rhel-system-roles/ 340 | 340 ls 341 | 341 cd selinux/ 342 | 342 ls 343 | 343 pwd 344 | 344 cp example-selinux-playbook.yml ~/rhel9/ 345 | 345 cp example-selinux-playbook.yml ~/rhce9/ 346 | 346 cd ~/rhce9/ 347 | 347 vim example-selinux-playbook.yml 348 | 348 sudo mkdir /web 349 | 349 vim example-selinux-playbook.yml 350 | 350 ansible-playbook example-selinux-playbook.yml 351 | 351 ansible all -a "ls -ld /web" 352 | 352 ansible all -a "ls -lZd /web" 353 | 353 history 354 | 354 ansible all -i localhost, -m debug -a "msg={{ 'mypassword' | password_hash('sha512', 'mysecretsalt') }}" 355 | 355 vim userpw.yml 356 | 356 ansible-playbook userpw.yml 357 | 357 ssh anna@ansible2 358 | 358 vim anotherway.yml 359 | 359 ansible-playbook anotherway.yml 360 | 360 vim anotherway.yml 361 | 361 ansible-playbook anotherway.yml -e password=secret 362 | 362 ssh lisa@ansible1 363 | 363 vim anotherway.yml 364 | 364 ansible-playbook anotherway.yml -e password=secret 365 | 365 ssh lisa@ansible1 366 | 366 cat anotherway.yml 367 | 367 vim lab14.yaml 368 | 368 ansible-playbook lab14.yaml 369 | 369 vim lab14.yaml 370 | 370 ansible all -a "lsblk" 371 | 371 ansible ansible1 -m setup | less 372 | 372 vim lab14.yaml 373 | 373 ansible-playbook lab14.yaml 374 | 374 ls *adva* 375 | 375 vim storage-advanced.yml 376 | 376 ansible-playbook storage-advanced.yml 377 | 377 vim storage-advanced.yml 378 | 378 ansible-playbook storage-advanced.yml 379 | 379 ansible ansible1 -a "lvs" 380 | 380 ansible ansible1 -a "lsblk" 381 | 381 history > /tmp/feb25.txt 382 | -------------------------------------------------------------------------------- /lesson7/facts/ansible1_facts.txt: -------------------------------------------------------------------------------- 1 | ansible1.example.com | SUCCESS => { 2 | "ansible_facts": { 3 | "ansible_all_ipv4_addresses": [ 4 | "192.168.4.211" 5 | ], 6 | "ansible_all_ipv6_addresses": [ 7 | "fe80::66f:d4b3:7eea:cd2f" 8 | ], 9 | "ansible_apparmor": { 10 | "status": "disabled" 11 | }, 12 | "ansible_architecture": "x86_64", 13 | "ansible_bios_date": "02/27/2020", 14 | "ansible_bios_version": "6.00", 15 | "ansible_cmdline": { 16 | "BOOT_IMAGE": "/vmlinuz-3.10.0-1127.el7.x86_64", 17 | "LANG": "en_US.UTF-8", 18 | "crashkernel": "auto", 19 | "quiet": true, 20 | "rd.lvm.lv": "centos/swap", 21 | "rhgb": true, 22 | "ro": true, 23 | "root": "/dev/mapper/centos-root", 24 | "spectre_v2": "retpoline" 25 | }, 26 | "ansible_date_time": { 27 | "date": "2020-08-25", 28 | "day": "25", 29 | "epoch": "1598340082", 30 | "hour": "03", 31 | "iso8601": "2020-08-25T07:21:22Z", 32 | "iso8601_basic": "20200825T032122812350", 33 | "iso8601_basic_short": "20200825T032122", 34 | "iso8601_micro": "2020-08-25T07:21:22.812413Z", 35 | "minute": "21", 36 | "month": "08", 37 | "second": "22", 38 | "time": "03:21:22", 39 | "tz": "EDT", 40 | "tz_offset": "-0400", 41 | "weekday": "Tuesday", 42 | "weekday_number": "2", 43 | "weeknumber": "34", 44 | "year": "2020" 45 | }, 46 | "ansible_default_ipv4": { 47 | "address": "192.168.4.211", 48 | "alias": "ens33", 49 | "broadcast": "192.168.4.255", 50 | "gateway": "192.168.4.2", 51 | "interface": "ens33", 52 | "macaddress": "00:0c:29:e5:2f:de", 53 | "mtu": 1500, 54 | "netmask": "255.255.255.0", 55 | "network": "192.168.4.0", 56 | "type": "ether" 57 | }, 58 | "ansible_default_ipv6": {}, 59 | "ansible_device_links": { 60 | "ids": { 61 | "dm-0": [ 62 | "dm-name-centos-root", 63 | "dm-uuid-LVM-ZyCAweyNSXfrsvy9b9tD3fMgIZNMF8kTstAe5Vonouk32Ft0HgG5UbzytYUacE03" 64 | ], 65 | "dm-1": [ 66 | "dm-name-centos-swap", 67 | "dm-uuid-LVM-ZyCAweyNSXfrsvy9b9tD3fMgIZNMF8kTIr92Pjf8oA5c7HtMPHeB4ZHVw5fK1vYC" 68 | ], 69 | "sda2": [ 70 | "lvm-pv-uuid-4dSBXR-Pxi0-vQv7-KqNO-FPJa-ntp2-eidpX8" 71 | ], 72 | "sr0": [ 73 | "ata-VMware_Virtual_IDE_CDROM_Drive_10000000000000000001" 74 | ] 75 | }, 76 | "labels": {}, 77 | "masters": { 78 | "sda2": [ 79 | "dm-0", 80 | "dm-1" 81 | ] 82 | }, 83 | "uuids": { 84 | "dm-0": [ 85 | "5411921e-e829-42b0-99a2-9ca14979e84d" 86 | ], 87 | "dm-1": [ 88 | "8dc29bd2-fb22-4ee2-8091-f8175773dd19" 89 | ], 90 | "sda1": [ 91 | "16f42789-29ba-4717-bf47-0179d2d394bd" 92 | ] 93 | } 94 | }, 95 | "ansible_devices": { 96 | "dm-0": { 97 | "holders": [], 98 | "host": "", 99 | "links": { 100 | "ids": [ 101 | "dm-name-centos-root", 102 | "dm-uuid-LVM-ZyCAweyNSXfrsvy9b9tD3fMgIZNMF8kTstAe5Vonouk32Ft0HgG5UbzytYUacE03" 103 | ], 104 | "labels": [], 105 | "masters": [], 106 | "uuids": [ 107 | "5411921e-e829-42b0-99a2-9ca14979e84d" 108 | ] 109 | }, 110 | "model": null, 111 | "partitions": {}, 112 | "removable": "0", 113 | "rotational": "1", 114 | "sas_address": null, 115 | "sas_device_handle": null, 116 | "scheduler_mode": "", 117 | "sectors": "35643392", 118 | "sectorsize": "512", 119 | "size": "17.00 GB", 120 | "support_discard": "0", 121 | "vendor": null, 122 | "virtual": 1 123 | }, 124 | "dm-1": { 125 | "holders": [], 126 | "host": "", 127 | "links": { 128 | "ids": [ 129 | "dm-name-centos-swap", 130 | "dm-uuid-LVM-ZyCAweyNSXfrsvy9b9tD3fMgIZNMF8kTIr92Pjf8oA5c7HtMPHeB4ZHVw5fK1vYC" 131 | ], 132 | "labels": [], 133 | "masters": [], 134 | "uuids": [ 135 | "8dc29bd2-fb22-4ee2-8091-f8175773dd19" 136 | ] 137 | }, 138 | "model": null, 139 | "partitions": {}, 140 | "removable": "0", 141 | "rotational": "1", 142 | "sas_address": null, 143 | "sas_device_handle": null, 144 | "scheduler_mode": "", 145 | "sectors": "4194304", 146 | "sectorsize": "512", 147 | "size": "2.00 GB", 148 | "support_discard": "0", 149 | "vendor": null, 150 | "virtual": 1 151 | }, 152 | "sda": { 153 | "holders": [], 154 | "host": "SCSI storage controller: Broadcom / LSI 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)", 155 | "links": { 156 | "ids": [], 157 | "labels": [], 158 | "masters": [], 159 | "uuids": [] 160 | }, 161 | "model": "VMware Virtual S", 162 | "partitions": { 163 | "sda1": { 164 | "holders": [], 165 | "links": { 166 | "ids": [], 167 | "labels": [], 168 | "masters": [], 169 | "uuids": [ 170 | "16f42789-29ba-4717-bf47-0179d2d394bd" 171 | ] 172 | }, 173 | "sectors": "2097152", 174 | "sectorsize": 512, 175 | "size": "1.00 GB", 176 | "start": "2048", 177 | "uuid": "16f42789-29ba-4717-bf47-0179d2d394bd" 178 | }, 179 | "sda2": { 180 | "holders": [ 181 | "centos-root", 182 | "centos-swap" 183 | ], 184 | "links": { 185 | "ids": [ 186 | "lvm-pv-uuid-4dSBXR-Pxi0-vQv7-KqNO-FPJa-ntp2-eidpX8" 187 | ], 188 | "labels": [], 189 | "masters": [ 190 | "dm-0", 191 | "dm-1" 192 | ], 193 | "uuids": [] 194 | }, 195 | "sectors": "39843840", 196 | "sectorsize": 512, 197 | "size": "19.00 GB", 198 | "start": "2099200", 199 | "uuid": null 200 | } 201 | }, 202 | "removable": "0", 203 | "rotational": "1", 204 | "sas_address": null, 205 | "sas_device_handle": null, 206 | "scheduler_mode": "deadline", 207 | "sectors": "41943040", 208 | "sectorsize": "512", 209 | "size": "20.00 GB", 210 | "support_discard": "0", 211 | "vendor": "VMware,", 212 | "virtual": 1 213 | }, 214 | "sr0": { 215 | "holders": [], 216 | "host": "IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)", 217 | "links": { 218 | "ids": [ 219 | "ata-VMware_Virtual_IDE_CDROM_Drive_10000000000000000001" 220 | ], 221 | "labels": [], 222 | "masters": [], 223 | "uuids": [] 224 | }, 225 | "model": "VMware IDE CDR10", 226 | "partitions": {}, 227 | "removable": "1", 228 | "rotational": "1", 229 | "sas_address": null, 230 | "sas_device_handle": null, 231 | "scheduler_mode": "deadline", 232 | "sectors": "2097151", 233 | "sectorsize": "512", 234 | "size": "1024.00 MB", 235 | "support_discard": "0", 236 | "vendor": "NECVMWar", 237 | "virtual": 1 238 | } 239 | }, 240 | "ansible_distribution": "CentOS", 241 | "ansible_distribution_file_parsed": true, 242 | "ansible_distribution_file_path": "/etc/redhat-release", 243 | "ansible_distribution_file_variety": "RedHat", 244 | "ansible_distribution_major_version": "7", 245 | "ansible_distribution_release": "Core", 246 | "ansible_distribution_version": "7.8", 247 | "ansible_dns": { 248 | "nameservers": [ 249 | "8.8.8.8" 250 | ], 251 | "search": [ 252 | "example.com" 253 | ] 254 | }, 255 | "ansible_domain": "example.com", 256 | "ansible_effective_group_id": 0, 257 | "ansible_effective_user_id": 0, 258 | "ansible_ens33": { 259 | "active": true, 260 | "device": "ens33", 261 | "features": { 262 | "busy_poll": "off [fixed]", 263 | "fcoe_mtu": "off [fixed]", 264 | "generic_receive_offload": "on", 265 | "generic_segmentation_offload": "on", 266 | "highdma": "off [fixed]", 267 | "hw_tc_offload": "off [fixed]", 268 | "l2_fwd_offload": "off [fixed]", 269 | "large_receive_offload": "off [fixed]", 270 | "loopback": "off [fixed]", 271 | "netns_local": "off [fixed]", 272 | "ntuple_filters": "off [fixed]", 273 | "receive_hashing": "off [fixed]", 274 | "rx_all": "off", 275 | "rx_checksumming": "off", 276 | "rx_fcs": "off", 277 | "rx_gro_hw": "off [fixed]", 278 | "rx_udp_tunnel_port_offload": "off [fixed]", 279 | "rx_vlan_filter": "on [fixed]", 280 | "rx_vlan_offload": "on", 281 | "rx_vlan_stag_filter": "off [fixed]", 282 | "rx_vlan_stag_hw_parse": "off [fixed]", 283 | "scatter_gather": "on", 284 | "tcp_segmentation_offload": "on", 285 | "tx_checksum_fcoe_crc": "off [fixed]", 286 | "tx_checksum_ip_generic": "on", 287 | "tx_checksum_ipv4": "off [fixed]", 288 | "tx_checksum_ipv6": "off [fixed]", 289 | "tx_checksum_sctp": "off [fixed]", 290 | "tx_checksumming": "on", 291 | "tx_fcoe_segmentation": "off [fixed]", 292 | "tx_gre_csum_segmentation": "off [fixed]", 293 | "tx_gre_segmentation": "off [fixed]", 294 | "tx_gso_partial": "off [fixed]", 295 | "tx_gso_robust": "off [fixed]", 296 | "tx_ipip_segmentation": "off [fixed]", 297 | "tx_lockless": "off [fixed]", 298 | "tx_nocache_copy": "off", 299 | "tx_scatter_gather": "on", 300 | "tx_scatter_gather_fraglist": "off [fixed]", 301 | "tx_sctp_segmentation": "off [fixed]", 302 | "tx_sit_segmentation": "off [fixed]", 303 | "tx_tcp6_segmentation": "off [fixed]", 304 | "tx_tcp_ecn_segmentation": "off [fixed]", 305 | "tx_tcp_mangleid_segmentation": "off", 306 | "tx_tcp_segmentation": "on", 307 | "tx_udp_tnl_csum_segmentation": "off [fixed]", 308 | "tx_udp_tnl_segmentation": "off [fixed]", 309 | "tx_vlan_offload": "on [fixed]", 310 | "tx_vlan_stag_hw_insert": "off [fixed]", 311 | "udp_fragmentation_offload": "off [fixed]", 312 | "vlan_challenged": "off [fixed]" 313 | }, 314 | "hw_timestamp_filters": [], 315 | "ipv4": { 316 | "address": "192.168.4.211", 317 | "broadcast": "192.168.4.255", 318 | "netmask": "255.255.255.0", 319 | "network": "192.168.4.0" 320 | }, 321 | "ipv6": [ 322 | { 323 | "address": "fe80::66f:d4b3:7eea:cd2f", 324 | "prefix": "64", 325 | "scope": "link" 326 | } 327 | ], 328 | "macaddress": "00:0c:29:e5:2f:de", 329 | "module": "e1000", 330 | "mtu": 1500, 331 | "pciid": "0000:02:01.0", 332 | "promisc": false, 333 | "speed": 1000, 334 | "timestamping": [ 335 | "tx_software", 336 | "rx_software", 337 | "software" 338 | ], 339 | "type": "ether" 340 | }, 341 | "ansible_env": { 342 | "HOME": "/root", 343 | "LANG": "en_US.UTF-8", 344 | "LOGNAME": "root", 345 | "LS_COLORS": "rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:", 346 | "MAIL": "/var/mail/ansible", 347 | "PATH": "/sbin:/bin:/usr/sbin:/usr/bin", 348 | "PWD": "/home/ansible", 349 | "SHELL": "/bin/bash", 350 | "SHLVL": "1", 351 | "SUDO_COMMAND": "/bin/sh -c echo BECOME-SUCCESS-kpvczndtseksovyrtneqpmfrolzahcoz ; /usr/bin/python /home/ansible/.ansible/tmp/ansible-tmp-1598340081.89-14896-262788928679689/AnsiballZ_setup.py", 352 | "SUDO_GID": "1000", 353 | "SUDO_UID": "1000", 354 | "SUDO_USER": "ansible", 355 | "TERM": "xterm-256color", 356 | "USER": "root", 357 | "USERNAME": "root", 358 | "XDG_SESSION_ID": "39", 359 | "_": "/usr/bin/python" 360 | }, 361 | "ansible_fibre_channel_wwn": [], 362 | "ansible_fips": false, 363 | "ansible_form_factor": "Other", 364 | "ansible_fqdn": "ansible1.example.com", 365 | "ansible_hostname": "ansible1", 366 | "ansible_hostnqn": "", 367 | "ansible_interfaces": [ 368 | "lo", 369 | "ens33" 370 | ], 371 | "ansible_is_chroot": false, 372 | "ansible_iscsi_iqn": "", 373 | "ansible_kernel": "3.10.0-1127.el7.x86_64", 374 | "ansible_kernel_version": "#1 SMP Tue Mar 31 23:36:51 UTC 2020", 375 | "ansible_lo": { 376 | "active": true, 377 | "device": "lo", 378 | "features": { 379 | "busy_poll": "off [fixed]", 380 | "fcoe_mtu": "off [fixed]", 381 | "generic_receive_offload": "on", 382 | "generic_segmentation_offload": "on", 383 | "highdma": "on [fixed]", 384 | "hw_tc_offload": "off [fixed]", 385 | "l2_fwd_offload": "off [fixed]", 386 | "large_receive_offload": "off [fixed]", 387 | "loopback": "on [fixed]", 388 | "netns_local": "on [fixed]", 389 | "ntuple_filters": "off [fixed]", 390 | "receive_hashing": "off [fixed]", 391 | "rx_all": "off [fixed]", 392 | "rx_checksumming": "on [fixed]", 393 | "rx_fcs": "off [fixed]", 394 | "rx_gro_hw": "off [fixed]", 395 | "rx_udp_tunnel_port_offload": "off [fixed]", 396 | "rx_vlan_filter": "off [fixed]", 397 | "rx_vlan_offload": "off [fixed]", 398 | "rx_vlan_stag_filter": "off [fixed]", 399 | "rx_vlan_stag_hw_parse": "off [fixed]", 400 | "scatter_gather": "on", 401 | "tcp_segmentation_offload": "on", 402 | "tx_checksum_fcoe_crc": "off [fixed]", 403 | "tx_checksum_ip_generic": "on [fixed]", 404 | "tx_checksum_ipv4": "off [fixed]", 405 | "tx_checksum_ipv6": "off [fixed]", 406 | "tx_checksum_sctp": "on [fixed]", 407 | "tx_checksumming": "on", 408 | "tx_fcoe_segmentation": "off [fixed]", 409 | "tx_gre_csum_segmentation": "off [fixed]", 410 | "tx_gre_segmentation": "off [fixed]", 411 | "tx_gso_partial": "off [fixed]", 412 | "tx_gso_robust": "off [fixed]", 413 | "tx_ipip_segmentation": "off [fixed]", 414 | "tx_lockless": "on [fixed]", 415 | "tx_nocache_copy": "off [fixed]", 416 | "tx_scatter_gather": "on [fixed]", 417 | "tx_scatter_gather_fraglist": "on [fixed]", 418 | "tx_sctp_segmentation": "on", 419 | "tx_sit_segmentation": "off [fixed]", 420 | "tx_tcp6_segmentation": "on", 421 | "tx_tcp_ecn_segmentation": "on", 422 | "tx_tcp_mangleid_segmentation": "on", 423 | "tx_tcp_segmentation": "on", 424 | "tx_udp_tnl_csum_segmentation": "off [fixed]", 425 | "tx_udp_tnl_segmentation": "off [fixed]", 426 | "tx_vlan_offload": "off [fixed]", 427 | "tx_vlan_stag_hw_insert": "off [fixed]", 428 | "udp_fragmentation_offload": "on", 429 | "vlan_challenged": "on [fixed]" 430 | }, 431 | "hw_timestamp_filters": [], 432 | "ipv4": { 433 | "address": "127.0.0.1", 434 | "broadcast": "host", 435 | "netmask": "255.0.0.0", 436 | "network": "127.0.0.0" 437 | }, 438 | "ipv6": [ 439 | { 440 | "address": "::1", 441 | "prefix": "128", 442 | "scope": "host" 443 | } 444 | ], 445 | "mtu": 65536, 446 | "promisc": false, 447 | "timestamping": [ 448 | "rx_software", 449 | "software" 450 | ], 451 | "type": "loopback" 452 | }, 453 | "ansible_local": { 454 | "custom": { 455 | "packages": { 456 | "db_package": "mariadb-server", 457 | "ftp_package": "vsftpd", 458 | "smb_package": "samba", 459 | "web_package": "httpd" 460 | }, 461 | "services": { 462 | "db_service": "mariadb", 463 | "ftp_service": "vsftpd", 464 | "smb_service": "smb", 465 | "web_service": "httpd" 466 | } 467 | } 468 | }, 469 | "ansible_lsb": {}, 470 | "ansible_lvm": { 471 | "lvs": { 472 | "root": { 473 | "size_g": "17.00", 474 | "vg": "centos" 475 | }, 476 | "swap": { 477 | "size_g": "2.00", 478 | "vg": "centos" 479 | } 480 | }, 481 | "pvs": { 482 | "/dev/sda2": { 483 | "free_g": "0", 484 | "size_g": "19.00", 485 | "vg": "centos" 486 | } 487 | }, 488 | "vgs": { 489 | "centos": { 490 | "free_g": "0", 491 | "num_lvs": "2", 492 | "num_pvs": "1", 493 | "size_g": "19.00" 494 | } 495 | } 496 | }, 497 | "ansible_machine": "x86_64", 498 | "ansible_machine_id": "92b96e1b7987405aa3c0a5196f12515b", 499 | "ansible_memfree_mb": 432, 500 | "ansible_memory_mb": { 501 | "nocache": { 502 | "free": 728, 503 | "used": 244 504 | }, 505 | "real": { 506 | "free": 432, 507 | "total": 972, 508 | "used": 540 509 | }, 510 | "swap": { 511 | "cached": 0, 512 | "free": 2047, 513 | "total": 2047, 514 | "used": 0 515 | } 516 | }, 517 | "ansible_memtotal_mb": 972, 518 | "ansible_mounts": [ 519 | { 520 | "block_available": 224577, 521 | "block_size": 4096, 522 | "block_total": 259584, 523 | "block_used": 35007, 524 | "device": "/dev/sda1", 525 | "fstype": "xfs", 526 | "inode_available": 523962, 527 | "inode_total": 524288, 528 | "inode_used": 326, 529 | "mount": "/boot", 530 | "options": "rw,seclabel,relatime,attr2,inode64,noquota", 531 | "size_available": 919867392, 532 | "size_total": 1063256064, 533 | "uuid": "16f42789-29ba-4717-bf47-0179d2d394bd" 534 | }, 535 | { 536 | "block_available": 4111431, 537 | "block_size": 4096, 538 | "block_total": 4452864, 539 | "block_used": 341433, 540 | "device": "/dev/mapper/centos-root", 541 | "fstype": "xfs", 542 | "inode_available": 8882300, 543 | "inode_total": 8910848, 544 | "inode_used": 28548, 545 | "mount": "/", 546 | "options": "rw,seclabel,relatime,attr2,inode64,noquota", 547 | "size_available": 16840421376, 548 | "size_total": 18238930944, 549 | "uuid": "5411921e-e829-42b0-99a2-9ca14979e84d" 550 | } 551 | ], 552 | "ansible_nodename": "ansible1.example.com", 553 | "ansible_os_family": "RedHat", 554 | "ansible_pkg_mgr": "yum", 555 | "ansible_proc_cmdline": { 556 | "BOOT_IMAGE": "/vmlinuz-3.10.0-1127.el7.x86_64", 557 | "LANG": "en_US.UTF-8", 558 | "crashkernel": "auto", 559 | "quiet": true, 560 | "rd.lvm.lv": [ 561 | "centos/root", 562 | "centos/swap" 563 | ], 564 | "rhgb": true, 565 | "ro": true, 566 | "root": "/dev/mapper/centos-root", 567 | "spectre_v2": "retpoline" 568 | }, 569 | "ansible_processor": [ 570 | "0", 571 | "GenuineIntel", 572 | "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz" 573 | ], 574 | "ansible_processor_cores": 1, 575 | "ansible_processor_count": 1, 576 | "ansible_processor_threads_per_core": 1, 577 | "ansible_processor_vcpus": 1, 578 | "ansible_product_name": "VMware Virtual Platform", 579 | "ansible_product_serial": "VMware-56 4d bb 01 5c 32 9f b3-13 a0 64 13 70 e5 2f de", 580 | "ansible_product_uuid": "01BB4D56-325C-B39F-13A0-641370E52FDE", 581 | "ansible_product_version": "None", 582 | "ansible_python": { 583 | "executable": "/usr/bin/python", 584 | "has_sslcontext": true, 585 | "type": "CPython", 586 | "version": { 587 | "major": 2, 588 | "micro": 5, 589 | "minor": 7, 590 | "releaselevel": "final", 591 | "serial": 0 592 | }, 593 | "version_info": [ 594 | 2, 595 | 7, 596 | 5, 597 | "final", 598 | 0 599 | ] 600 | }, 601 | "ansible_python_version": "2.7.5", 602 | "ansible_real_group_id": 0, 603 | "ansible_real_user_id": 0, 604 | "ansible_selinux": { 605 | "config_mode": "enforcing", 606 | "mode": "enforcing", 607 | "policyvers": 31, 608 | "status": "enabled", 609 | "type": "targeted" 610 | }, 611 | "ansible_selinux_python_present": true, 612 | "ansible_service_mgr": "systemd", 613 | "ansible_ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBIpvCrFEddsKZG5D9tk3BS+OpvlQbJ6rcZsEU0okynbk8pOYwPNqlgcQ15yggfA4I8USWZVRLBjks7CkzOai8k0=", 614 | "ansible_ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIE3TbdbZfl0PMMbDPfkvf1/uNjQOBe2fzjF9ERu5qtSb", 615 | "ansible_ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABAQCo1calzWGxuUkxG4Ydh2YyKoNtMfOKbWeh62TWrDt/R9t3t9UQvQbCTUybB2HRAVRJjkt/V8dtSevgaPBIOsSuvWUfxXx4kQ7MZwjXtZ14qis/V38+7YTlktD8MPDlv8JwwqqfyRGQZoWXbWQ2X+o0X914WYrIabz+UmPiNnXkF/+ZSSBXedkg8nqOHIIVabVwPh9UIusyY/e3eZIVw/fdZoNGrQsrm4740fu0bHlf18ypcXtKpWCpUe61PKIJwgkL1vAkzq4J7q2/83fMnlOwuwdcEWdZ2hEUWDSGtAk4/kbce50k81A7lxEeCSjKMpNZi3kIEKSdK9WgCzGp6l6X", 616 | "ansible_swapfree_mb": 2047, 617 | "ansible_swaptotal_mb": 2047, 618 | "ansible_system": "Linux", 619 | "ansible_system_capabilities": [ 620 | "cap_chown", 621 | "cap_dac_override", 622 | "cap_dac_read_search", 623 | "cap_fowner", 624 | "cap_fsetid", 625 | "cap_kill", 626 | "cap_setgid", 627 | "cap_setuid", 628 | "cap_setpcap", 629 | "cap_linux_immutable", 630 | "cap_net_bind_service", 631 | "cap_net_broadcast", 632 | "cap_net_admin", 633 | "cap_net_raw", 634 | "cap_ipc_lock", 635 | "cap_ipc_owner", 636 | "cap_sys_module", 637 | "cap_sys_rawio", 638 | "cap_sys_chroot", 639 | "cap_sys_ptrace", 640 | "cap_sys_pacct", 641 | "cap_sys_admin", 642 | "cap_sys_boot", 643 | "cap_sys_nice", 644 | "cap_sys_resource", 645 | "cap_sys_time", 646 | "cap_sys_tty_config", 647 | "cap_mknod", 648 | "cap_lease", 649 | "cap_audit_write", 650 | "cap_audit_control", 651 | "cap_setfcap", 652 | "cap_mac_override", 653 | "cap_mac_admin", 654 | "cap_syslog", 655 | "35", 656 | "36+ep" 657 | ], 658 | "ansible_system_capabilities_enforced": "True", 659 | "ansible_system_vendor": "VMware, Inc.", 660 | "ansible_uptime_seconds": 91686, 661 | "ansible_user_dir": "/root", 662 | "ansible_user_gecos": "root", 663 | "ansible_user_gid": 0, 664 | "ansible_user_id": "root", 665 | "ansible_user_shell": "/bin/bash", 666 | "ansible_user_uid": 0, 667 | "ansible_userspace_architecture": "x86_64", 668 | "ansible_userspace_bits": "64", 669 | "ansible_virtualization_role": "guest", 670 | "ansible_virtualization_type": "VMware", 671 | "discovered_interpreter_python": "/usr/bin/python", 672 | "gather_subset": [ 673 | "all" 674 | ], 675 | "module_setup": true 676 | }, 677 | "changed": false 678 | } 679 | -------------------------------------------------------------------------------- /lesson7/facts/factplay.txt: -------------------------------------------------------------------------------- 1 | 2 | PLAY [show facts] ***************************************************************************************************** 3 | 4 | TASK [Gathering Facts] ************************************************************************************************ 5 | ok: [ansible2.example.com] 6 | ok: [ansible1.example.com] 7 | 8 | TASK [print facts] **************************************************************************************************** 9 | ok: [ansible1.example.com] => { 10 | "ansible_facts": { 11 | "all_ipv4_addresses": [ 12 | "192.168.4.211" 13 | ], 14 | "all_ipv6_addresses": [ 15 | "fe80::66f:d4b3:7eea:cd2f" 16 | ], 17 | "ansible_local": { 18 | "custom": { 19 | "packages": { 20 | "db_package": "mariadb-server", 21 | "ftp_package": "vsftpd", 22 | "smb_package": "samba", 23 | "web_package": "httpd" 24 | }, 25 | "services": { 26 | "db_service": "mariadb", 27 | "ftp_service": "vsftpd", 28 | "smb_service": "smb", 29 | "web_service": "httpd" 30 | } 31 | } 32 | }, 33 | "apparmor": { 34 | "status": "disabled" 35 | }, 36 | "architecture": "x86_64", 37 | "bios_date": "02/27/2020", 38 | "bios_version": "6.00", 39 | "cmdline": { 40 | "BOOT_IMAGE": "/vmlinuz-3.10.0-1127.el7.x86_64", 41 | "LANG": "en_US.UTF-8", 42 | "crashkernel": "auto", 43 | "quiet": true, 44 | "rd.lvm.lv": "centos/swap", 45 | "rhgb": true, 46 | "ro": true, 47 | "root": "/dev/mapper/centos-root", 48 | "spectre_v2": "retpoline" 49 | }, 50 | "date_time": { 51 | "date": "2020-08-25", 52 | "day": "25", 53 | "epoch": "1598340832", 54 | "hour": "03", 55 | "iso8601": "2020-08-25T07:33:52Z", 56 | "iso8601_basic": "20200825T033352225222", 57 | "iso8601_basic_short": "20200825T033352", 58 | "iso8601_micro": "2020-08-25T07:33:52.225285Z", 59 | "minute": "33", 60 | "month": "08", 61 | "second": "52", 62 | "time": "03:33:52", 63 | "tz": "EDT", 64 | "tz_offset": "-0400", 65 | "weekday": "Tuesday", 66 | "weekday_number": "2", 67 | "weeknumber": "34", 68 | "year": "2020" 69 | }, 70 | "default_ipv4": { 71 | "address": "192.168.4.211", 72 | "alias": "ens33", 73 | "broadcast": "192.168.4.255", 74 | "gateway": "192.168.4.2", 75 | "interface": "ens33", 76 | "macaddress": "00:0c:29:e5:2f:de", 77 | "mtu": 1500, 78 | "netmask": "255.255.255.0", 79 | "network": "192.168.4.0", 80 | "type": "ether" 81 | }, 82 | "default_ipv6": {}, 83 | "device_links": { 84 | "ids": { 85 | "dm-0": [ 86 | "dm-name-centos-root", 87 | "dm-uuid-LVM-ZyCAweyNSXfrsvy9b9tD3fMgIZNMF8kTstAe5Vonouk32Ft0HgG5UbzytYUacE03" 88 | ], 89 | "dm-1": [ 90 | "dm-name-centos-swap", 91 | "dm-uuid-LVM-ZyCAweyNSXfrsvy9b9tD3fMgIZNMF8kTIr92Pjf8oA5c7HtMPHeB4ZHVw5fK1vYC" 92 | ], 93 | "sda2": [ 94 | "lvm-pv-uuid-4dSBXR-Pxi0-vQv7-KqNO-FPJa-ntp2-eidpX8" 95 | ], 96 | "sr0": [ 97 | "ata-VMware_Virtual_IDE_CDROM_Drive_10000000000000000001" 98 | ] 99 | }, 100 | "labels": {}, 101 | "masters": { 102 | "sda2": [ 103 | "dm-0", 104 | "dm-1" 105 | ] 106 | }, 107 | "uuids": { 108 | "dm-0": [ 109 | "5411921e-e829-42b0-99a2-9ca14979e84d" 110 | ], 111 | "dm-1": [ 112 | "8dc29bd2-fb22-4ee2-8091-f8175773dd19" 113 | ], 114 | "sda1": [ 115 | "16f42789-29ba-4717-bf47-0179d2d394bd" 116 | ] 117 | } 118 | }, 119 | "devices": { 120 | "dm-0": { 121 | "holders": [], 122 | "host": "", 123 | "links": { 124 | "ids": [ 125 | "dm-name-centos-root", 126 | "dm-uuid-LVM-ZyCAweyNSXfrsvy9b9tD3fMgIZNMF8kTstAe5Vonouk32Ft0HgG5UbzytYUacE03" 127 | ], 128 | "labels": [], 129 | "masters": [], 130 | "uuids": [ 131 | "5411921e-e829-42b0-99a2-9ca14979e84d" 132 | ] 133 | }, 134 | "model": null, 135 | "partitions": {}, 136 | "removable": "0", 137 | "rotational": "1", 138 | "sas_address": null, 139 | "sas_device_handle": null, 140 | "scheduler_mode": "", 141 | "sectors": "35643392", 142 | "sectorsize": "512", 143 | "size": "17.00 GB", 144 | "support_discard": "0", 145 | "vendor": null, 146 | "virtual": 1 147 | }, 148 | "dm-1": { 149 | "holders": [], 150 | "host": "", 151 | "links": { 152 | "ids": [ 153 | "dm-name-centos-swap", 154 | "dm-uuid-LVM-ZyCAweyNSXfrsvy9b9tD3fMgIZNMF8kTIr92Pjf8oA5c7HtMPHeB4ZHVw5fK1vYC" 155 | ], 156 | "labels": [], 157 | "masters": [], 158 | "uuids": [ 159 | "8dc29bd2-fb22-4ee2-8091-f8175773dd19" 160 | ] 161 | }, 162 | "model": null, 163 | "partitions": {}, 164 | "removable": "0", 165 | "rotational": "1", 166 | "sas_address": null, 167 | "sas_device_handle": null, 168 | "scheduler_mode": "", 169 | "sectors": "4194304", 170 | "sectorsize": "512", 171 | "size": "2.00 GB", 172 | "support_discard": "0", 173 | "vendor": null, 174 | "virtual": 1 175 | }, 176 | "sda": { 177 | "holders": [], 178 | "host": "SCSI storage controller: Broadcom / LSI 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)", 179 | "links": { 180 | "ids": [], 181 | "labels": [], 182 | "masters": [], 183 | "uuids": [] 184 | }, 185 | "model": "VMware Virtual S", 186 | "partitions": { 187 | "sda1": { 188 | "holders": [], 189 | "links": { 190 | "ids": [], 191 | "labels": [], 192 | "masters": [], 193 | "uuids": [ 194 | "16f42789-29ba-4717-bf47-0179d2d394bd" 195 | ] 196 | }, 197 | "sectors": "2097152", 198 | "sectorsize": 512, 199 | "size": "1.00 GB", 200 | "start": "2048", 201 | "uuid": "16f42789-29ba-4717-bf47-0179d2d394bd" 202 | }, 203 | "sda2": { 204 | "holders": [ 205 | "centos-root", 206 | "centos-swap" 207 | ], 208 | "links": { 209 | "ids": [ 210 | "lvm-pv-uuid-4dSBXR-Pxi0-vQv7-KqNO-FPJa-ntp2-eidpX8" 211 | ], 212 | "labels": [], 213 | "masters": [ 214 | "dm-0", 215 | "dm-1" 216 | ], 217 | "uuids": [] 218 | }, 219 | "sectors": "39843840", 220 | "sectorsize": 512, 221 | "size": "19.00 GB", 222 | "start": "2099200", 223 | "uuid": null 224 | } 225 | }, 226 | "removable": "0", 227 | "rotational": "1", 228 | "sas_address": null, 229 | "sas_device_handle": null, 230 | "scheduler_mode": "deadline", 231 | "sectors": "41943040", 232 | "sectorsize": "512", 233 | "size": "20.00 GB", 234 | "support_discard": "0", 235 | "vendor": "VMware,", 236 | "virtual": 1 237 | }, 238 | "sr0": { 239 | "holders": [], 240 | "host": "IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)", 241 | "links": { 242 | "ids": [ 243 | "ata-VMware_Virtual_IDE_CDROM_Drive_10000000000000000001" 244 | ], 245 | "labels": [], 246 | "masters": [], 247 | "uuids": [] 248 | }, 249 | "model": "VMware IDE CDR10", 250 | "partitions": {}, 251 | "removable": "1", 252 | "rotational": "1", 253 | "sas_address": null, 254 | "sas_device_handle": null, 255 | "scheduler_mode": "deadline", 256 | "sectors": "2097151", 257 | "sectorsize": "512", 258 | "size": "1024.00 MB", 259 | "support_discard": "0", 260 | "vendor": "NECVMWar", 261 | "virtual": 1 262 | } 263 | }, 264 | "discovered_interpreter_python": "/usr/bin/python", 265 | "distribution": "CentOS", 266 | "distribution_file_parsed": true, 267 | "distribution_file_path": "/etc/redhat-release", 268 | "distribution_file_variety": "RedHat", 269 | "distribution_major_version": "7", 270 | "distribution_release": "Core", 271 | "distribution_version": "7.8", 272 | "dns": { 273 | "nameservers": [ 274 | "8.8.8.8" 275 | ], 276 | "search": [ 277 | "example.com" 278 | ] 279 | }, 280 | "domain": "example.com", 281 | "effective_group_id": 0, 282 | "effective_user_id": 0, 283 | "ens33": { 284 | "active": true, 285 | "device": "ens33", 286 | "features": { 287 | "busy_poll": "off [fixed]", 288 | "fcoe_mtu": "off [fixed]", 289 | "generic_receive_offload": "on", 290 | "generic_segmentation_offload": "on", 291 | "highdma": "off [fixed]", 292 | "hw_tc_offload": "off [fixed]", 293 | "l2_fwd_offload": "off [fixed]", 294 | "large_receive_offload": "off [fixed]", 295 | "loopback": "off [fixed]", 296 | "netns_local": "off [fixed]", 297 | "ntuple_filters": "off [fixed]", 298 | "receive_hashing": "off [fixed]", 299 | "rx_all": "off", 300 | "rx_checksumming": "off", 301 | "rx_fcs": "off", 302 | "rx_gro_hw": "off [fixed]", 303 | "rx_udp_tunnel_port_offload": "off [fixed]", 304 | "rx_vlan_filter": "on [fixed]", 305 | "rx_vlan_offload": "on", 306 | "rx_vlan_stag_filter": "off [fixed]", 307 | "rx_vlan_stag_hw_parse": "off [fixed]", 308 | "scatter_gather": "on", 309 | "tcp_segmentation_offload": "on", 310 | "tx_checksum_fcoe_crc": "off [fixed]", 311 | "tx_checksum_ip_generic": "on", 312 | "tx_checksum_ipv4": "off [fixed]", 313 | "tx_checksum_ipv6": "off [fixed]", 314 | "tx_checksum_sctp": "off [fixed]", 315 | "tx_checksumming": "on", 316 | "tx_fcoe_segmentation": "off [fixed]", 317 | "tx_gre_csum_segmentation": "off [fixed]", 318 | "tx_gre_segmentation": "off [fixed]", 319 | "tx_gso_partial": "off [fixed]", 320 | "tx_gso_robust": "off [fixed]", 321 | "tx_ipip_segmentation": "off [fixed]", 322 | "tx_lockless": "off [fixed]", 323 | "tx_nocache_copy": "off", 324 | "tx_scatter_gather": "on", 325 | "tx_scatter_gather_fraglist": "off [fixed]", 326 | "tx_sctp_segmentation": "off [fixed]", 327 | "tx_sit_segmentation": "off [fixed]", 328 | "tx_tcp6_segmentation": "off [fixed]", 329 | "tx_tcp_ecn_segmentation": "off [fixed]", 330 | "tx_tcp_mangleid_segmentation": "off", 331 | "tx_tcp_segmentation": "on", 332 | "tx_udp_tnl_csum_segmentation": "off [fixed]", 333 | "tx_udp_tnl_segmentation": "off [fixed]", 334 | "tx_vlan_offload": "on [fixed]", 335 | "tx_vlan_stag_hw_insert": "off [fixed]", 336 | "udp_fragmentation_offload": "off [fixed]", 337 | "vlan_challenged": "off [fixed]" 338 | }, 339 | "hw_timestamp_filters": [], 340 | "ipv4": { 341 | "address": "192.168.4.211", 342 | "broadcast": "192.168.4.255", 343 | "netmask": "255.255.255.0", 344 | "network": "192.168.4.0" 345 | }, 346 | "ipv6": [ 347 | { 348 | "address": "fe80::66f:d4b3:7eea:cd2f", 349 | "prefix": "64", 350 | "scope": "link" 351 | } 352 | ], 353 | "macaddress": "00:0c:29:e5:2f:de", 354 | "module": "e1000", 355 | "mtu": 1500, 356 | "pciid": "0000:02:01.0", 357 | "promisc": false, 358 | "speed": 1000, 359 | "timestamping": [ 360 | "tx_software", 361 | "rx_software", 362 | "software" 363 | ], 364 | "type": "ether" 365 | }, 366 | "env": { 367 | "HOME": "/root", 368 | "LANG": "en_US.UTF-8", 369 | "LOGNAME": "root", 370 | "LS_COLORS": "rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:", 371 | "MAIL": "/var/mail/ansible", 372 | "PATH": "/sbin:/bin:/usr/sbin:/usr/bin", 373 | "PWD": "/home/ansible", 374 | "SHELL": "/bin/bash", 375 | "SHLVL": "1", 376 | "SUDO_COMMAND": "/bin/sh -c echo BECOME-SUCCESS-gdeuqtfzxqkifgbnbeedmvxhqseqczsp ; /usr/bin/python /home/ansible/.ansible/tmp/ansible-tmp-1598340831.07-15012-189137319588236/AnsiballZ_setup.py", 377 | "SUDO_GID": "1000", 378 | "SUDO_UID": "1000", 379 | "SUDO_USER": "ansible", 380 | "TERM": "xterm-256color", 381 | "USER": "root", 382 | "USERNAME": "root", 383 | "XDG_SESSION_ID": "40", 384 | "_": "/usr/bin/python" 385 | }, 386 | "fibre_channel_wwn": [], 387 | "fips": false, 388 | "form_factor": "Other", 389 | "fqdn": "ansible1.example.com", 390 | "gather_subset": [ 391 | "all" 392 | ], 393 | "hostname": "ansible1", 394 | "hostnqn": "", 395 | "interfaces": [ 396 | "lo", 397 | "ens33" 398 | ], 399 | "is_chroot": false, 400 | "iscsi_iqn": "", 401 | "kernel": "3.10.0-1127.el7.x86_64", 402 | "kernel_version": "#1 SMP Tue Mar 31 23:36:51 UTC 2020", 403 | "lo": { 404 | "active": true, 405 | "device": "lo", 406 | "features": { 407 | "busy_poll": "off [fixed]", 408 | "fcoe_mtu": "off [fixed]", 409 | "generic_receive_offload": "on", 410 | "generic_segmentation_offload": "on", 411 | "highdma": "on [fixed]", 412 | "hw_tc_offload": "off [fixed]", 413 | "l2_fwd_offload": "off [fixed]", 414 | "large_receive_offload": "off [fixed]", 415 | "loopback": "on [fixed]", 416 | "netns_local": "on [fixed]", 417 | "ntuple_filters": "off [fixed]", 418 | "receive_hashing": "off [fixed]", 419 | "rx_all": "off [fixed]", 420 | "rx_checksumming": "on [fixed]", 421 | "rx_fcs": "off [fixed]", 422 | "rx_gro_hw": "off [fixed]", 423 | "rx_udp_tunnel_port_offload": "off [fixed]", 424 | "rx_vlan_filter": "off [fixed]", 425 | "rx_vlan_offload": "off [fixed]", 426 | "rx_vlan_stag_filter": "off [fixed]", 427 | "rx_vlan_stag_hw_parse": "off [fixed]", 428 | "scatter_gather": "on", 429 | "tcp_segmentation_offload": "on", 430 | "tx_checksum_fcoe_crc": "off [fixed]", 431 | "tx_checksum_ip_generic": "on [fixed]", 432 | "tx_checksum_ipv4": "off [fixed]", 433 | "tx_checksum_ipv6": "off [fixed]", 434 | "tx_checksum_sctp": "on [fixed]", 435 | "tx_checksumming": "on", 436 | "tx_fcoe_segmentation": "off [fixed]", 437 | "tx_gre_csum_segmentation": "off [fixed]", 438 | "tx_gre_segmentation": "off [fixed]", 439 | "tx_gso_partial": "off [fixed]", 440 | "tx_gso_robust": "off [fixed]", 441 | "tx_ipip_segmentation": "off [fixed]", 442 | "tx_lockless": "on [fixed]", 443 | "tx_nocache_copy": "off [fixed]", 444 | "tx_scatter_gather": "on [fixed]", 445 | "tx_scatter_gather_fraglist": "on [fixed]", 446 | "tx_sctp_segmentation": "on", 447 | "tx_sit_segmentation": "off [fixed]", 448 | "tx_tcp6_segmentation": "on", 449 | "tx_tcp_ecn_segmentation": "on", 450 | "tx_tcp_mangleid_segmentation": "on", 451 | "tx_tcp_segmentation": "on", 452 | "tx_udp_tnl_csum_segmentation": "off [fixed]", 453 | "tx_udp_tnl_segmentation": "off [fixed]", 454 | "tx_vlan_offload": "off [fixed]", 455 | "tx_vlan_stag_hw_insert": "off [fixed]", 456 | "udp_fragmentation_offload": "on", 457 | "vlan_challenged": "on [fixed]" 458 | }, 459 | "hw_timestamp_filters": [], 460 | "ipv4": { 461 | "address": "127.0.0.1", 462 | "broadcast": "host", 463 | "netmask": "255.0.0.0", 464 | "network": "127.0.0.0" 465 | }, 466 | "ipv6": [ 467 | { 468 | "address": "::1", 469 | "prefix": "128", 470 | "scope": "host" 471 | } 472 | ], 473 | "mtu": 65536, 474 | "promisc": false, 475 | "timestamping": [ 476 | "rx_software", 477 | "software" 478 | ], 479 | "type": "loopback" 480 | }, 481 | "lsb": {}, 482 | "lvm": { 483 | "lvs": { 484 | "root": { 485 | "size_g": "17.00", 486 | "vg": "centos" 487 | }, 488 | "swap": { 489 | "size_g": "2.00", 490 | "vg": "centos" 491 | } 492 | }, 493 | "pvs": { 494 | "/dev/sda2": { 495 | "free_g": "0", 496 | "size_g": "19.00", 497 | "vg": "centos" 498 | } 499 | }, 500 | "vgs": { 501 | "centos": { 502 | "free_g": "0", 503 | "num_lvs": "2", 504 | "num_pvs": "1", 505 | "size_g": "19.00" 506 | } 507 | } 508 | }, 509 | "machine": "x86_64", 510 | "machine_id": "92b96e1b7987405aa3c0a5196f12515b", 511 | "memfree_mb": 432, 512 | "memory_mb": { 513 | "nocache": { 514 | "free": 728, 515 | "used": 244 516 | }, 517 | "real": { 518 | "free": 432, 519 | "total": 972, 520 | "used": 540 521 | }, 522 | "swap": { 523 | "cached": 0, 524 | "free": 2047, 525 | "total": 2047, 526 | "used": 0 527 | } 528 | }, 529 | "memtotal_mb": 972, 530 | "module_setup": true, 531 | "mounts": [ 532 | { 533 | "block_available": 224577, 534 | "block_size": 4096, 535 | "block_total": 259584, 536 | "block_used": 35007, 537 | "device": "/dev/sda1", 538 | "fstype": "xfs", 539 | "inode_available": 523962, 540 | "inode_total": 524288, 541 | "inode_used": 326, 542 | "mount": "/boot", 543 | "options": "rw,seclabel,relatime,attr2,inode64,noquota", 544 | "size_available": 919867392, 545 | "size_total": 1063256064, 546 | "uuid": "16f42789-29ba-4717-bf47-0179d2d394bd" 547 | }, 548 | { 549 | "block_available": 4111409, 550 | "block_size": 4096, 551 | "block_total": 4452864, 552 | "block_used": 341455, 553 | "device": "/dev/mapper/centos-root", 554 | "fstype": "xfs", 555 | "inode_available": 8882300, 556 | "inode_total": 8910848, 557 | "inode_used": 28548, 558 | "mount": "/", 559 | "options": "rw,seclabel,relatime,attr2,inode64,noquota", 560 | "size_available": 16840331264, 561 | "size_total": 18238930944, 562 | "uuid": "5411921e-e829-42b0-99a2-9ca14979e84d" 563 | } 564 | ], 565 | "nodename": "ansible1.example.com", 566 | "os_family": "RedHat", 567 | "pkg_mgr": "yum", 568 | "proc_cmdline": { 569 | "BOOT_IMAGE": "/vmlinuz-3.10.0-1127.el7.x86_64", 570 | "LANG": "en_US.UTF-8", 571 | "crashkernel": "auto", 572 | "quiet": true, 573 | "rd.lvm.lv": [ 574 | "centos/root", 575 | "centos/swap" 576 | ], 577 | "rhgb": true, 578 | "ro": true, 579 | "root": "/dev/mapper/centos-root", 580 | "spectre_v2": "retpoline" 581 | }, 582 | "processor": [ 583 | "0", 584 | "GenuineIntel", 585 | "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz" 586 | ], 587 | "processor_cores": 1, 588 | "processor_count": 1, 589 | "processor_threads_per_core": 1, 590 | "processor_vcpus": 1, 591 | "product_name": "VMware Virtual Platform", 592 | "product_serial": "VMware-56 4d bb 01 5c 32 9f b3-13 a0 64 13 70 e5 2f de", 593 | "product_uuid": "01BB4D56-325C-B39F-13A0-641370E52FDE", 594 | "product_version": "None", 595 | "python": { 596 | "executable": "/usr/bin/python", 597 | "has_sslcontext": true, 598 | "type": "CPython", 599 | "version": { 600 | "major": 2, 601 | "micro": 5, 602 | "minor": 7, 603 | "releaselevel": "final", 604 | "serial": 0 605 | }, 606 | "version_info": [ 607 | 2, 608 | 7, 609 | 5, 610 | "final", 611 | 0 612 | ] 613 | }, 614 | "python_version": "2.7.5", 615 | "real_group_id": 0, 616 | "real_user_id": 0, 617 | "selinux": { 618 | "config_mode": "enforcing", 619 | "mode": "enforcing", 620 | "policyvers": 31, 621 | "status": "enabled", 622 | "type": "targeted" 623 | }, 624 | "selinux_python_present": true, 625 | "service_mgr": "systemd", 626 | "ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBIpvCrFEddsKZG5D9tk3BS+OpvlQbJ6rcZsEU0okynbk8pOYwPNqlgcQ15yggfA4I8USWZVRLBjks7CkzOai8k0=", 627 | "ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIE3TbdbZfl0PMMbDPfkvf1/uNjQOBe2fzjF9ERu5qtSb", 628 | "ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABAQCo1calzWGxuUkxG4Ydh2YyKoNtMfOKbWeh62TWrDt/R9t3t9UQvQbCTUybB2HRAVRJjkt/V8dtSevgaPBIOsSuvWUfxXx4kQ7MZwjXtZ14qis/V38+7YTlktD8MPDlv8JwwqqfyRGQZoWXbWQ2X+o0X914WYrIabz+UmPiNnXkF/+ZSSBXedkg8nqOHIIVabVwPh9UIusyY/e3eZIVw/fdZoNGrQsrm4740fu0bHlf18ypcXtKpWCpUe61PKIJwgkL1vAkzq4J7q2/83fMnlOwuwdcEWdZ2hEUWDSGtAk4/kbce50k81A7lxEeCSjKMpNZi3kIEKSdK9WgCzGp6l6X", 629 | "swapfree_mb": 2047, 630 | "swaptotal_mb": 2047, 631 | "system": "Linux", 632 | "system_capabilities": [ 633 | "cap_chown", 634 | "cap_dac_override", 635 | "cap_dac_read_search", 636 | "cap_fowner", 637 | "cap_fsetid", 638 | "cap_kill", 639 | "cap_setgid", 640 | "cap_setuid", 641 | "cap_setpcap", 642 | "cap_linux_immutable", 643 | "cap_net_bind_service", 644 | "cap_net_broadcast", 645 | "cap_net_admin", 646 | "cap_net_raw", 647 | "cap_ipc_lock", 648 | "cap_ipc_owner", 649 | "cap_sys_module", 650 | "cap_sys_rawio", 651 | "cap_sys_chroot", 652 | "cap_sys_ptrace", 653 | "cap_sys_pacct", 654 | "cap_sys_admin", 655 | "cap_sys_boot", 656 | "cap_sys_nice", 657 | "cap_sys_resource", 658 | "cap_sys_time", 659 | "cap_sys_tty_config", 660 | "cap_mknod", 661 | "cap_lease", 662 | "cap_audit_write", 663 | "cap_audit_control", 664 | "cap_setfcap", 665 | "cap_mac_override", 666 | "cap_mac_admin", 667 | "cap_syslog", 668 | "35", 669 | "36+ep" 670 | ], 671 | "system_capabilities_enforced": "True", 672 | "system_vendor": "VMware, Inc.", 673 | "uptime_seconds": 92435, 674 | "user_dir": "/root", 675 | "user_gecos": "root", 676 | "user_gid": 0, 677 | "user_id": "root", 678 | "user_shell": "/bin/bash", 679 | "user_uid": 0, 680 | "userspace_architecture": "x86_64", 681 | "userspace_bits": "64", 682 | "virtualization_role": "guest", 683 | "virtualization_type": "VMware" 684 | } 685 | } 686 | ok: [ansible2.example.com] => { 687 | "ansible_facts": { 688 | "all_ipv4_addresses": [ 689 | "192.168.4.212" 690 | ], 691 | "all_ipv6_addresses": [ 692 | "fe80::6fa7:5623:45ff:7096" 693 | ], 694 | "ansible_local": { 695 | "custom": { 696 | "packages": { 697 | "db_package": "mariadb-server", 698 | "ftp_package": "vsftpd", 699 | "smb_package": "samba", 700 | "web_package": "httpd" 701 | }, 702 | "services": { 703 | "db_service": "mariadb", 704 | "ftp_service": "vsftpd", 705 | "smb_service": "smb", 706 | "web_service": "httpd" 707 | } 708 | } 709 | }, 710 | "apparmor": { 711 | "status": "disabled" 712 | }, 713 | "architecture": "x86_64", 714 | "bios_date": "02/27/2020", 715 | "bios_version": "6.00", 716 | "cmdline": { 717 | "BOOT_IMAGE": "/vmlinuz-3.10.0-1127.el7.x86_64", 718 | "LANG": "en_US.UTF-8", 719 | "crashkernel": "auto", 720 | "quiet": true, 721 | "rd.lvm.lv": "centos/swap", 722 | "rhgb": true, 723 | "ro": true, 724 | "root": "/dev/mapper/centos-root", 725 | "spectre_v2": "retpoline" 726 | }, 727 | "date_time": { 728 | "date": "2020-08-25", 729 | "day": "25", 730 | "epoch": "1598340832", 731 | "hour": "03", 732 | "iso8601": "2020-08-25T07:33:52Z", 733 | "iso8601_basic": "20200825T033352125209", 734 | "iso8601_basic_short": "20200825T033352", 735 | "iso8601_micro": "2020-08-25T07:33:52.125270Z", 736 | "minute": "33", 737 | "month": "08", 738 | "second": "52", 739 | "time": "03:33:52", 740 | "tz": "EDT", 741 | "tz_offset": "-0400", 742 | "weekday": "Tuesday", 743 | "weekday_number": "2", 744 | "weeknumber": "34", 745 | "year": "2020" 746 | }, 747 | "default_ipv4": { 748 | "address": "192.168.4.212", 749 | "alias": "ens33", 750 | "broadcast": "192.168.4.255", 751 | "gateway": "192.168.4.2", 752 | "interface": "ens33", 753 | "macaddress": "00:0c:29:ea:d1:3c", 754 | "mtu": 1500, 755 | "netmask": "255.255.255.0", 756 | "network": "192.168.4.0", 757 | "type": "ether" 758 | }, 759 | "default_ipv6": {}, 760 | "device_links": { 761 | "ids": { 762 | "dm-0": [ 763 | "dm-name-centos-root", 764 | "dm-uuid-LVM-J4I9EZRl5eQknrcgMzEXIyU3d0LAX83HpjJflpbsyWcBHsK4jc3Jvzny3aMHYzEI" 765 | ], 766 | "dm-1": [ 767 | "dm-name-centos-swap", 768 | "dm-uuid-LVM-J4I9EZRl5eQknrcgMzEXIyU3d0LAX83Hn5i0cluPM67e9zU5y7eZoeqMnI5uKFMu" 769 | ], 770 | "sda2": [ 771 | "lvm-pv-uuid-kbqIz5-JsFx-1p5V-jv4E-Ufux-kewW-hh5rBv" 772 | ], 773 | "sr0": [ 774 | "ata-VMware_Virtual_IDE_CDROM_Drive_10000000000000000001" 775 | ] 776 | }, 777 | "labels": {}, 778 | "masters": { 779 | "sda2": [ 780 | "dm-0", 781 | "dm-1" 782 | ] 783 | }, 784 | "uuids": { 785 | "dm-0": [ 786 | "c6e9c97e-811e-4483-bf2e-f8e334e9c697" 787 | ], 788 | "dm-1": [ 789 | "405c069a-c0c0-4d5f-96f8-f2dfc8544cfd" 790 | ], 791 | "sda1": [ 792 | "7c46fddb-5375-4ffb-8837-385fe860159d" 793 | ] 794 | } 795 | }, 796 | "devices": { 797 | "dm-0": { 798 | "holders": [], 799 | "host": "", 800 | "links": { 801 | "ids": [ 802 | "dm-name-centos-root", 803 | "dm-uuid-LVM-J4I9EZRl5eQknrcgMzEXIyU3d0LAX83HpjJflpbsyWcBHsK4jc3Jvzny3aMHYzEI" 804 | ], 805 | "labels": [], 806 | "masters": [], 807 | "uuids": [ 808 | "c6e9c97e-811e-4483-bf2e-f8e334e9c697" 809 | ] 810 | }, 811 | "model": null, 812 | "partitions": {}, 813 | "removable": "0", 814 | "rotational": "1", 815 | "sas_address": null, 816 | "sas_device_handle": null, 817 | "scheduler_mode": "", 818 | "sectors": "35643392", 819 | "sectorsize": "512", 820 | "size": "17.00 GB", 821 | "support_discard": "0", 822 | "vendor": null, 823 | "virtual": 1 824 | }, 825 | "dm-1": { 826 | "holders": [], 827 | "host": "", 828 | "links": { 829 | "ids": [ 830 | "dm-name-centos-swap", 831 | "dm-uuid-LVM-J4I9EZRl5eQknrcgMzEXIyU3d0LAX83Hn5i0cluPM67e9zU5y7eZoeqMnI5uKFMu" 832 | ], 833 | "labels": [], 834 | "masters": [], 835 | "uuids": [ 836 | "405c069a-c0c0-4d5f-96f8-f2dfc8544cfd" 837 | ] 838 | }, 839 | "model": null, 840 | "partitions": {}, 841 | "removable": "0", 842 | "rotational": "1", 843 | "sas_address": null, 844 | "sas_device_handle": null, 845 | "scheduler_mode": "", 846 | "sectors": "4194304", 847 | "sectorsize": "512", 848 | "size": "2.00 GB", 849 | "support_discard": "0", 850 | "vendor": null, 851 | "virtual": 1 852 | }, 853 | "sda": { 854 | "holders": [], 855 | "host": "SCSI storage controller: Broadcom / LSI 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)", 856 | "links": { 857 | "ids": [], 858 | "labels": [], 859 | "masters": [], 860 | "uuids": [] 861 | }, 862 | "model": "VMware Virtual S", 863 | "partitions": { 864 | "sda1": { 865 | "holders": [], 866 | "links": { 867 | "ids": [], 868 | "labels": [], 869 | "masters": [], 870 | "uuids": [ 871 | "7c46fddb-5375-4ffb-8837-385fe860159d" 872 | ] 873 | }, 874 | "sectors": "2097152", 875 | "sectorsize": 512, 876 | "size": "1.00 GB", 877 | "start": "2048", 878 | "uuid": "7c46fddb-5375-4ffb-8837-385fe860159d" 879 | }, 880 | "sda2": { 881 | "holders": [ 882 | "centos-root", 883 | "centos-swap" 884 | ], 885 | "links": { 886 | "ids": [ 887 | "lvm-pv-uuid-kbqIz5-JsFx-1p5V-jv4E-Ufux-kewW-hh5rBv" 888 | ], 889 | "labels": [], 890 | "masters": [ 891 | "dm-0", 892 | "dm-1" 893 | ], 894 | "uuids": [] 895 | }, 896 | "sectors": "39843840", 897 | "sectorsize": 512, 898 | "size": "19.00 GB", 899 | "start": "2099200", 900 | "uuid": null 901 | } 902 | }, 903 | "removable": "0", 904 | "rotational": "1", 905 | "sas_address": null, 906 | "sas_device_handle": null, 907 | "scheduler_mode": "deadline", 908 | "sectors": "41943040", 909 | "sectorsize": "512", 910 | "size": "20.00 GB", 911 | "support_discard": "0", 912 | "vendor": "VMware,", 913 | "virtual": 1 914 | }, 915 | "sr0": { 916 | "holders": [], 917 | "host": "IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)", 918 | "links": { 919 | "ids": [ 920 | "ata-VMware_Virtual_IDE_CDROM_Drive_10000000000000000001" 921 | ], 922 | "labels": [], 923 | "masters": [], 924 | "uuids": [] 925 | }, 926 | "model": "VMware IDE CDR10", 927 | "partitions": {}, 928 | "removable": "1", 929 | "rotational": "1", 930 | "sas_address": null, 931 | "sas_device_handle": null, 932 | "scheduler_mode": "deadline", 933 | "sectors": "2097151", 934 | "sectorsize": "512", 935 | "size": "1024.00 MB", 936 | "support_discard": "0", 937 | "vendor": "NECVMWar", 938 | "virtual": 1 939 | } 940 | }, 941 | "discovered_interpreter_python": "/usr/bin/python", 942 | "distribution": "CentOS", 943 | "distribution_file_parsed": true, 944 | "distribution_file_path": "/etc/redhat-release", 945 | "distribution_file_variety": "RedHat", 946 | "distribution_major_version": "7", 947 | "distribution_release": "Core", 948 | "distribution_version": "7.8", 949 | "dns": { 950 | "nameservers": [ 951 | "8.8.8.8" 952 | ], 953 | "search": [ 954 | "example.com" 955 | ] 956 | }, 957 | "domain": "example.com", 958 | "effective_group_id": 0, 959 | "effective_user_id": 0, 960 | "ens33": { 961 | "active": true, 962 | "device": "ens33", 963 | "features": { 964 | "busy_poll": "off [fixed]", 965 | "fcoe_mtu": "off [fixed]", 966 | "generic_receive_offload": "on", 967 | "generic_segmentation_offload": "on", 968 | "highdma": "off [fixed]", 969 | "hw_tc_offload": "off [fixed]", 970 | "l2_fwd_offload": "off [fixed]", 971 | "large_receive_offload": "off [fixed]", 972 | "loopback": "off [fixed]", 973 | "netns_local": "off [fixed]", 974 | "ntuple_filters": "off [fixed]", 975 | "receive_hashing": "off [fixed]", 976 | "rx_all": "off", 977 | "rx_checksumming": "off", 978 | "rx_fcs": "off", 979 | "rx_gro_hw": "off [fixed]", 980 | "rx_udp_tunnel_port_offload": "off [fixed]", 981 | "rx_vlan_filter": "on [fixed]", 982 | "rx_vlan_offload": "on", 983 | "rx_vlan_stag_filter": "off [fixed]", 984 | "rx_vlan_stag_hw_parse": "off [fixed]", 985 | "scatter_gather": "on", 986 | "tcp_segmentation_offload": "on", 987 | "tx_checksum_fcoe_crc": "off [fixed]", 988 | "tx_checksum_ip_generic": "on", 989 | "tx_checksum_ipv4": "off [fixed]", 990 | "tx_checksum_ipv6": "off [fixed]", 991 | "tx_checksum_sctp": "off [fixed]", 992 | "tx_checksumming": "on", 993 | "tx_fcoe_segmentation": "off [fixed]", 994 | "tx_gre_csum_segmentation": "off [fixed]", 995 | "tx_gre_segmentation": "off [fixed]", 996 | "tx_gso_partial": "off [fixed]", 997 | "tx_gso_robust": "off [fixed]", 998 | "tx_ipip_segmentation": "off [fixed]", 999 | "tx_lockless": "off [fixed]", 1000 | "tx_nocache_copy": "off", 1001 | "tx_scatter_gather": "on", 1002 | "tx_scatter_gather_fraglist": "off [fixed]", 1003 | "tx_sctp_segmentation": "off [fixed]", 1004 | "tx_sit_segmentation": "off [fixed]", 1005 | "tx_tcp6_segmentation": "off [fixed]", 1006 | "tx_tcp_ecn_segmentation": "off [fixed]", 1007 | "tx_tcp_mangleid_segmentation": "off", 1008 | "tx_tcp_segmentation": "on", 1009 | "tx_udp_tnl_csum_segmentation": "off [fixed]", 1010 | "tx_udp_tnl_segmentation": "off [fixed]", 1011 | "tx_vlan_offload": "on [fixed]", 1012 | "tx_vlan_stag_hw_insert": "off [fixed]", 1013 | "udp_fragmentation_offload": "off [fixed]", 1014 | "vlan_challenged": "off [fixed]" 1015 | }, 1016 | "hw_timestamp_filters": [], 1017 | "ipv4": { 1018 | "address": "192.168.4.212", 1019 | "broadcast": "192.168.4.255", 1020 | "netmask": "255.255.255.0", 1021 | "network": "192.168.4.0" 1022 | }, 1023 | "ipv6": [ 1024 | { 1025 | "address": "fe80::6fa7:5623:45ff:7096", 1026 | "prefix": "64", 1027 | "scope": "link" 1028 | } 1029 | ], 1030 | "macaddress": "00:0c:29:ea:d1:3c", 1031 | "module": "e1000", 1032 | "mtu": 1500, 1033 | "pciid": "0000:02:01.0", 1034 | "promisc": false, 1035 | "speed": 1000, 1036 | "timestamping": [ 1037 | "tx_software", 1038 | "rx_software", 1039 | "software" 1040 | ], 1041 | "type": "ether" 1042 | }, 1043 | "env": { 1044 | "HOME": "/root", 1045 | "LANG": "en_US.UTF-8", 1046 | "LOGNAME": "root", 1047 | "LS_COLORS": "rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:", 1048 | "MAIL": "/var/mail/ansible", 1049 | "PATH": "/sbin:/bin:/usr/sbin:/usr/bin", 1050 | "PWD": "/home/ansible", 1051 | "SHELL": "/bin/bash", 1052 | "SHLVL": "1", 1053 | "SUDO_COMMAND": "/bin/sh -c echo BECOME-SUCCESS-hjvjmvitkvovftwbhhuvzfkgzmoylzqx ; /usr/bin/python /home/ansible/.ansible/tmp/ansible-tmp-1598340831.06-15013-176440203891706/AnsiballZ_setup.py", 1054 | "SUDO_GID": "1000", 1055 | "SUDO_UID": "1000", 1056 | "SUDO_USER": "ansible", 1057 | "TERM": "xterm-256color", 1058 | "USER": "root", 1059 | "USERNAME": "root", 1060 | "XDG_SESSION_ID": "38", 1061 | "_": "/usr/bin/python" 1062 | }, 1063 | "fibre_channel_wwn": [], 1064 | "fips": false, 1065 | "form_factor": "Other", 1066 | "fqdn": "ansible2.example.com", 1067 | "gather_subset": [ 1068 | "all" 1069 | ], 1070 | "hostname": "ansible2", 1071 | "hostnqn": "", 1072 | "interfaces": [ 1073 | "lo", 1074 | "ens33" 1075 | ], 1076 | "is_chroot": false, 1077 | "iscsi_iqn": "", 1078 | "kernel": "3.10.0-1127.el7.x86_64", 1079 | "kernel_version": "#1 SMP Tue Mar 31 23:36:51 UTC 2020", 1080 | "lo": { 1081 | "active": true, 1082 | "device": "lo", 1083 | "features": { 1084 | "busy_poll": "off [fixed]", 1085 | "fcoe_mtu": "off [fixed]", 1086 | "generic_receive_offload": "on", 1087 | "generic_segmentation_offload": "on", 1088 | "highdma": "on [fixed]", 1089 | "hw_tc_offload": "off [fixed]", 1090 | "l2_fwd_offload": "off [fixed]", 1091 | "large_receive_offload": "off [fixed]", 1092 | "loopback": "on [fixed]", 1093 | "netns_local": "on [fixed]", 1094 | "ntuple_filters": "off [fixed]", 1095 | "receive_hashing": "off [fixed]", 1096 | "rx_all": "off [fixed]", 1097 | "rx_checksumming": "on [fixed]", 1098 | "rx_fcs": "off [fixed]", 1099 | "rx_gro_hw": "off [fixed]", 1100 | "rx_udp_tunnel_port_offload": "off [fixed]", 1101 | "rx_vlan_filter": "off [fixed]", 1102 | "rx_vlan_offload": "off [fixed]", 1103 | "rx_vlan_stag_filter": "off [fixed]", 1104 | "rx_vlan_stag_hw_parse": "off [fixed]", 1105 | "scatter_gather": "on", 1106 | "tcp_segmentation_offload": "on", 1107 | "tx_checksum_fcoe_crc": "off [fixed]", 1108 | "tx_checksum_ip_generic": "on [fixed]", 1109 | "tx_checksum_ipv4": "off [fixed]", 1110 | "tx_checksum_ipv6": "off [fixed]", 1111 | "tx_checksum_sctp": "on [fixed]", 1112 | "tx_checksumming": "on", 1113 | "tx_fcoe_segmentation": "off [fixed]", 1114 | "tx_gre_csum_segmentation": "off [fixed]", 1115 | "tx_gre_segmentation": "off [fixed]", 1116 | "tx_gso_partial": "off [fixed]", 1117 | "tx_gso_robust": "off [fixed]", 1118 | "tx_ipip_segmentation": "off [fixed]", 1119 | "tx_lockless": "on [fixed]", 1120 | "tx_nocache_copy": "off [fixed]", 1121 | "tx_scatter_gather": "on [fixed]", 1122 | "tx_scatter_gather_fraglist": "on [fixed]", 1123 | "tx_sctp_segmentation": "on", 1124 | "tx_sit_segmentation": "off [fixed]", 1125 | "tx_tcp6_segmentation": "on", 1126 | "tx_tcp_ecn_segmentation": "on", 1127 | "tx_tcp_mangleid_segmentation": "on", 1128 | "tx_tcp_segmentation": "on", 1129 | "tx_udp_tnl_csum_segmentation": "off [fixed]", 1130 | "tx_udp_tnl_segmentation": "off [fixed]", 1131 | "tx_vlan_offload": "off [fixed]", 1132 | "tx_vlan_stag_hw_insert": "off [fixed]", 1133 | "udp_fragmentation_offload": "on", 1134 | "vlan_challenged": "on [fixed]" 1135 | }, 1136 | "hw_timestamp_filters": [], 1137 | "ipv4": { 1138 | "address": "127.0.0.1", 1139 | "broadcast": "host", 1140 | "netmask": "255.0.0.0", 1141 | "network": "127.0.0.0" 1142 | }, 1143 | "ipv6": [ 1144 | { 1145 | "address": "::1", 1146 | "prefix": "128", 1147 | "scope": "host" 1148 | } 1149 | ], 1150 | "mtu": 65536, 1151 | "promisc": false, 1152 | "timestamping": [ 1153 | "rx_software", 1154 | "software" 1155 | ], 1156 | "type": "loopback" 1157 | }, 1158 | "lsb": {}, 1159 | "lvm": { 1160 | "lvs": { 1161 | "root": { 1162 | "size_g": "17.00", 1163 | "vg": "centos" 1164 | }, 1165 | "swap": { 1166 | "size_g": "2.00", 1167 | "vg": "centos" 1168 | } 1169 | }, 1170 | "pvs": { 1171 | "/dev/sda2": { 1172 | "free_g": "0", 1173 | "size_g": "19.00", 1174 | "vg": "centos" 1175 | } 1176 | }, 1177 | "vgs": { 1178 | "centos": { 1179 | "free_g": "0", 1180 | "num_lvs": "2", 1181 | "num_pvs": "1", 1182 | "size_g": "19.00" 1183 | } 1184 | } 1185 | }, 1186 | "machine": "x86_64", 1187 | "machine_id": "7bc52743dedd4f2fa4ad058af1ab9315", 1188 | "memfree_mb": 407, 1189 | "memory_mb": { 1190 | "nocache": { 1191 | "free": 726, 1192 | "used": 246 1193 | }, 1194 | "real": { 1195 | "free": 407, 1196 | "total": 972, 1197 | "used": 565 1198 | }, 1199 | "swap": { 1200 | "cached": 0, 1201 | "free": 2047, 1202 | "total": 2047, 1203 | "used": 0 1204 | } 1205 | }, 1206 | "memtotal_mb": 972, 1207 | "module_setup": true, 1208 | "mounts": [ 1209 | { 1210 | "block_available": 224577, 1211 | "block_size": 4096, 1212 | "block_total": 259584, 1213 | "block_used": 35007, 1214 | "device": "/dev/sda1", 1215 | "fstype": "xfs", 1216 | "inode_available": 523962, 1217 | "inode_total": 524288, 1218 | "inode_used": 326, 1219 | "mount": "/boot", 1220 | "options": "rw,seclabel,relatime,attr2,inode64,noquota", 1221 | "size_available": 919867392, 1222 | "size_total": 1063256064, 1223 | "uuid": "7c46fddb-5375-4ffb-8837-385fe860159d" 1224 | }, 1225 | { 1226 | "block_available": 4105478, 1227 | "block_size": 4096, 1228 | "block_total": 4452864, 1229 | "block_used": 347386, 1230 | "device": "/dev/mapper/centos-root", 1231 | "fstype": "xfs", 1232 | "inode_available": 8882303, 1233 | "inode_total": 8910848, 1234 | "inode_used": 28545, 1235 | "mount": "/", 1236 | "options": "rw,seclabel,relatime,attr2,inode64,noquota", 1237 | "size_available": 16816037888, 1238 | "size_total": 18238930944, 1239 | "uuid": "c6e9c97e-811e-4483-bf2e-f8e334e9c697" 1240 | } 1241 | ], 1242 | "nodename": "ansible2.example.com", 1243 | "os_family": "RedHat", 1244 | "pkg_mgr": "yum", 1245 | "proc_cmdline": { 1246 | "BOOT_IMAGE": "/vmlinuz-3.10.0-1127.el7.x86_64", 1247 | "LANG": "en_US.UTF-8", 1248 | "crashkernel": "auto", 1249 | "quiet": true, 1250 | "rd.lvm.lv": [ 1251 | "centos/root", 1252 | "centos/swap" 1253 | ], 1254 | "rhgb": true, 1255 | "ro": true, 1256 | "root": "/dev/mapper/centos-root", 1257 | "spectre_v2": "retpoline" 1258 | }, 1259 | "processor": [ 1260 | "0", 1261 | "GenuineIntel", 1262 | "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz" 1263 | ], 1264 | "processor_cores": 1, 1265 | "processor_count": 1, 1266 | "processor_threads_per_core": 1, 1267 | "processor_vcpus": 1, 1268 | "product_name": "VMware Virtual Platform", 1269 | "product_serial": "VMware-56 4d be 14 05 67 f4 9b-0a b2 14 48 b3 ea d1 3c", 1270 | "product_uuid": "14BE4D56-6705-9BF4-0AB2-1448B3EAD13C", 1271 | "product_version": "None", 1272 | "python": { 1273 | "executable": "/usr/bin/python", 1274 | "has_sslcontext": true, 1275 | "type": "CPython", 1276 | "version": { 1277 | "major": 2, 1278 | "micro": 5, 1279 | "minor": 7, 1280 | "releaselevel": "final", 1281 | "serial": 0 1282 | }, 1283 | "version_info": [ 1284 | 2, 1285 | 7, 1286 | 5, 1287 | "final", 1288 | 0 1289 | ] 1290 | }, 1291 | "python_version": "2.7.5", 1292 | "real_group_id": 0, 1293 | "real_user_id": 0, 1294 | "selinux": { 1295 | "config_mode": "enforcing", 1296 | "mode": "enforcing", 1297 | "policyvers": 31, 1298 | "status": "enabled", 1299 | "type": "targeted" 1300 | }, 1301 | "selinux_python_present": true, 1302 | "service_mgr": "systemd", 1303 | "ssh_host_key_ecdsa_public": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBA3CK4tSf54gn50X1PILkOlrbCj/6gWd3G4anhQPxHu6+4jk/jt7vVxT3ixS9NEXQ0xCZTUQUffsG7R3k1zox60=", 1304 | "ssh_host_key_ed25519_public": "AAAAC3NzaC1lZDI1NTE5AAAAIHclUERdIp00Eq37UM2V9jLzO8doSG1vynFPRZOYDthK", 1305 | "ssh_host_key_rsa_public": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDpKgOcze2jemEUgv/8wHeRWUPO9UeggyNkAKFUB13PZA0jQjQF5rpi9t/IA5cdokrMWsZTmHNg+ejJdXsM4pMIcbZ5u9nabeS5UxWjqD8ZQa5QR3qNAE48eb1FKjMJ02OPwEQs1BQw/bYprofd0MW5oQpOPbk3zXGoxCCWltCzuNtfXKFt97k5SXb6BnDspHz5FjPACpxtL4BxTWnjaUm3dRPkWfMslupu1ivSHJTlsM/EeUSLXlN7GVCaB0PI1ccxiS0VWGHEK+QK8wZQdfoOeQr9zFcbPjxMBjR1IBkLtbaVTXCNsSYytmoEYyiWDKAbXZx1AVkW3uWjZPGPQDHl", 1306 | "swapfree_mb": 2047, 1307 | "swaptotal_mb": 2047, 1308 | "system": "Linux", 1309 | "system_capabilities": [ 1310 | "cap_chown", 1311 | "cap_dac_override", 1312 | "cap_dac_read_search", 1313 | "cap_fowner", 1314 | "cap_fsetid", 1315 | "cap_kill", 1316 | "cap_setgid", 1317 | "cap_setuid", 1318 | "cap_setpcap", 1319 | "cap_linux_immutable", 1320 | "cap_net_bind_service", 1321 | "cap_net_broadcast", 1322 | "cap_net_admin", 1323 | "cap_net_raw", 1324 | "cap_ipc_lock", 1325 | "cap_ipc_owner", 1326 | "cap_sys_module", 1327 | "cap_sys_rawio", 1328 | "cap_sys_chroot", 1329 | "cap_sys_ptrace", 1330 | "cap_sys_pacct", 1331 | "cap_sys_admin", 1332 | "cap_sys_boot", 1333 | "cap_sys_nice", 1334 | "cap_sys_resource", 1335 | "cap_sys_time", 1336 | "cap_sys_tty_config", 1337 | "cap_mknod", 1338 | "cap_lease", 1339 | "cap_audit_write", 1340 | "cap_audit_control", 1341 | "cap_setfcap", 1342 | "cap_mac_override", 1343 | "cap_mac_admin", 1344 | "cap_syslog", 1345 | "35", 1346 | "36+ep" 1347 | ], 1348 | "system_capabilities_enforced": "True", 1349 | "system_vendor": "VMware, Inc.", 1350 | "uptime_seconds": 92380, 1351 | "user_dir": "/root", 1352 | "user_gecos": "root", 1353 | "user_gid": 0, 1354 | "user_id": "root", 1355 | "user_shell": "/bin/bash", 1356 | "user_uid": 0, 1357 | "userspace_architecture": "x86_64", 1358 | "userspace_bits": "64", 1359 | "virtualization_role": "guest", 1360 | "virtualization_type": "VMware" 1361 | } 1362 | } 1363 | 1364 | PLAY RECAP ************************************************************************************************************ 1365 | ansible1.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 1366 | ansible2.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 1367 | 1368 | --------------------------------------------------------------------------------