Search & Find
Within the next several scenarios, you will need to search through Ansible's list of modules and figure out which one(s) will work best. Write a task to implement the actions.
Scenario 1¶
Copy a file called foo.conf with owner foo, group bar, from /srv/myfiles to /etc. Give the file rw-r--r-- permissions.
Scenario 1 Solution
- name: Copy file with owner and permissions
copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: bar
mode: '0644'
Scenario 2¶
Use a template file for a configuration file called file.conf. The template is located at /mytemplates/foo.j2. The templated file should end up in a directory /etc. The owner is bin, group is wheel. Permissions are rw-r--r--.
Scenario 2 Solution
- name: Template a file to /etc/files.conf
template:
src: /mytemplates/foo.j2
dest: /etc/file.conf
owner: bin
group: wheel
mode: '0644'
Scenario 3¶
Hard
Download, yum install, and symlink Java 8 ONLY if install directory doesn't exist.
Download from http://download.oracle.com/otn-pub/java/jdk/8u60-b27/jdk-8u60-linux-x64.rpm
Hint: Ansible Block
Scenario 3 Solution
This is one solution, but you may have something slightly different.
- name: Check if Java 8 is installed
stat:
path: /java/oraclejdk8
register: oraclejdk8_sym
- block:
- name: Download Java 8
get_url:
url: http://download.oracle.com/otn-pub/java/jdk/8u60-b27/jdk-8u60-linux-x64.rpm
dest: /opt
- name: Install Java 8
yum:
name: /opt/jdk-8u60-linux-x64.rpm
state: present
- name: Symlink to Java 8 Install
file:
src: /java/oraclejdk8
dest: /opt/java/oraclejdk8
state: link
- name: Clean up Install Directory
file:
src: /opt/jdk-8u60-linux-x64.rpm
state: absent
when: oraclejdk8_sym.stat.islink is not defined
Scenario 4¶
Hard
Update a foo.xml configuration file using a template and restart the foo service only if there are changes found.
Hint: Handler.
Note this one will not work when run as it's just an example.
foo.xml.j2
<Servers>
<Server name={{ server_name }} port={{ http_port }}>
<Servers>
input.json
{
"server_name" : "server1"
"http_port" : "8080"
}
Scenario 4 Solution
- hosts: localhost
gather_facts: false
tasks:
- name: Update Configuration
template:
src: foo.xml.j2
dest: foo.xml
notify: restart
handlers:
- name: restart
service:
name: foo
state: restarted
enabled: yes
Scenario 5¶
Extra Hard
You are asked to create a play that reads a json file called input.json, loops through hosts, and writes name, user, directory to a file called output.txt.
Hint: from_json, with_XXXX
input.json
{
hosts: [ {
name: server1,
user: user1,
directory: /etc/foo,
}, {
name: server2,
user: user2,
directory: /etc/bar
}
]
}
Scenario 5 Solution
#Solution 1
- name: Read JSON file
shell: cat input.json
register: result
- name: Write to file
lineinfile:
path: output.txt
line: "Name: {{ item.name }}, User: {{ item.user }}, Directory: {{ item.directory }}"
state: present
with_items:
- "{{ result.stdout['hosts'][0] | from_json }}"
# Solution 2
- name: "Read Json"
set_fact:
my_var: "{{ lookup('file', 'input.json') | from_json }}"
- name: "Print Json"
debug: msg="Name:{{ item.name }}, User:{{ item.user }}, Directory:{{ item.directory }}"
with_items:
- "{{ my_var['hosts'] }}"
# Solution 3
- name: "Read Json"
include_vars:
dir: vars
extensions:
- json
- yml
- name: "Print Json"
debug: msg="Name:{{ item.name }}, User:{{ item.user }}, Directory:{{ item.directory }}"
with_items:
- "{{ hosts }}"