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