1
0
mirror of https://github.com/geerlingguy/ansible-for-devops.git synced 2024-05-19 06:50:03 +00:00

Add example build of Hubot Slack Docker container image using Ansible.

This commit is contained in:
Jeff Geerling
2018-08-10 16:44:19 -05:00
parent ac0a59ad8f
commit 55a74457ec
7 changed files with 213 additions and 0 deletions

View File

@@ -18,6 +18,10 @@ env:
distro: ubuntu1604
test_idempotence: false
- playbook: docker-hubot.yml
distro: ubuntu1604
test_idempotence: false
- playbook: drupal.yml
distro: ubuntu1604

28
docker-hubot/README.md Normal file
View File

@@ -0,0 +1,28 @@
# Docker Example - Hubot Slack bot container image built with Ansible
This is an example lightweight Docker image build using Ansible which builds a usable Hubot chat bot that works with Slack. The example is explained in more detail in Chapter 13 of [Ansible for DevOps](https://www.ansiblefordevops.com/).
## Get a Slack API Token for your bot
Follow the instructions in Slack's guide, [Slack Developer Kit for Hubot](https://slackapi.github.io/hubot-slack/), and get an API token for a bot attached to a new App installed in the workspace of a Slack organization.
## Build the Hubot container image
Make sure you have Docker installed on the workstation or VM where this playbook is located, then enter the command:
$ ansible-playbook main.yml
This will generate a Docker image named `a4d/hubot-slack`, which you should see listed when you run `docker images`.
## Run the Hubot container image
To run the image, run the command below, replacing `TOKEN_HERE` with the API token your bot uses from Slack:
$ docker run -d --name "hubot-slack" -e HUBOT_
SLACK_TOKEN=TOKEN_HERE a4d/hubot-slack
The container should be running in the background. You can inspect the logs from the bot using `docker logs hubot-slack`, and you can kill and remove the container with `docker rm -f hubot-slack`.
## About the Author
This project was created by [Jeff Geerling](https://www.jeffgeerling.com/) as an example for [Ansible for DevOps](https://www.ansiblefordevops.com/).

54
docker-hubot/main.yml Normal file
View File

@@ -0,0 +1,54 @@
---
- hosts: localhost
connection: local
gather_facts: no
vars:
base_image: node:8
container_name: hubot_slack
image_namespace: a4d
image_name: hubot-slack
pre_tasks:
- name: Make the latest version of the base image available locally.
docker_image:
name: '{{ base_image }}'
force: yes
- name: Create the Docker container.
docker_container:
image: '{{ base_image }}'
name: '{{ container_name }}'
command: sleep infinity
- name: Add the newly created container to the inventory.
add_host:
hostname: '{{ container_name }}'
ansible_connection: docker
roles:
- name: hubot-slack
delegate_to: '{{ container_name }}'
post_tasks:
- name: Clean up the container.
shell: >
apt-get remove --purge -y python &&
rm -rf /var/lib/apt/lists/*
delegate_to: '{{ container_name }}'
args:
warn: no
- name: Commit the container.
command: >
docker commit
-c 'USER hubot'
-c 'WORKDIR "/home/hubot"'
-c 'CMD ["bin/hubot", "--adapter", "slack"]'
-c 'VOLUME ["/home/hubot/scripts"]'
{{ container_name }} {{ image_namespace }}/{{ image_name }}:latest
- name: Remove the container.
docker_container:
name: '{{ container_name }}'
state: absent

View File

@@ -0,0 +1,4 @@
---
hubot_owner: Ansible for DevOps
hubot_name: a4dbot
hubot_description: Ansible for DevOps test bot.

View File

@@ -0,0 +1,57 @@
galaxy_info:
author: your name
description: your description
company: your company (optional)
# If the issue tracker for your role is not on github, uncomment the
# next line and provide a value
# issue_tracker_url: http://example.com/issue/tracker
# Some suggested licenses:
# - BSD (default)
# - MIT
# - GPLv2
# - GPLv3
# - Apache
# - CC-BY
license: license (GPLv2, CC-BY, etc)
min_ansible_version: 1.2
# If this a Container Enabled role, provide the minimum Ansible Container version.
# min_ansible_container_version:
# Optionally specify the branch Galaxy will use when accessing the GitHub
# repo for this role. During role install, if no tags are available,
# Galaxy will use this branch. During import Galaxy will access files on
# this branch. If Travis integration is configured, only notifications for this
# branch will be accepted. Otherwise, in all cases, the repo's default branch
# (usually master) will be used.
#github_branch:
#
# platforms is a list of platforms, and each platform has a name and a list of versions.
#
# platforms:
# - name: Fedora
# versions:
# - all
# - 25
# - name: SomePlatform
# versions:
# - all
# - 1.0
# - 7
# - 99.99
galaxy_tags: []
# List tags for your role here, one per line. A tag is a keyword that describes
# and categorizes the role. Users find roles by searching for tags. Be sure to
# remove the '[]' above, if you add tags to this list.
#
# NOTE: A tag is limited to a single word comprised of alphanumeric characters.
# Maximum 20 tags per role.
dependencies: []
# List your role dependencies here, one per line. Be sure to remove the '[]' above,
# if you add dependencies to this list.

View File

@@ -0,0 +1,47 @@
---
- name: Install dependencies.
package:
name: sudo
state: present
- name: Ensure hubot user exists.
user:
name: hubot
create_home: yes
- name: Install required Node.js packages.
npm:
name: "{{ item }}"
state: present
global: yes
with_items:
- yo
- generator-hubot
- name: Generate hubot.
command: >
yo hubot
--owner="{{ hubot_owner }}"
--name="{{ hubot_name }}"
--description="{{ hubot_description }}"
--adapter=slack
--defaults
chdir=/home/hubot
become: yes
become_user: hubot
- name: Remove certain scripts from external-scripts.json.
lineinfile:
path: /home/hubot/external-scripts.json
regexp: "{{ item }}"
state: absent
with_items:
- 'redis-brain'
- 'heroku'
become: yes
become_user: hubot
- name: Remove the hubot-scripts.json file.
file:
path: /home/hubot/hubot-scripts.json
state: absent

19
tests/docker-hubot.yml Normal file
View File

@@ -0,0 +1,19 @@
---
- hosts: all
vars:
pip_install_packages:
# See: https://github.com/ansible/ansible/issues/35612
- name: docker
version: "2.7.0"
pre_tasks:
- name: Update the apt cache.
apt: update_cache=yes cache_valid_time=600
roles:
- geerlingguy.docker
- geerlingguy.pip
# Docker Hubot test.
- import_playbook: ../docker-hubot/main.yml