Ansible角色中如何正确使用变量

45次阅读
没有评论

问题描述

在使用Ansible时,对如何在角色中正确使用变量不太理解。他想要在一个角色中实现对多个节点的分区布局,并希望能够在以后的更稳定的设置中重用这个配置。这也是他第一次使用Ansible,希望能够得到指导。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在你的角色中,你可以使用变量来实现对多个节点的分区布局。以下是一个示例的解决方案:
1. 在你的主机清单文件中定义你的节点和组。比如,你可以在 inventories/staging/hosts.yaml 文件中定义你的节点和组:

all:
  hosts:
    node1:
      ansible_host: node1
    node2:
      ansible_host: node2
storageservers:
  hosts:
    node1:
      ansible_host: node1
    node2:
      ansible_host: node2
  1. 创建一个基本的分区角色,用于对单个数据磁盘进行分区。你可以在 roles/gluster-node-partition/tasks/main.yml 文件中定义这个角色:
---
# tasks file for gluster-node-partition
- name: 'Create {{ partition_name }} partition'
  parted:
    device: '{{ device_name }}'
    number: 1
    label: gpt
    name: '{{ partition_name }}'
    state: present
  become: true

- name: 'Create filesystem on {{ partition_name }} partition'
  filesystem:
    fstype: btrfs
    dev: '{{ device_name }}1' #should expand to something like '/dev/sdb1'
  become: true

- name: 'Create mount point for {{ partition_name }} partition'
  file:
    path: '/{{ partition_name }}'
    state: directory
  become: true

- name: 'Mount {{ partition_name }} partition'
  mount:
    path: '/{{ partition_name }}'
    src: 'LABEL={{ partition_name }}'
    fstype: btrfs
    state: present
  become: true
  1. 创建一个聚合角色,用于调用分区角色并传递变量。你可以在 roles/gluster-node/tasks/main.yml 文件中定义这个角色:
---
# tasks file for gluster-node
- include_role:
    name: gluster-node-partition

- name: Create data1 partition
  include_role:
    name: gluster-node-partition
  vars:
    device_name: '/dev/sdb'
    partition_name: 'data1'

- name: Create data2 partition
  include_role:
    name: gluster-node-partition
  vars:
    device_name: '/dev/sdc'
    partition_name: 'data2'

- name: Create data3 partition
  include_role:
    name: gluster-node-partition
  vars:
    device_name: '/dev/sdd'
    partition_name: 'data3'

在上面的示例中,我们首先使用 include_role 来调用分区角色 gluster-node-partition。然后,我们使用 include_role 来调用分区角色,并传递变量 device_namepartition_name。这样就可以在多个节点上创建不同的分区。

方案2

另一种方法是使用组变量来定义你的分区。这样可以使你的剧本更加清晰和可重用。以下是一个示例的解决方案:
1. 在你的清单文件中定义一个 storageservers 组,并在 group_vars/storageservers.yml 文件中定义组变量。在这个文件中,你可以设置你的分区变量,如下所示:

# group_vars/storageservers.yml
---
partitions:
  - device_name: /dev/sdb
    partition_name: /data1
  - device_name: /dev/sdc
    partition_name: /data2
  - device_name: /dev/sdd
    partition_name: /data3

现在,你有一个分区列表,当你指定 hosts: storageservers 时,Ansible 将使用这个列表,并可以在一个语句中循环处理它们。
2. 更新你的剧本,只需几行代码即可完成。以下是一个示例的剧本:

# playbook.yml
---
hosts: storage
become: true
roles:
  - gluster-node-partition

在上面的示例中,我们只需几行代码就可以完成剧本。这样可以使你的剧本更加清晰,只需在一个地方更改变量即可。
3. 更新你的角色任务,使用循环来处理分区列表。以下是一个示例的角色任务:

# roles/gluster-node-partition/tasks.yml
---
- name: "Create {{ item['partition_name'] }} partition"
  parted:
    device: "{{ item['device_name'] }}"
    number: 1
    label: gpt
    name: "{{ item['partition_name'] }}"
    state: present
  loop: "{{ partitions }}"

- name: "Create filesystem on {{ item['partition_name'] }} partition"
  filesystem:
    fstype: btrfs
    dev: "{{ item['device_name'] }}1" #should expand to something like '/dev/sdb1'
  item: "{{ partitions }}"

- name: "Create mount point for {{ item['partition_name'] }} partition"
  file:
    path: '/{{ item['partition_name'] }}'
    state: directory
  loop: "{{ partitions }}"

- name: "Mount {{ item['partition_name'] }} partition"
  mount:
    path: "/{{ item['partition_name'] }}"
    src: "LABEL={{ item['partition_name'] }}"
    fstype: btrfs
    state: present
  loop: "{{ partitions }}"

通过这种方式,你可以将变量与任务分离开来。如果你想要添加或更改一个分区,只需更改变量而不需要更改剧本。你的剧本也会变得更加简洁,只需几行代码。如果你有不同的机器需要不同的挂载点,你只需添加一个新的组,并为该组设置一个新的 partitions 变量,然后以相同的方式进行操作。

方案3

你还可以使用 vars_prompt 来在运行剧本时提示用户输入变量。以下是一个示例的解决方案:
1. 在你的角色任务中使用 vars_prompt 来提示用户输入变量。以下是一个示例的角色任务:

# roles/gluster-node-partition/tasks.yml
---
- name: "Create {{ partition_name }} partition"
  parted:
    device: "{{ device_name }}"
    number: 1
    label: gpt
    name: "{{ partition_name }}"
    state: present
  become: true
  vars_prompt:
    - name: device_name
      prompt: "Enter device name (e.g. /dev/sdb): "
    - name: partition_name
      prompt: "Enter partition name (e.g. data1): "

在上面的示例中,我们使用 vars_prompt 来提示用户输入 device_namepartition_name 变量。用户在运行剧本时将被要求输入这些变量的值。
2. 运行你的剧本时,Ansible 将提示用户输入变量的值。用户可以根据需要输入相应的值。
请注意,这种方法需要用户手动输入变量的值,适用于需要用户交互的情况。
以上是几种在Ansible角色中正确使用变量的方法。你可以根据你的需求选择适合你的方法。希望对你有所帮助!

正文完