Skip to content

Instantly share code, notes, and snippets.

@briandant
Created October 9, 2017 21:09
Show Gist options
  • Save briandant/709b19b9f9f175fdd915bf2c3f08add2 to your computer and use it in GitHub Desktop.
Save briandant/709b19b9f9f175fdd915bf2c3f08add2 to your computer and use it in GitHub Desktop.

➜ ficus vagrant up Ignoring ffi-1.9.10 because its extensions are not built. Try: gem pristine ffi --version 1.9.10 Ignoring nokogiri-1.6.3.1 because its extensions are not built. Try: gem pristine nokogiri --version 1.6.3.1 Ignoring unf_ext-0.0.7.1 because its extensions are not built. Try: gem pristine unf_ext --version 0.0.7.1 Bringing machine 'default' up with 'virtualbox' provider... ==> default: Importing base box 'ficus-devstack-2017-02-07'... ==> default: Matching MAC address for NAT networking... ==> default: Setting the name of the VM: ficus_default_1507581667207_79795 ==> default: Clearing any previously set network interfaces... ==> default: Preparing network interfaces based on configuration... default: Adapter 1: nat default: Adapter 2: hostonly ==> default: Forwarding ports... default: 8000 (guest) => 8000 (host) (adapter 1) default: 8001 (guest) => 8001 (host) (adapter 1) default: 8002 (guest) => 8002 (host) (adapter 1) default: 8003 (guest) => 8003 (host) (adapter 1) default: 8031 (guest) => 8031 (host) (adapter 1) default: 8120 (guest) => 8120 (host) (adapter 1) default: 8765 (guest) => 8765 (host) (adapter 1) default: 9200 (guest) => 9200 (host) (adapter 1) default: 18080 (guest) => 18080 (host) (adapter 1) default: 8100 (guest) => 8100 (host) (adapter 1) default: 8110 (guest) => 8110 (host) (adapter 1) default: 9876 (guest) => 9876 (host) (adapter 1) default: 50070 (guest) => 50070 (host) (adapter 1) default: 8088 (guest) => 8088 (host) (adapter 1) default: 22 (guest) => 2222 (host) (adapter 1) ==> default: Running 'pre-boot' VM customizations... ==> default: Booting VM... ==> default: Waiting for machine to boot. This may take a few minutes... default: SSH address: 127.0.0.1:2222 default: SSH username: vagrant default: SSH auth method: private key ==> default: Machine booted and ready! [default] GuestAdditions versions on your host (5.1.20) and guest (5.1.10) do not match. Reading package lists... Building dependency tree... Reading state information... dkms is already the newest version (2.2.0.3-2ubuntu11.3). linux-headers-4.4.0-31-generic is already the newest version (4.4.0-31.50). 0 upgraded, 0 newly installed, 0 to remove and 89 not upgraded. Copy iso file /Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso into the box /tmp/VBoxGuestAdditions.iso mount: /dev/loop0 is write-protected, mounting read-only Installing Virtualbox Guest Additions 5.1.20 - guest version is 5.1.10 Verifying archive integrity... All good. Uncompressing VirtualBox 5.1.20 Guest Additions for Linux........... VirtualBox Guest Additions installer Removing installed version 5.1.10 of VirtualBox Guest Additions... Copying additional installer modules ... Installing additional modules ... vboxadd.sh: Starting the VirtualBox Guest Additions. An error occurred during installation of VirtualBox Guest Additions 5.1.20. Some functionality may not work as intended. In most cases it is OK that the "Window System drivers" installation failed. ==> default: Checking for guest additions in VM... ==> default: Configuring and enabling network interfaces... ==> default: Exporting NFS shared folders... ==> default: Preparing to edit /etc/exports. Administrator privileges will be required... ==> default: Mounting NFS shared folders... ==> default: Running provisioner: shell... default: Running: inline script ==> default: ==> default: PLAY [all] ********************************************************************* ==> default: ==> default: TASK [setup] ******************************************************************* ==> default: ok: [localhost] ==> default: ==> default: TASK [edx_ansible : Create application user] *********************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [edx_ansible : Create edx_ansible app and venv dir] *********************** ==> default: ok: [localhost] => (item=/edx/app/edx_ansible) ==> default: ok: [localhost] => (item=/edx/var/edx_ansible) ==> default: ok: [localhost] => (item=/edx/app/edx_ansible/venvs) ==> default: ==> default: TASK [edx_ansible : Install a bunch of system packages on which edx_ansible relies] *** ==> default: changed: [localhost] => (item=[u'python-pip', u'python-apt', u'libmysqlclient-dev', u'git-core', u'build-essential', u'python-dev', u'libxml2-dev', u'libxslt1-dev', u'curl', u'python-yaml', u'python-mysqldb']) ==> default: ==> default: TASK [edx_ansible : Git checkout edx_ansible repo into edx_ansible_code_dir] *** ==> default: changed: [localhost] ==> default: ==> default: TASK [edx_ansible : Install edx_ansible venv requirements] ********************* ==> default: ok: [localhost] => (item=/edx/app/edx_ansible/edx_ansible/pre-requirements.txt) ==> default: ok: [localhost] => (item=/edx/app/edx_ansible/edx_ansible/requirements.txt) ==> default: ==> default: TASK [edx_ansible : Create update script] ************************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [edx_ansible : Create symlinks for update script] ************************* ==> default: ok: [localhost] ==> default: ==> default: TASK [edx_ansible : Create utility scripts] ************************************ ==> default: ok: [localhost] => (item={u'dest': u'show-repo-heads', u'src': u'show-repo-heads.j2'}) ==> default: changed: [localhost] => (item={u'dest': u'pre-box', u'src': u'pre-box.j2'}) ==> default: ==> default: TASK [edx_ansible : Create symlinks for utility scripts] *********************** ==> default: ok: [localhost] => (item=show-repo-heads) ==> default: ==> default: TASK [edx_ansible : Create a symlink for ansible-playbook] ********************* ==> default: ok: [localhost] ==> default: ==> default: TASK [edx_ansible : Create a symlink for the playbooks dir] ******************** ==> default: ok: [localhost] ==> default: ==> default: PLAY RECAP ********************************************************************* ==> default: localhost : ok=12 changed=3 unreachable=0 failed=0 ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Install a bunch of system packages on which edx_ansible relies ----------------- 13.96s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Git checkout edx_ansible repo into edx_ansible_code_dir ------------------------ 12.94s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Install edx_ansible venv requirements ------------------------------------------- 3.24s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: -------------------------------------------------------------------------------- 0.49s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Create utility scripts ---------------------------------------------------------- 0.49s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Create edx_ansible app and venv dir --------------------------------------------- 0.41s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Create update script ------------------------------------------------------------ 0.30s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Create application user --------------------------------------------------------- 0.27s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Create a symlink for the playbooks dir ------------------------------------------ 0.12s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Create symlinks for utility scripts --------------------------------------------- 0.12s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: ==> default: Playbook all finished: 2017-10-09 20:43:39.820357, 12 total tasks. 0:00:32.581889 elapsed. ==> default: [DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and ==> default: make sure become_method is 'sudo' (default). ==> default: This feature will be removed in a ==> default: future release. Deprecation warnings can be disabled by setting ==> default: deprecation_warnings=False in ansible.cfg. ==> default: ==> default: PLAY [Configure instance(s)] *************************************************** ==> default: ==> default: TASK [setup] ******************************************************************* ==> default: ok: [localhost] ==> default: ==> default: TASK [server_utils : Install ubuntu system packages] *************************** ==> default: changed: [localhost] => (item=[u'ack-grep', u'mosh', u'curl', u'tree', u'screen', u'tmux', u'curl', u'vim-tiny', u'dnsutils', u'inetutils-telnet', u'netcat']) ==> default: ==> default: TASK [user : Install debian packages user role needs] ************************** ==> default: changed: [localhost] => (item=[u'python-httplib2']) ==> default: ==> default: TASK [user : debug] ************************************************************ ==> default: ok: [localhost] => { ==> default: "user_info": [] ==> default: } ==> default: ==> default: TASK [user : Create the edxadmin group] **************************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [user : Ensure sudoers.d is read] ***************************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [user : Grant full sudo access to the edxadmin group] ********************* ==> default: ok: [localhost] ==> default: ==> default: TASK [user : Create the users] ************************************************* ==> default: ==> default: TASK [user : Assign admin role to admin users] ********************************* ==> default: ==> default: TASK [user : Check the ssh key(s) for user(s) over github] ********************* ==> default: ==> default: TASK [user : debug] ************************************************************ ==> default: ==> default: TASK [user : Get github key(s) and update the authorized_keys file] ************ ==> default: ==> default: TASK [user : Create bashrc file for normal users] ****************************** ==> default: ==> default: TASK [user : Create .profile for all users] ************************************ ==> default: ==> default: TASK [user : Modify shell for restricted users] ******************************** ==> default: ==> default: TASK [user : Create bashrc file for restricted users] ************************** ==> default: ==> default: TASK [user : Create sudoers file from template] ******************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [user : Change home directory ownership to root for restricted users] ***** ==> default: ==> default: TASK [user : Create ~/bin directory] ******************************************* ==> default: ==> default: TASK [user : Create allowed command links] ************************************* ==> default: ==> default: TASK [security : Install security packages] ************************************ ==> default: changed: [localhost] => (item=[u'aptitude', u'unattended-upgrades', u'gcc']) ==> default: ==> default: TASK [security : Update all system packages] *********************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [security : Configure periodic unattended-upgrades] *********************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [security : Disable unattended-upgrades if Xenial (16.04)] **************** ==> default: changed: [localhost] => (item=systemctl disable apt-daily.service) ==> default: changed: [localhost] => (item=systemctl disable apt-daily.timer) ==> default: ==> default: TASK [security : Disable unattended-upgrades] ********************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [security : Only unattended-upgrade from security repo] ******************* ==> default: skipping: [localhost] ==> default: ==> default: TASK [security : Disable security only updates on unattended-upgrades] ********* ==> default: ok: [localhost] ==> default: ==> default: TASK [security : Take security updates during ansible runs] ******************** ==> default: changed: [localhost] => (item=unattended-upgrade --dry-run) ==> default: changed: [localhost] => (item=unattended-upgrade) ==> default: ==> default: TASK [common : Check Configuration Sources] ************************************ ==> default: ==> default: TASK [common : stat] *********************************************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [common : Update CA Certificates] ***************************************** ==> default: changed: [localhost] ==> default: ==> default: TASK [common : stat] *********************************************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [common : Update CA Trust] ************************************************ ==> default: skipping: [localhost] ==> default: ==> default: TASK [common : Add common_users] *********************************************** ==> default: ok: [localhost] => (item=www-data) ==> default: ok: [localhost] => (item=syslog) ==> default: ==> default: TASK [common : check if instance is vagrant] *********************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [common : Add git apt repository] ***************************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [common : Add edX PPA apt key] ******************************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [common : Add custom edX PPA] ********************************************* ==> default: ok: [localhost] ==> default: ==> default: TASK [common : Install role-independent useful system packages] **************** ==> default: changed: [localhost] => (item=[u'ntp', u'acl', u'lynx-cur', u'logrotate', u'rsyslog', u'git', u'unzip', u'python-pip', u'python2.7-dev', u'libpq-dev']) ==> default: ==> default: TASK [common : Install role-independent useful system packages from custom PPA] ==> default: skipping: [localhost] => (item=[]) ==> default: ==> default: TASK [common : Install role-independent useful system packages] **************** ==> default: skipping: [localhost] => (item=[]) ==> default: ==> default: TASK [common : Create common directories] ************************************** ==> default: changed: [localhost] => (item={u'path': u'/edx/var'}) ==> default: ok: [localhost] => (item={u'path': u'/edx/app'}) ==> default: ok: [localhost] => (item={u'path': u'/edx/bin'}) ==> default: ok: [localhost] => (item={u'path': u'/edx/etc'}) ==> default: ok: [localhost] => (item={u'owner': u'syslog', u'path': u'/edx/var/log', u'group': u'syslog'}) ==> default: ok: [localhost] => (item={u'path': u'/etc/logrotate.d/hourly'}) ==> default: ok: [localhost] => (item={u'path': u'/etc/rsyslog.d/50-default.conf', u'state': u'absent'}) ==> default: ==> default: TASK [common : upload sudo config for key forwarding as root] ****************** ==> default: ok: [localhost] ==> default: ==> default: TASK [common : pip install virtualenv] ***************************************** ==> default: changed: [localhost] => (item=pip==8.1.2) ==> default: changed: [localhost] => (item=setuptools==24.0.3) ==> default: changed: [localhost] => (item=virtualenv==15.0.2) ==> default: changed: [localhost] => (item=virtualenvwrapper==4.7.1) ==> default: ==> default: TASK [common : update /etc/hosts] ********************************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [common : update /etc/hostname] ******************************************* ==> default: skipping: [localhost] ==> default: ==> default: TASK [common : run hostname] *************************************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [common : Copy the templates to their respestive destination] ************* ==> default: ok: [localhost] => (item={u'dest': u'/etc/rsyslog.d/99-edx.conf', u'src': u'edx_rsyslog.j2'}) ==> default: ok: [localhost] => (item={u'dest': u'/etc/logrotate.d/hourly/edx-services', u'src': u'etc/logrotate.d/hourly/edx_logrotate.j2'}) ==> default: ok: [localhost] => (item={u'dest': u'/etc/cron.hourly/logrotate', u'src': u'etc/cron.hourly/logrotate.j2', u'mode': u'0555'}) ==> default: ok: [localhost] => (item={u'dest': u'/etc/logrotate.d/hourly/tracking.log', u'src': u'etc/logrotate.d/hourly/edx_logrotate_tracking_log.j2'}) ==> default: ==> default: TASK [common : restart rsyslogd] *********************************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [common : Add ntp alert script] ******************************************* ==> default: ok: [localhost] ==> default: ==> default: TASK [common : Remove MOTD update checker] ************************************* ==> default: ok: [localhost] ==> default: ==> default: TASK [common : Set up a cron job to run the script] **************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [common : install logrotate configuration] ******************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [vhost : Create all service directories] ********************************** ==> default: ok: [localhost] => (item={'key': u'home', 'value': {u'owner': u'root', u'path': u'/edx/app/vhost', u'group': u'root', u'mode': u'0755'}}) ==> default: ok: [localhost] => (item={'key': u'data', 'value': {u'owner': u'root', u'path': u'/edx/var/vhost', u'group': u'root', u'mode': u'0700'}}) ==> default: ok: [localhost] => (item={'key': u'logs', 'value': {u'owner': u'syslog', u'path': u'/edx/var/log/vhost', u'group': u'syslog', u'mode': u'0650'}}) ==> default: ==> default: TASK [vhost : Force logrotate on supervisor stop] ****************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [vhost : Update /etc/dhcp/dhclient.conf] ********************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [vhost : Copy the MOTD template in place] ********************************* ==> default: ok: [localhost] ==> default: ==> default: TASK [vhost : Add motd.tail support for 16.04] ********************************* ==> default: ok: [localhost] ==> default: ==> default: TASK [vhost : Update sshd logging to VERBOSE] ********************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [vhost : Update sshd logging to VERBOSE] ********************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [vhost : Restart ssh] ***************************************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [vhost : Restart ssh] ***************************************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [edx_ansible : Create application user] *********************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [edx_ansible : Create edx_ansible app and venv dir] *********************** ==> default: ok: [localhost] => (item=/edx/app/edx_ansible) ==> default: ok: [localhost] => (item=/edx/var/edx_ansible) ==> default: ok: [localhost] => (item=/edx/app/edx_ansible/venvs) ==> default: ==> default: TASK [edx_ansible : Install a bunch of system packages on which edx_ansible relies] *** ==> default: changed: [localhost] => (item=[u'python-pip', u'python-apt', u'libmysqlclient-dev', u'git-core', u'build-essential', u'python-dev', u'libxml2-dev', u'libxslt1-dev', u'curl', u'python-yaml', u'python-mysqldb']) ==> default: ==> default: TASK [edx_ansible : Git checkout edx_ansible repo into edx_ansible_code_dir] *** ==> default: ok: [localhost] ==> default: ==> default: TASK [edx_ansible : Install edx_ansible venv requirements] ********************* ==> default: ok: [localhost] => (item=/edx/app/edx_ansible/edx_ansible/pre-requirements.txt) ==> default: ok: [localhost] => (item=/edx/app/edx_ansible/edx_ansible/requirements.txt) ==> default: ==> default: TASK [edx_ansible : Create update script] ************************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [edx_ansible : Create symlinks for update script] ************************* ==> default: skipping: [localhost] ==> default: ==> default: TASK [edx_ansible : Create utility scripts] ************************************ ==> default: ok: [localhost] => (item={u'dest': u'show-repo-heads', u'src': u'show-repo-heads.j2'}) ==> default: ok: [localhost] => (item={u'dest': u'pre-box', u'src': u'pre-box.j2'}) ==> default: ==> default: TASK [edx_ansible : Create symlinks for utility scripts] *********************** ==> default: ok: [localhost] => (item=show-repo-heads) ==> default: ==> default: TASK [edx_ansible : Create a symlink for ansible-playbook] ********************* ==> default: ok: [localhost] ==> default: ==> default: TASK [edx_ansible : Create a symlink for the playbooks dir] ******************** ==> default: ok: [localhost] ==> default: ==> default: TASK [mysql : Look for mysql 5.6] ********************************************** ==> default: fatal: [localhost]: FAILED! => {"changed": false, "cmd": "dpkg -s mysql-server", "delta": "0:00:00.017793", "end": "2017-10-09 20:55:10.752523", "failed": true, "rc": 1, "start": "2017-10-09 20:55:10.734730", "stderr": "dpkg-query: package 'mysql-server' is not installed and no information is available\nUse dpkg --info (= dpkg-deb --info) to examine archive files,\nand dpkg --contents (= dpkg-deb --contents) to list their contents.", "stdout": "", "stdout_lines": [], "warnings": []} ==> default: ...ignoring ==> default: ==> default: TASK [mysql : Important message] *********************************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [mysql : pause] *********************************************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [mysql : Stop mysql service] ********************************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [mysql : Remove experimental apt repository] ****************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [mysql : Remove experimental version of mysql] **************************** ==> default: skipping: [localhost] => (item=[]) ==> default: ==> default: TASK [mysql : Add MySQL community apt key] ************************************* ==> default: skipping: [localhost] ==> default: ==> default: TASK [mysql : Install MySQL from their community PPA] ************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [mysql : Install mysql-5.6 and dependencies] ****************************** ==> default: ok: [localhost] => (item=[u'mysql-server-5.6', u'python-mysqldb']) ==> default: ==> default: TASK [mysql : Set bind IP] ***************************************************** ==> default: changed: [localhost] => (item={u'section': u'mysqld', u'option': u'bind-address', u'value': u'127.0.0.1'}) ==> default: ==> default: TASK [mysql : Restart mysql] *************************************************** ==> default: changed: [localhost] ==> default: ==> default: TASK [mysql : Start mysql] ***************************************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [mysql : Ensure Anonymous user(s) does not exist] ************************* ==> default: ok: [localhost] => (item=localhost) ==> default: ok: [localhost] => (item=vagrant) ==> default: ==> default: TASK [mysql : Create remote root user] ***************************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [edxlocal : Install packages needed for single server] ******************** ==> default: ok: [localhost] => (item=[u'postfix', u'libjpeg-dev']) ==> default: ==> default: TASK [edxlocal : create databases] ********************************************* ==> default: ok: [localhost] => (item=ecommerce) ==> default: skipping: [localhost] => (item=) ==> default: skipping: [localhost] => (item=) ==> default: ok: [localhost] => (item=edxapp) ==> default: ok: [localhost] => (item=edxapp_csmh) ==> default: skipping: [localhost] => (item=) ==> default: ok: [localhost] => (item=programs) ==> default: skipping: [localhost] => (item=) ==> default: skipping: [localhost] => (item=) ==> default: skipping: [localhost] => (item=) ==> default: skipping: [localhost] => (item=) ==> default: ==> default: TASK [edxlocal : create database users] **************************************** ==> default: ok: [localhost] => (item={u'db': u'ecommerce', u'user': u'ecomm001', u'pass': u'password'}) ==> default: skipping: [localhost] => (item={u'db': u'', u'user': u'', u'pass': u''}) ==> default: skipping: [localhost] => (item={u'db': u'', u'user': u'', u'pass': u''}) ==> default: ok: [localhost] => (item={u'db': u'edxapp', u'user': u'edxapp001', u'pass': u'password'}) ==> default: ok: [localhost] => (item={u'db': u'edxapp_csmh', u'user': u'edxapp001', u'pass': u'password'}) ==> default: ok: [localhost] => (item={u'db': u'programs', u'user': u'programs001', u'pass': u'password'}) ==> default: skipping: [localhost] => (item={u'db': u'', u'user': u'', u'pass': u''}) ==> default: skipping: [localhost] => (item={u'db': u'', u'user': u'', u'pass': u''}) ==> default: skipping: [localhost] => (item={u'db': u'', u'user': u'', u'pass': u''}) ==> default: skipping: [localhost] => (item={u'db': u'', u'user': u'', u'pass': u''}) ==> default: ==> default: TASK [edxlocal : setup the migration db user] ********************************** ==> default: ok: [localhost] => (item=ecommerce) ==> default: skipping: [localhost] => (item=) ==> default: skipping: [localhost] => (item=) ==> default: ok: [localhost] => (item=edxapp) ==> default: ok: [localhost] => (item=edxapp_csmh) ==> default: skipping: [localhost] => (item=) ==> default: ok: [localhost] => (item=programs) ==> default: skipping: [localhost] => (item=) ==> default: skipping: [localhost] => (item=) ==> default: skipping: [localhost] => (item=) ==> default: skipping: [localhost] => (item=) ==> default: ==> default: TASK [edxlocal : create api user for the analytics api] ************************ ==> default: skipping: [localhost] ==> default: ==> default: TASK [edxlocal : create read-only reports user for the analytics-api] ********** ==> default: skipping: [localhost] ==> default: ==> default: TASK [edxlocal : create a database for the hive metastore] ********************* ==> default: skipping: [localhost] ==> default: ==> default: TASK [edxlocal : setup the edx-notes-api db user] ****************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [edxlocal : setup the read-only db user] ********************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [edxlocal : setup the admin db user] ************************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [edxlocal : grant access to table storing test data in output database] *** ==> default: skipping: [localhost] ==> default: ==> default: TASK [memcache : Install memcached] ******************************************** ==> default: changed: [localhost] ==> default: ==> default: TASK [mongo : Check to see that MongoDB 2.4 is not installed] ****************** ==> default: ok: [localhost] ==> default: ==> default: TASK [mongo : Verify 2.4 not installed] **************************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [mongo : Remove mongo 2.4 if present] ************************************* ==> default: skipping: [localhost] ==> default: ==> default: TASK [mongo : Install python pymongo for mongo_user ansible module] ************ ==> default: changed: [localhost] ==> default: ==> default: TASK [mongo : Add the mongodb signing key] ************************************* ==> default: ok: [localhost] ==> default: ==> default: TASK [mongo : Add the mongodb repo to the sources list] ************************ ==> default: ok: [localhost] ==> default: ==> default: TASK [mongo : Install mongo server and recommends] ***************************** ==> default: changed: [localhost] ==> default: ==> default: TASK [mongo : Create mongo dirs] *********************************************** ==> default: ok: [localhost] => (item=/edx/var/mongo) ==> default: ok: [localhost] => (item=/edx/var/mongo/mongodb) ==> default: ok: [localhost] => (item=/edx/var/log/mongo) ==> default: ok: [localhost] => (item=/edx/var/mongo/mongodb/journal) ==> default: ==> default: TASK [mongo : Add mongod systemd configuration on 16.04] *********************** ==> default: ok: [localhost] ==> default: ==> default: TASK [mongo : enable mongod systemd unit on 16.04] ***************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [mongo : Stop mongod service] ********************************************* ==> default: changed: [localhost] ==> default: ==> default: TASK [mongo : Move mongodb to /edx/var/mongo] ********************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [mongo : Copy mongodb key file] ******************************************* ==> default: skipping: [localhost] ==> default: ==> default: TASK [mongo : Copy configuration template] ************************************* ==> default: changed: [localhost] ==> default: ==> default: TASK [mongo : Start mongo service] ********************************************* ==> default: changed: [localhost] ==> default: ==> default: TASK [mongo : Wait for mongo server to start] ********************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [mongo : Drop super user script] ****************************************** ==> default: changed: [localhost] ==> default: ==> default: TASK [mongo : Create super user with js] *************************************** ==> default: changed: [localhost] ==> default: ==> default: TASK [mongo : Delete super user script] **************************************** ==> default: changed: [localhost] ==> default: ==> default: TASK [mongo : Create the file to initialize the mongod replica set] ************ ==> default: skipping: [localhost] ==> default: ==> default: TASK [mongo : Initialize the replication set] ********************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [mongo : Create a mongodb user] ******************************************* ==> default: changed: [localhost] => (item={u'password': u'password', u'user': u'cs_comments_service', u'roles': u'readWrite', u'database': u'cs_comments_service'}) ==> default: changed: [localhost] => (item={u'password': u'password', u'user': u'edxapp', u'roles': u'readWrite', u'database': u'edxapp'}) ==> default: ==> default: TASK [mongo : Create a mongodb user] ******************************************* ==> default: skipping: [localhost] => (item={u'password': u'password', u'user': u'cs_comments_service', u'roles': u'readWrite', u'database': u'cs_comments_service'}) ==> default: skipping: [localhost] => (item={u'password': u'password', u'user': u'edxapp', u'roles': u'readWrite', u'database': u'edxapp'}) ==> default: ==> default: TASK [mongo : Install s3cmd] *************************************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [mongo : Configure s3cmd and install backup-mongo-to-s3 script] *********** ==> default: skipping: [localhost] => (item={u'dest': u'/edx/var/mongo-s3-backup.s3cfg', u'src': u'mongo-s3-backup-s3cfg.j2', u'mode': u'0600'}) ==> default: skipping: [localhost] => (item={u'dest': u'/edx/bin/backup-mongo-to-s3.sh', u'src': u'backup-mongo-to-s3.j2', u'mode': u'0700'}) ==> default: ==> default: TASK [mongo : Schedule backup-mongo-to-3s crontab] ***************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [rabbitmq : Install python-software-properties if debian] ***************** ==> default: ok: [localhost] => (item=[u'python-software-properties', u'gdebi']) ==> default: ==> default: TASK [rabbitmq : Fetch the rabbitmq server deb] ******************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [rabbitmq : Check if rabbit is installed] ********************************* ==> default: changed: [localhost] ==> default: ==> default: TASK [rabbitmq : Install rabbit package using gdebi] *************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [rabbitmq : Stop rabbit cluster] ****************************************** ==> default: changed: [localhost] ==> default: ==> default: TASK [rabbitmq : Send sigterm to any running rabbitmq processes] *************** ==> default: changed: [localhost] ==> default: ==> default: TASK [rabbitmq : Create rabbitmq edx directories] ****************************** ==> default: ok: [localhost] => (item=/edx/app/rabbitmq) ==> default: ok: [localhost] => (item=/edx/var/log/rabbitmq) ==> default: ==> default: TASK [rabbitmq : Add queue monitoring script] ********************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [rabbitmq : Set up a cron job to run the script] ************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [rabbitmq : install logrotate configuration] ****************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [rabbitmq : Create cookie directory] ************************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [rabbitmq : Add rabbitmq erlang cookie] *********************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [rabbitmq : Create rabbitmq config directory] ***************************** ==> default: changed: [localhost] ==> default: ==> default: TASK [rabbitmq : Add rabbitmq environment configuration] *********************** ==> default: ok: [localhost] ==> default: ==> default: TASK [rabbitmq : Add rabbitmq cluster configuration] *************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [rabbitmq : Install plugins] ********************************************** ==> default: ok: [localhost] => (item=rabbitmq_management) ==> default: ==> default: TASK [rabbitmq : Remove mnesia configuration] ********************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [rabbitmq : Start rabbit nodes] ******************************************* ==> default: changed: [localhost] ==> default: ==> default: TASK [rabbitmq : Wait for rabbit to start] ************************************* ==> default: ok: [localhost] ==> default: ==> default: TASK [rabbitmq : Remove guest user] ******************************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [rabbitmq : Add vhosts] *************************************************** ==> default: ok: [localhost] => (item=/) ==> default: ==> default: TASK [rabbitmq : Add admin users] ********************************************** ==> default: ok: [localhost] => (item=[{u'password': u'the example admin password', u'name': u'admin'}, u'/']) ==> default: ok: [localhost] => (item=[{u'password': u'edx', u'name': u'edx'}, u'/']) ==> default: ok: [localhost] => (item=[{u'password': u'celery', u'name': u'celery'}, u'/']) ==> default: ==> default: TASK [rabbitmq : Make queues mirrored] ***************************************** ==> default: skipping: [localhost] => (item=/) ==> default: ==> default: TASK [rabbitmq : Install admin tools] ****************************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [rabbitmq : Ensure rabbitmqadmin attributes] ****************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [supervisor : Create application and supervisor service user] ************* ==> default: ok: [localhost] => (item=supervisor) ==> default: ok: [localhost] => (item=www-data) ==> default: ==> default: TASK [supervisor : Create supervisor and service user accessible directories] ** ==> default: ok: [localhost] => (item=/edx/app/supervisor) ==> default: ok: [localhost] => (item=/edx/app/supervisor/venvs/supervisor) ==> default: ok: [localhost] => (item=/edx/app/supervisor/conf.d) ==> default: ok: [localhost] => (item=/edx/app/supervisor/conf.available.d) ==> default: ==> default: TASK [supervisor : Create supervisor directories] ****************************** ==> default: ok: [localhost] => (item=/edx/var/supervisor) ==> default: ok: [localhost] => (item=/edx/var/log/supervisor) ==> default: ==> default: TASK [supervisor : Install supervisor in its venv] ***************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [supervisor : Install supervisor in its venv] ***************************** ==> default: ok: [localhost] => (item=boto=="2.34.0") ==> default: ok: [localhost] => (item=python-simple-hipchat) ==> default: ==> default: TASK [supervisor : Create supervisor upstart job] ****************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [supervisor : create pre_supervisor upstart job] ************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [supervisor : Create supervisor systemd job] ****************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [supervisor : Write the pre_suprevisor python script] ********************* ==> default: ok: [localhost] ==> default: ==> default: TASK [supervisor : Create supervisor master config] **************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [supervisor : Remove a symlink for supervisortctl] ************************ ==> default: changed: [localhost] ==> default: ==> default: TASK [supervisor : Remove symlink for supervisor cfg] ************************** ==> default: ok: [localhost] => (item=/edx/app/supervisor/supervisord.conf) ==> default: ok: [localhost] => (item=/edx/app/supervisor/conf.d) ==> default: ==> default: TASK [supervisor : Create helper script for running supervisor] **************** ==> default: changed: [localhost] ==> default: ==> default: TASK [supervisor : Are we in a Docker container] ******************************* ==> default: changed: [localhost] ==> default: ==> default: TASK [supervisor : Enable supervisor to start on boot] ************************* ==> default: ok: [localhost] ==> default: ==> default: TASK [supervisor : Start supervisor] ******************************************* ==> default: skipping: [localhost] ==> default: ==> default: TASK [supervisor : Wait for web port to be available] ************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [supervisor : Update supervisor configuration] **************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [edxapp_common : Install system packages] ********************************* ==> default: changed: [localhost] => (item=[u'build-essential', u'gfortran', u'graphviz', u'graphviz-dev', u'liblapack-dev', u'libmysqlclient-dev', u'libxml2-dev', u'libgeos-dev', u'libxslt1-dev', u'gettext', u'libjpeg8-dev', u'libpng12-dev', u'libxmlsec1-dev', u'swig']) ==> default: ==> default: TASK [nltk : Install unzip] **************************************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [nltk : create the nltk data directory and subdirectories] **************** ==> default: ok: [localhost] => (item={u'url': u'http://nltk.github.io/nltk_data/packages/taggers/maxent_treebank_pos_tagger.zip', u'path': u'taggers/maxent_treebank_pos_tagger'}) ==> default: ok: [localhost] => (item={u'url': u'http://nltk.github.io/nltk_data/packages/corpora/stopwords.zip', u'path': u'corpora/stopwords'}) ==> default: ok: [localhost] => (item={u'url': u'http://nltk.github.io/nltk_data/packages/corpora/wordnet.zip', u'path': u'corpora/wordnet'}) ==> default: ==> default: TASK [nltk : download nltk data] *********************************************** ==> default: ok: [localhost] => (item={u'url': u'http://nltk.github.io/nltk_data/packages/taggers/maxent_treebank_pos_tagger.zip', u'path': u'taggers/maxent_treebank_pos_tagger'}) ==> default: ok: [localhost] => (item={u'url': u'http://nltk.github.io/nltk_data/packages/corpora/stopwords.zip', u'path': u'corpora/stopwords'}) ==> default: ok: [localhost] => (item={u'url': u'http://nltk.github.io/nltk_data/packages/corpora/wordnet.zip', u'path': u'corpora/wordnet'}) ==> default: ==> default: TASK [nltk : unarchive nltk data] ********************************************** ==> default: skipping: [localhost] => (item={u'url': u'http://nltk.github.io/nltk_data/packages/taggers/maxent_treebank_pos_tagger.zip', u'path': u'taggers/maxent_treebank_pos_tagger'}) ==> default: skipping: [localhost] => (item={u'url': u'http://nltk.github.io/nltk_data/packages/corpora/stopwords.zip', u'path': u'corpora/stopwords'}) ==> default: skipping: [localhost] => (item={u'url': u'http://nltk.github.io/nltk_data/packages/corpora/wordnet.zip', u'path': u'corpora/wordnet'}) ==> default: ==> default: TASK [add_user : create user groups] ******************************************* ==> default: skipping: [localhost] => (item=edx-themes) ==> default: ==> default: TASK [add_user : create application user] ************************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [add_user : ensure correct ownership of home directory] ******************* ==> default: skipping: [localhost] ==> default: ==> default: TASK [add_user : create dirs for the user] ************************************* ==> default: ==> default: TASK [git_clone : Set git fetch.prune to ignore deleted remote refs] *********** ==> default: skipping: [localhost] ==> default: ==> default: TASK [git_clone : Validate git protocol] *************************************** ==> default: skipping: [localhost] => (item=(censored due to no_log)) ==> default: ==> default: TASK [git_clone : Install read-only ssh key] *********************************** ==> default: skipping: [localhost] => (item=(censored due to no_log)) ==> default: ==> default: TASK [git_clone : Checkout code over ssh] ************************************** ==> default: skipping: [localhost] => (item=(censored due to no_log)) ==> default: ==> default: TASK [git_clone : Checkout code over https] ************************************ ==> default: skipping: [localhost] => (item=(censored due to no_log)) ==> default: ==> default: TASK [git_clone : Remove read-only ssh key] ************************************ ==> default: skipping: [localhost] => (item=(censored due to no_log)) ==> default: ==> default: TASK [edx_themes : ensure edx-theme's group has read/write access to themes directory] *** ==> default: skipping: [localhost] ==> default: ==> default: TASK [edx_themes : Add theme users to theme's group so that that have read/write access to themes directories] *** ==> default: skipping: [localhost] => (item=edxapp) ==> default: ==> default: TASK [edx_themes : update .bashrc to set umask value] ************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [edxapp : create application user] **************************************** ==> default: changed: [localhost] ==> default: ==> default: TASK [edxapp : create edxapp user dirs] **************************************** ==> default: ok: [localhost] => (item={u'path': u'/edx/app/edxapp'}) ==> default: ok: [localhost] => (item={u'path': u'/edx/app/edxapp/.ssh'}) ==> default: ok: [localhost] => (item={u'path': u'/edx/app/edxapp/venvs'}) ==> default: ok: [localhost] => (item={u'path': u'/edx/var/edxapp/themes'}) ==> default: ok: [localhost] => (item={u'path': u'/edx/var/edxapp/staticfiles'}) ==> default: ok: [localhost] => (item={u'path': u'/edx/var/edxapp/course_static'}) ==> default: changed: [localhost] => (item={u'path': u'/edx/var/edxapp/data'}) ==> default: ok: [localhost] => (item={u'path': u'/edx/var/edxapp', u'mode': u'0775'}) ==> default: ok: [localhost] => (item={u'path': u'/edx/var/edxapp/course_repos', u'mode': u'0775'}) ==> default: ==> default: TASK [edxapp : make the course data dir] *************************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [edxapp : create edxapp log dir] ****************************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [edxapp : Ensure the tracking folder exists] ****************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [edxapp : Ensure the tracking.log file exists] **************************** ==> default: changed: [localhost] ==> default: ==> default: TASK [edxapp : create web-writable edxapp data dirs] *************************** ==> default: changed: [localhost] => (item=/edx/var/edxapp/data) ==> default: changed: [localhost] => (item=/edx/var/edxapp/uploads) ==> default: changed: [localhost] => (item=/edx/var/edxapp/media) ==> default: ==> default: TASK [edxapp : add ppas for current versions of nodejs] ************************ ==> default: skipping: [localhost] ==> default: ==> default: TASK [edxapp : install system packages on which LMS and CMS rely] ************** ==> default: changed: [localhost] => (item=[u's3cmd', u'pkg-config', u'g++', u'apparmor-utils', u'curl', u'ipython', u'nodejs', u'ntp', u'libfreetype6-dev', u'libffi-dev', u'python-dev', u'libsqlite3-dev']) ==> default: ==> default: TASK [edxapp : set up edxapp .npmrc] ******************************************* ==> default: changed: [localhost] ==> default: ==> default: TASK [edxapp : create log directories for service variants] ******************** ==> default: ok: [localhost] => (item=lms) ==> default: ok: [localhost] => (item=cms) ==> default: ==> default: TASK [edxapp : code sandbox | Check which libblas to use] ******************** ==> default: ok: [localhost] ==> default: ==> default: TASK [edxapp : code sandbox | Use libblas.so.3gf in Ubuntu] ******************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [edxapp : code sandbox | Use libblas.so.3 in Ubuntu] ********************** ==> default: ok: [localhost] ==> default: ==> default: TASK [edxapp : code sandbox | Check which liblapac to use] ******************* ==> default: ok: [localhost] ==> default: ==> default: TASK [edxapp : code sandbox | Use liblapack.so.3gf in Ubuntu] ****************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [edxapp : code sandbox | Use liblapack.so.3 in Ubuntu] ******************** ==> default: ok: [localhost] ==> default: ==> default: TASK [edxapp : code sandbox | Create edxapp sandbox user] ********************** ==> default: ok: [localhost] ==> default: ==> default: TASK [edxapp : code sandbox | Install apparmor utils system pkg] *************** ==> default: ok: [localhost] ==> default: ==> default: TASK [edxapp : code sandbox | write out apparmor code sandbox config] ********** ==> default: ok: [localhost] ==> default: ==> default: TASK [edxapp : code sandbox | write out sandbox user sudoers config] *********** ==> default: ok: [localhost] ==> default: ==> default: TASK [edxapp : code sandbox | start apparmor service] ************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [edxapp : code sandbox | (bootstrap) load code sandbox profile] *********** ==> default: changed: [localhost] ==> default: ==> default: TASK [edxapp : code sandbox | (bootstrap) put code sandbox into aa-enforce or aa-complain mode depending on EDXAPP_SANDBOX_ENFORCE] *** ==> default: changed: [localhost] ==> default: ==> default: TASK [edxapp : create edxapp configuration dir] ******************************** ==> default: ok: [localhost] ==> default: ==> default: TASK [edxapp : copy the template to the desired location] ********************** ==> default: changed: [localhost] => (item={u'dest': u'/edx/app/edxapp/edxapp_env', u'src': u'edxapp_env.j2', u'group': u'www-data', u'mode': u'0644', u'owner': u'edxapp'}) ==> default: ok: [localhost] => (item={u'dest': u'/edx/app/edxapp/newrelic.ini', u'src': u'newrelic.ini.j2', u'group': u'www-data', u'mode': u'0644', u'owner': u'edxapp'}) ==> default: changed: [localhost] => (item={u'dest': u'/tmp/edxapp_git_ssh.sh', u'src': u'git_ssh.sh.j2', u'group': u'edxapp', u'mode': u'0750', u'owner': u'edxapp'}) ==> default: changed: [localhost] => (item={u'dest': u'/edx/app/edxapp/.boto', u'src': u'boto.j2', u'group': u'www-data', u'mode': u'0644', u'owner': u'edxapp'}) ==> default: ==> default: TASK [edxapp : install read-only ssh key] ************************************** ==> default: skipping: [localhost] ==> default: ==> default: TASK [edxapp : set git fetch.prune to ignore deleted remote refs] ************** ==> default: changed: [localhost] ==> default: ==> default: TASK [edxapp : checkout edx-platform repo into /edx/app/edxapp/edx-platform] *** ==> default: fatal: [localhost]: FAILED! => {"before": "70c9a5fae75200384cc4fc151066bd175d7dce30", "changed": false, "failed": true, "msg": "Local modifications exist in repository (force=no).", "warnings": []} ==> default: ==> default: RUNNING HANDLER [mongo : restart mongo] **************************************** ==> default: to retry, use: --limit @/edx/app/edx_ansible/edx_ansible/playbooks/vagrant-devstack.retry ==> default: ==> default: PLAY RECAP ********************************************************************* ==> default: localhost : ok=137 changed=41 unreachable=0 failed=1 ==> default: ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Take security updates during ansible runs ------------------------------------- 648.00s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Install memcached --------------------------------------------------------------- 7.61s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Install role-independent useful system packages [0] ----------------------------- 7.14s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Install security packages ------------------------------------------------------- 6.36s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: pip install virtualenv ---------------------------------------------------------- 4.67s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: checkout edx-platform repo into /edx/app/edxapp/edx-platform -------------------- 3.18s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Install edx_ansible venv requirements ------------------------------------------- 2.97s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Install ubuntu system packages -------------------------------------------------- 2.73s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: install system packages on which LMS and CMS rely ------------------------------- 2.66s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: Restart mysql ------------------------------------------------------------------- 2.43s ==> default: INFO:/edx/app/edx_ansible/edx_ansible/playbooks/callback_plugins/task_timing: ==> default: Playbook Configure instance(s) finished: 2017-10-09 20:56:06.121728, 215 total tasks. 0:12:24.372346 elapsed. The SSH command responded with a non-zero exit status. Vagrant assumes that this means the command failed. The output for this command should be in the log above. Please read the output to determine what went wrong. ➜ ficus

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment