Memory 使用ansible添加交换内存

Memory 使用ansible添加交换内存,memory,amazon-web-services,swap,ansible,Memory,Amazon Web Services,Swap,Ansible,我正在从事一个项目,在我的服务器上交换内存是避免一些python长时间运行的进程耗尽内存的必要条件,我第一次意识到我的ubuntu vagrant Box和AWS ubuntu实例还没有设置 在一个可能的内置解决方案中进行了讨论,但从未实现,所以我猜这应该是一个非常常见的自动化任务 您将如何以幂等方式使用ansible设置基于文件的交换内存?ansible在此设置中提供了哪些模块或变量(如ansible\u swaptotal\u mb变量)?这是我当前的解决方案: - name: Create

我正在从事一个项目,在我的服务器上交换内存是避免一些python长时间运行的进程耗尽内存的必要条件,我第一次意识到我的ubuntu vagrant Box和AWS ubuntu实例还没有设置

在一个可能的内置解决方案中进行了讨论,但从未实现,所以我猜这应该是一个非常常见的自动化任务


您将如何以幂等方式使用ansible设置基于文件的交换内存?ansible在此设置中提供了哪些模块或变量(如
ansible\u swaptotal\u mb
变量)?

这是我当前的解决方案:

- 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
-名称:创建交换文件
命令:dd if=/dev/zero of={{swap_file_path}}bs=1024 count={{swap_file_size_mb}}k
创建=“{swap\u file\u path}”
标签:
-swap.file.create
-名称:更改交换文件权限
file:path=“{swap\u file\u path}”
所有者=根
组=根
模式=0600
标签:
-swap.file.permissions
-名称:“检查交换文件类型”
命令:文件{swap_file_path}
注册号:swapfile
标签:
-swap.file.mkswap
-名称:生成交换文件
命令:“sudo mkswap{{swap_file_path}”
当:swapfile.stdout.find('swap file')=-1
标签:
-swap.file.mkswap
-名称:在fstab中写入交换条目
mount:name=none
src={swap\u file\u path}
fstype=swap
opts=sw
passno=0
转储=0
状态=存在
标签:
-swap.fstab
-名称:装载交换
命令:“swapon{{swap_file_path}”
时间:ansible_swaptotal_mb<1
标签:
-swap.file.swapon

我尝试了上面的答案,但是
“检查交换文件类型”
总是以
更改的形式返回,因此在编写任务时,这是一种最好的做法

下面的角色已经在Ubuntu14.04 Trusty上测试过,不需要启用
collect\u 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
所需VAR:

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

这是我用来在新服务器上安装4GB交换空间的ansible swap playbook(或我为
dd\u bs\u size\u mb
*
swap\u count
配置的任何东西):

我还在我的
~/.bash_配置文件中添加了一个函数来帮助完成任务:

# 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"
}
只需确保首先将您的
主机
添加到您的ansible清单中即可


然后就是
安装交换主机

对我有效的方法是通过剧本添加4Gib交换

选中此项:


.

我将我的观点建立在伟大的基础上(请向上投票!),并添加了以下额外功能:

  • 是否管理交换的全局标志
  • 允许更改交换大小
  • 允许禁用交换
…再加上这些技术改进:

  • 完全幂等性(只有
    确定
    在没有更改时跳过
    ,否则一些
    更改
  • 使用
    dd
    而不是
    fallocate
    与XFS fs兼容(有关更多信息,请参阅)
在Centos 7.7和Ansible 2.9.10上测试

参数:

swap_configure:true#是否管理交换
swap_enable:true
交换文件路径:/swapfile
交换文件大小:4096
互换性:1
守则:

-名称:配置交换
时间:交换|配置|布尔|默认值(false)
区块:
-名称:检查交换文件是否存在
斯达:
路径:“{swap\u file\u path}”
寄存器:交换文件检查
更改时间:false
-名称:检查交换是否打开
shell:swapon--show | grep{{swap_file_path}
寄存器:已启用交换
更改时间:false
当:false时失败
-名称:禁用交换
命令:swapoff{{swap\u file\u path}
寄存器:已禁用交换单元
时间:>
交换文件\u check.stat.exists
和swap_enabled.rc==0
和(未启用交换)
或者(swap_enable和swap_file_check.stat.size!=(swap_file_size_mb*1024*1024)))
-名称:删除交换文件
文件:
路径:“{swap\u file\u path}”
国家:缺席
何时:不交换\u启用
-名称:配置交换
时间:交换|启用|布尔
区块:
-名称:创建或更改交换文件的大小
命令:dd if=/dev/zero of={swap_file_path}}count={{swap_file_size_mb}}bs=1MiB
寄存器:已创建交换文件
时间:>
不交换文件\u check.stat.exists
或者交换文件check.stat.size!=(交换文件大小为mb*1024*1024)
-名称:更改交换文件权限
file:path=“{swap\u file\u path}”
所有者=根
组=根
模式=0600
-名称:检查交换是否已格式化
shell:file{{swap_file_path}}grep'swap file'
寄存器:交换文件已格式化
更改时间:false
当:false时失败
-名称:格式化交换文件(如果未格式化)
命令:mkswap{{swap_file_path}
当:swap_file_已格式化.rc>0或swap_file_已创建.change
-名称:将掉期项目添加到fstab
mount:name=none
src={swap\u file\u path}
fstype=swap
opts=sw
passno=0
转储=0
状态=存在
-名称:启用交换
壳牌:斯瓦彭-a
时间:swap_enabled.rc!=0和交换单元已禁用。已更改
-名称:配置交换
sysctl:
名称:vm.swappiness
值:“{swappiness}”
国家:现在
我会担心幂等性——特别是,如果在已经有交换文件的情况下运行部署,这可能会使它归零,我想,这会使每个交换了任何页面的进程崩溃。
创建=“{swap\u file\u path}”
第一个任务中的prop应该解决这个问题,如果文件存在
dd
将不会运行。我仍然在生产中使用它,而当前任务条件(when/creates)似乎正在完成它们的工作,这就是使