leylines/leylines-ansible/playbook-setup.yml

170 lines
5.5 KiB
YAML

---
- hosts: all
environment:
PATH: '/home/{{ ansible_user }}/.local/bin:{{ ansible_env.PATH }}'
LD_LIBRARY_PATH: '/home/{{ ansible_user }}/.local/lib:{{ ansible_env.get("LD_LIBRARY_PATH", "") }}'
vars:
python_version: 3.9.5
# z3_version: 4.8.11
base_packages:
- dask
- distributed
- blosc
- lz4
- ipython
- ipykernel
worker_packages:
- numpy
- scipy
- pandas
- scikit-image
- matplotlib
- opt_einsum
- cloudpickle
- fsspec
- partd
- psutil
- sqlalchemy
- toolz
- xxhash
- tqdm
- angr
- h5py
- zarr
scheduler_packages:
- bokeh
- jupyter-server-proxy
tasks:
- name: install system packages
become: yes
apt:
name: ["build-essential", "wget", "software-properties-common", "libnss3-dev", "zlib1g-dev",
"libgdbm-dev", "libncurses5-dev", "libssl-dev", "libffi-dev", "libreadline-dev",
"libsqlite3-dev", "libbz2-dev", "libopenblas-dev", "cmake"]
state: present
update_cache: yes
- name: build and install python {{ python_version }}
register: pyinstall
changed_when: "'NO_COMPILE_NEEDED' not in pyinstall.stdout"
args:
executable: "/bin/bash"
shell: |
set -eo pipefail
existing_ver="$(python3 -c 'import sys;print(f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}")')"
if [ "$existing_ver" == "{{ python_version }}" ]; then
echo "NO_COMPILE_NEEDED"
exit
fi
if [ ! -d $HOME/python ]; then
mkdir $HOME/python
fi
cd $HOME/python
wget -O python.tgz https://www.python.org/ftp/python/{{ python_version }}/Python-{{ python_version }}.tgz
tar xf python.tgz
cd Python-{{ python_version }}
# https://bugs.python.org/issue41346
sed -i 's/-j0 //' Makefile.pre.in
# Speed up LTO
sed -i -e "s|-flto |-flto=4 |g" configure configure.ac
export CFLAGS="-O3 -fno-semantic-interposition"
export LDFLAGS="-fno-semantic-interposition"
./configure --prefix=$HOME/.local/ \
--enable-shared \
--with-computed-gotos \
--enable-optimizations \
--with-lto \
--enable-ipv6 \
--with-dbmliborder=gdbm:ndbm \
--enable-loadable-sqlite-extensions \
--with-tzpath=/usr/share/zoneinfo
make -j$(nproc) EXTRA_CFLAGS="$CFLAGS"
make EXTRA_CFLAGS="$CFLAGS" install
# - name: build and install z3 (workers)
# when: leylines_is_server == "no"
# register: z3install
# changed_when: "'NO_COMPILE_NEEDED' not in pyinstall.stdout"
# args:
# executable: "/bin/bash"
# shell: |
# set -eo pipefail
# existing_ver="$(python3 -c "import z3; print(z3.get_version_string())" || true)"
# if [ "$existing_ver" == "{{ z3_version }}" ]; then
# echo "NO_COMPILE_NEEDED"
# exit
# fi
# cd $HOME/python
# wget -O z3.tgz https://github.com/Z3Prover/z3/archive/z3-{{ z3_version }}.tar.gz
# tar xf z3.tgz
# # microsoft why are you like this
# cd z3-z3-{{ z3_version }}
# mkdir -p build
# cd build
# cmake .. \
# -DCMAKE_BUILD_TYPE=Release \
# -DCMAKE_INSTALL_PREFIX=$HOME/.local \
# -DCMAKE_INSTALL_LIBDIR=lib \
# -DZ3_LINK_TIME_OPTIMIZATION=1 \
# -DZ3_BUILD_PYTHON_BINDINGS=1 \
# -DPYTHON_EXECUTABLE=$HOME/.local/bin/python3
# make -j$(nproc)
# make install
# cd $HOME/.local/lib/python*/site-packages/z3
# python3 -m compileall .
# python3 -O -m compileall .
- name: create dask dir
file:
path: /home/{{ ansible_user }}/dask
mode: 0755
state: directory
- name: install python packages
pip:
virtualenv: /home/{{ ansible_user }}/dask/dask-venv
virtualenv_command: python3 -m venv
state: latest
name: "{% if leylines_is_server == 'yes' %}{{ base_packages + scheduler_packages }}{% else %}{{ base_packages + worker_packages }}{% endif %}"
# - name: create alternate venv for angr
# when: leylines_is_server == "no"
# pip:
# virtualenv: /home/{{ ansible_user }}/dask/angr-venv
# virtualenv_command: python3 -m venv
# state: latest
# name: ["angr", "cloudpickle"]
#
# - name: copy weird packages
# when: leylines_is_server == "no"
# changed_when: true
# args:
# executable: "/bin/bash"
# shell: |
# set -eo pipefail
# cp -r $HOME/.local/lib/python*/site-packages/z3/ $HOME/dask/dask-venv/lib/python*/site-packages/
- name: install systemd user dir
file:
path: /home/{{ ansible_user }}/.config/systemd/user
mode: 0755
state: directory
- name: install systemd task
template:
mode: 0644
src: templates/leylines-{% if leylines_is_server == "yes" %}scheduler{% else %}worker{% endif %}.service
dest: /home/{{ ansible_user }}/.config/systemd/user
- name: enable linger
command: loginctl enable-linger
changed_when: true
- name: enable and start systemd task
systemd:
scope: user
daemon_reload: true
name: leylines-{% if leylines_is_server == "yes" %}scheduler{% else %}worker{% endif %}
enabled: yes
state: restarted