github.com/swiftstack/ProxyFS@v0.0.0-20210203235616-4017c267d62f/ci/ansible/tasks/main.yml (about)

     1  - hosts: all
     2    name: Install and start ProxyFS using the Chef installer
     3    vars_files:
     4      - "../vars/{{ env }}.yml"
     5    vars:
     6      pkg_ver:
     7        etcd: "3.4.7"
     8      golang_versions:
     9        current: "go1.13.6"
    10        candidate: "go1.15.5"
    11        latest: "{{ lookup('url', 'https://golang.org/VERSION?m=text', split_lines=False) }}"
    12      active_golang_version: "{{ golang_version | default('current') }}"
    13      golang_versions_file: "/etc/golang_versions.json"
    14      go_dir_parent_path: "/usr/local"
    15      go_dir_name: "go"
    16      go_dir_path: "{{ go_dir_parent_path }}/{{ go_dir_name }}"
    17  
    18    tasks:
    19  
    20    #
    21    # Create SwiftStack user, manage related info
    22    #
    23  
    24    - name: Make sure we have wheel group
    25      group: name=wheel state=present
    26      become: yes
    27      become_user: root
    28  
    29    - name: Make sure we have {{ proxyfs_group }} group
    30      group: name={{ proxyfs_group }} state=present
    31      become: yes
    32      become_user: root
    33  
    34    #
    35    # On Centos, we have to download and install chef and liberasurecode manually
    36    #
    37  
    38    - name: Check Chef is installed
    39      stat: path="/usr/bin/chef-solo"
    40      register: chef_solo_file
    41  
    42    - name: Download and Install Chef
    43      yum:
    44        name: https://packages.chef.io/files/stable/chef/12.16.42/el/7/chef-12.16.42-1.el7.x86_64.rpm
    45        state: present
    46      become: yes
    47      become_user: root
    48      when: ansible_os_family == 'RedHat' and chef_solo_file.stat.exists == false
    49  
    50    - name: Create {{ proxyfs_user }} user
    51      user:
    52        name: "{{ proxyfs_user }}"
    53        group: "{{ proxyfs_group }}"
    54        groups: wheel
    55        createhome: yes
    56      become: yes
    57      become_user: root
    58  
    59    - name: Make ssh directory
    60      file:
    61        path: /home/{{ proxyfs_user }}/.ssh
    62        state: directory
    63        owner: "{{ proxyfs_user }}"
    64        group: "{{ proxyfs_group }}"
    65        mode: "0775"
    66      become: yes
    67      become_user: root
    68  
    69    - name: ensure github.com is a known host
    70      lineinfile:
    71        dest: /home/{{ proxyfs_user }}/.ssh/known_hosts
    72        create: yes
    73        state: present
    74        line: "{{ lookup('pipe', 'ssh-keyscan -t rsa github.com') }}"
    75        regexp: "^github\\.com"
    76      become: yes
    77      become_user: root
    78  
    79    #
    80    # Install packages
    81    #
    82  
    83    - name: yum install base packages needed for server config
    84      yum:
    85        name: ['sudo', 'ruby', 'rubygems', 'gcc', 'libxml2', 'libxml2-devel',
    86        'libxslt', 'libxslt-devel', 'which', 'tar']
    87        state: present
    88      become: yes
    89      become_user: root
    90      when: ansible_os_family == 'RedHat'
    91  
    92    - name: apt install base packages needed for server config
    93      apt:
    94        name: ['sudo', 'build-essential', 'ruby', 'rubygems', 'chef']
    95        state: present
    96      become: yes
    97      become_user: root
    98      when: ansible_os_family == 'Debian'
    99  
   100    #
   101    # /etc/sudoers will not exist until after sudo has been installed.
   102    #
   103    - name: Allow 'wheel' group to have passwordless sudo
   104      lineinfile:
   105        dest: /etc/sudoers
   106        state: present
   107        regexp: '^%wheel'
   108        line: '%wheel ALL=(ALL) NOPASSWD: ALL'
   109      become: yes
   110      become_user: root
   111  
   112    - name: Change /etc/sudoers to not require a tty
   113      lineinfile:
   114        dest: /etc/sudoers
   115        state: present
   116        regexp: '^Defaults    requiretty'
   117        line: '#Defaults    requiretty'
   118      become: yes
   119      become_user: root
   120  
   121    - name: yum install anticipated packages for building/running proxyfs
   122      yum:
   123        name: ['gcc', 'python-devel', 'gnutls-devel', 'libacl-devel',
   124               'openldap-devel', 'json-c-devel']
   125        state: present
   126      become: yes
   127      become_user: root
   128      when: ansible_os_family == 'RedHat'
   129  
   130    - name: apt install anticipated packages for building/running proxyfs
   131      apt:
   132        name: ['gcc', 'python-dev', 'gnutls-dev', 'libacl1-dev', 'libldap2-dev',
   133               'libjson-c-dev', 'libb64-dev']
   134        state: present
   135      become: yes
   136      become_user: root
   137      when: ansible_os_family == 'Debian'
   138  
   139    - name: yum install anticipated packages for building/running swift
   140      yum:
   141        name: ['openssl-devel', 'curl', 'memcached', 'rsync', 'xfsprogs',
   142               'git-core', 'gcc', 'python-devel', 'libffi-devel',
   143               'libxml2-devel', 'libxml2', 'libxslt-devel', 'centos-release-scl']
   144        state: present
   145      become: yes
   146      become_user: root
   147      when: ansible_os_family == 'RedHat'
   148  
   149    # rh-python36 must be installed after centos-release-scl, on a separate step
   150    - name: yum install RedHat's Python 3.6
   151      yum:
   152        name: ['rh-python36']
   153        state: present
   154      become: yes
   155      become_user: root
   156      when: ansible_os_family == 'RedHat'
   157  
   158    - name: Create symlink (python3.6) to Python 3's binary
   159      file:
   160        src: /opt/rh/rh-python36/root/bin/python3.6
   161        path: /bin/python3.6
   162        state: link
   163      become: yes
   164      become_user: root
   165      when: ansible_os_family == 'RedHat'
   166  
   167    - name: Create symlink (python3) to Python 3's binary
   168      file:
   169        src: /bin/python3.6
   170        path: /bin/python3
   171        state: link
   172      become: yes
   173      become_user: root
   174      when: ansible_os_family == 'RedHat'
   175  
   176    - name: Create symlink to Python 3's include dir
   177      file:
   178        src: /opt/rh/rh-python36/root/usr/include
   179        path: /opt/rh/rh-python36/root/include
   180        state: link
   181      become: yes
   182      become_user: root
   183      when: ansible_os_family == 'RedHat'
   184  
   185    #  We are not installing py3 on Ubuntu! This should be fixed if we ever
   186    #  decide to support Ubuntu.
   187    - name: apt install anticipated packages for building/running swift
   188      apt:
   189        name: ['liberasurecode-dev', 'libssl-dev', 'curl', 'memcached', 'rsync',
   190               'sqlite3', 'xfsprogs', 'git-core', 'gcc', 'build-essential',
   191               'python-dev', 'libffi-dev', 'libxml2-dev', 'libxml2',
   192               'libxslt1-dev']
   193        state: present
   194      become: yes
   195      become_user: root
   196      when: ansible_os_family == 'Debian'
   197  
   198    # Install etcd
   199    - name: Download, install, and perform basic set up for etcd
   200      block:
   201        - name: Check etcd binary exists
   202          stat: path="/usr/local/bin/etcd"
   203          register: etcd_binary
   204  
   205        - name: Check etcdctl binary exists
   206          stat: path="/usr/local/bin/etcdctl"
   207          register: etcdctl_binary
   208  
   209        - name: Get current etcd version
   210          shell: etcd --version | grep "etcd Version" | awk '{print $NF}'
   211          register: current_etcd_version
   212          when: etcd_binary.stat.exists == True and etcdctl_binary.stat.exists == True
   213  
   214        - block:
   215          - name: Create tmpdir
   216            tempfile:
   217              state: directory
   218              suffix: etcd-install
   219            register: tmpdir
   220  
   221          - name: Download and untar etcd version {{ pkg_ver.etcd }}
   222            unarchive:
   223              src: https://github.com/etcd-io/etcd/releases/download/v{{ pkg_ver.etcd }}/etcd-v{{ pkg_ver.etcd }}-linux-amd64.tar.gz
   224              remote_src: yes
   225              dest: "{{ tmpdir.path }}"
   226  
   227          - name: Install etcd binaries
   228            copy:
   229              src: "{{ tmpdir.path }}/etcd-v{{ pkg_ver.etcd }}-linux-amd64/{{ item }}"
   230              remote_src: yes
   231              dest: /usr/local/bin/
   232              mode: '0755'
   233            with_items:
   234              - etcd
   235              - etcdctl
   236            become: true
   237            become_user: root
   238  
   239          - name: Cleanup tmpdir
   240            file:
   241              state: absent
   242              path: "{{ tmpdir.path }}"
   243  
   244          - name: Create directories for etcd
   245            file:
   246              path: "{{ item }}"
   247              state: directory
   248            with_items:
   249              - /var/etcd/data
   250              - /var/etcd/wal
   251              - /etc/etcd
   252            become: true
   253            become_user: root
   254  
   255          - name: Install systemd service file for etcd
   256            copy:
   257              src: etc/systemd/system/etcd.service
   258              dest: /etc/systemd/system/etcd.service
   259            become: true
   260            become_user: root
   261  
   262          - name: Install etcd conf file
   263            copy:
   264              src: etc/etcd/etcd.conf
   265              dest: /etc/etcd/etcd.conf
   266            become: true
   267  
   268          when: etcd_binary.stat.exists == False or etcdctl_binary.stat.exists == False or current_etcd_version.stdout != pkg_ver.etcd
   269  
   270    - name: Script for ProxyFS reprovisioning
   271      template:
   272        src: usr/bin/reprovision_proxyfs.template
   273        dest: /usr/bin/reprovision_proxyfs
   274        owner: root
   275        group: root
   276        mode: '0755'
   277  
   278    - name: Reset Swift script
   279      copy:
   280        src: usr/bin/resetswift
   281        dest: /usr/bin/resetswift
   282        owner: root
   283        group: root
   284        mode: '0755'
   285  
   286    - name: Install 3 versions of Golang (current, candidate, and latest)
   287      block:
   288  
   289        - name: Place Golang versions file at {{ golang_versions_file }}
   290          copy:
   291            content: "{{ golang_versions | to_nice_json }}"
   292            dest: "{{ golang_versions_file }}"
   293            owner: root
   294            group: root
   295            mode: '0644'
   296  
   297        - name: Create tmpdir
   298          tempfile:
   299            state: directory
   300            suffix: golang-install
   301          register: tmpdir
   302  
   303        - name: Check golang directories exist
   304          stat: path="{{ go_dir_parent_path }}/{{ item.value }}"
   305          register: golang_version_dirs_raw_info
   306          with_dict: "{{ golang_versions }}"
   307  
   308        - name: Save golang directories info
   309          # golang_version_dir will look something like:
   310          # {
   311          #     "go1.11.4": true,
   312          #     "go1.12.9": true,
   313          #     "go1.13": true
   314          # }
   315          set_fact:
   316            golang_version_dir: "{{ golang_version_dir|default({}) | combine( {item.item.value: item.stat.exists} ) }}"
   317          with_items: "{{ golang_version_dirs_raw_info.results }}"
   318  
   319        - name: Make Golang directories in tmpdir
   320          file:
   321            path: "{{ tmpdir.path }}/{{ item.key }}"
   322            state: directory
   323            owner: root
   324            group: root
   325            mode: "0775"
   326          become: yes
   327          become_user: root
   328          with_dict: "{{ golang_version_dir }}"
   329          when: item.value == False
   330  
   331        - name: Download and untar golang versions
   332          unarchive:
   333            src: https://dl.google.com/go/{{ item.key }}.linux-amd64.tar.gz
   334            remote_src: yes
   335            dest: "{{ tmpdir.path }}/{{ item.key }}"
   336          with_dict: "{{ golang_version_dir }}"
   337          when: item.value == False
   338  
   339        - name: Move untarred directories to {{ go_dir_parent_path }}
   340          command: "mv {{ tmpdir.path }}/{{ item.key }}/go {{ go_dir_parent_path }}/{{ item.key }}"
   341          with_dict: "{{ golang_version_dir }}"
   342          when: item.value == False
   343          become: yes
   344          become_user: root
   345  
   346        - name: Cleanup tmpdir
   347          file:
   348            state: absent
   349            path: "{{ tmpdir.path }}"
   350  
   351        - name: Check {{ go_dir_path }} directory exists
   352          stat: path="{{ go_dir_path }}"
   353          register: go_dir_path_stat
   354  
   355        - name: Remove {{ go_dir_path }} if it's not a symlink (old golang install)
   356          file:
   357            state: absent
   358            path: "{{ go_dir_path }}"
   359          become: yes
   360          become_user: root
   361          when: go_dir_path_stat.stat.exists and go_dir_path_stat.stat.islnk == false
   362  
   363        - name: Create symlink at {{ go_dir_path }} to "{{ golang_version }}" version ({{ golang_versions[active_golang_version] }})
   364          file:
   365            src: "{{ go_dir_parent_path }}/{{ golang_versions[active_golang_version] }}"
   366            path: "{{ go_dir_path }}"
   367            state: link
   368          become: yes
   369          become_user: root
   370          # Remember this stat was taken BEFORE attempting to remove the
   371          # {{ go_dir_path }} dir in the previous step
   372          when: go_dir_path_stat.stat.exists == false or go_dir_path_stat.stat.islnk == false
   373  
   374        - debug:
   375            msg: "The active version of golang hasn't been changed because another version ({{ go_dir_path_stat.stat.lnk_target }}) was already in use. Please, manually change your golang version with 'goswitch' if that's not ok."
   376          when: go_dir_path_stat.stat.exists and go_dir_path_stat.stat.islnk
   377  
   378        - name: Set up /etc/profile.d/golang_path.sh
   379          copy:
   380            dest: "/etc/profile.d/golang_path.sh"
   381            content: export PATH=$PATH:{{ go_dir_path }}/bin
   382            mode: '0644'
   383          become: yes
   384          become_user: root
   385  
   386        - name: Script for Golang version switching
   387          template:
   388            src: usr/bin/goswitch.template
   389            dest: /usr/bin/goswitch
   390            owner: root
   391            group: root
   392            mode: '0755'
   393  
   394    - name: Script for enabling core dumps
   395      copy:
   396        src: usr/bin/enable_core_dumps
   397        dest: /usr/bin/enable_core_dumps
   398        owner: root
   399        group: root
   400        mode: '0755'
   401  
   402    - name: Script for disabling core dumps
   403      copy:
   404        src: usr/bin/disable_core_dumps
   405        dest: /usr/bin/disable_core_dumps
   406        owner: root
   407        group: root
   408        mode: '0755'
   409  
   410    - import_tasks: modify_logging_rate_limit.yml