web-dev-qa-db-ja.com

ansibleでスワップメモリ​​を追加する

一部のpython実行時間の長いプロセスがメモリ不足になり、ubuntu vagrantボックスが初めて認識されたことを実現するために、サーバーにスワップメモリ​​が必要なプロジェクトに取り組んでいます。 AWS ubuntuインスタンスにはまだ設定されていません。

https://github.com/ansible/ansible/issues/5241 では、可能な組み込みソリューションが議論されましたが、実装されていなかったため、これは自動化するかなり一般的なタスクであると思います。

どのようにしてべき等の方法でファイルベースのスワップメモリ​​を設定できますか? ansibleはどのモジュールまたは変数でこのセットアップを支援しますか(ansible_swaptotal_mb変数など)?

26
gonz

これは私の現在の解決策です:

- name: Create swap file
  command: dd if=/dev/zero of={{ swap_file_path }} bs=1024 count={{ swap_file_size_mb }}k
           creates="{{ swap_file_path }}"
  tags:
    - swap.file.create


- name: Change swap file permissions
  file: path="{{ swap_file_path }}"
        owner=root
        group=root
        mode=0600
  tags:
    - swap.file.permissions


- name: "Check swap file type"
  command: file {{ swap_file_path }}
  register: swapfile
  tags:
    - swap.file.mkswap


- name: Make swap file
  command: "Sudo mkswap {{ swap_file_path }}"
  when: swapfile.stdout.find('swap file') == -1
  tags:
    - swap.file.mkswap


- name: Write swap entry in fstab
  mount: name=none
         src={{ swap_file_path }}
         fstype=swap
         opts=sw
         passno=0
         dump=0
         state=present
  tags:
    - swap.fstab


- name: Mount swap
  command: "swapon {{ swap_file_path }}"
  when: ansible_swaptotal_mb < 1
  tags:
    - swap.file.swapon
33
gonz

私は上の答えを試しましたが、"Check swap file type"は常にchangedとして返されるため、 idempotent ではありません。これは、Ansibleタスクを作成する際のベストプラクティスとして推奨されます。

以下の役割はUbuntu 14.04 Trustyでテストされており、gather_factsを有効にします。

- name: Set swap_file variable
  set_fact:
    swap_file: "{{swap_file_path}}"
  tags:
    - swap.set.file.path

- name: Check if swap file exists
  stat:
    path: "{{swap_file}}"
  register: swap_file_check
  tags:
    - swap.file.check

- name: Create swap file
  command: fallocate -l {{swap_file_size}} {{swap_file}}
  when: not swap_file_check.stat.exists
  tags:
    - swap.file.create

- name: Change swap file permissions
  file: path="{{swap_file}}"
        owner=root
        group=root
        mode=0600
  tags:
    - swap.file.permissions

- name: Format swap file
  Sudo: yes
  command: "mkswap {{swap_file}}"
  when: not swap_file_check.stat.exists
  tags:
    - swap.file.mkswap

- name: Write swap entry in fstab
  mount: name=none
         src={{swap_file}}
         fstype=swap
         opts=sw
         passno=0
         dump=0
         state=present
  tags:
    - swap.fstab

- name: Turn on swap
  Sudo: yes
  command: swapon -a
  when: not swap_file_check.stat.exists
  tags:
    - swap.turn.on

- name: Set swappiness
  Sudo: yes
  sysctl:
    name: vm.swappiness
    value: "{{swappiness}}"
  tags:
    - swap.set.swappiness

必要な変数:

swap_file_path: /swapfile
# Use any of the following suffixes
# c=1
# w=2
# b=512
# kB=1000
# K=1024
# MB=1000*1000
# M=1024*1024
# xM=M
# GB=1000*1000*1000
# G=1024*1024*1024
swap_file_size: 4G
swappiness: 1
21
Ash

新しいサーバーに4 GB(またはgroup_vars * dd_bs_size_mb用にswap_countを構成したもの)のスワップ領域をインストールするために使用するansible-swapプレイブックは次のとおりです。

https://github.com/tribou/ansible-swap

タスクを支援する関数を~/.bash_profileにも追加しました。

# Path to where you clone the repo
ANSIBLE_SWAP_PLAYBOOK=$HOME/dev/ansible-swap

install-swap ()
{
    usage='Usage: install-swap Host';
    if [ $# -ne 1 ]; then
        echo "$usage";
        return 1;
    fi;
    ansible-playbook $ANSIBLE_SWAP_PLAYBOOK/ansible-swap/site.yml --extra-vars "target=$1"
}

まず、Hostを最初にansibleインベントリに追加してください。

それはinstall-swap Hostだけです。

0
Aaron Tribou