Blog

常用的内置变量(Ansible)

Content #

  • groups 包含了所有Hosts文件里主机组的一个列表。
  • group_names 包含了当前主机所在的所有主机组名的一个列表。
  • inventory_hostname 通过Hosts文件定义主机的主机名(与ansible_home不一定相同)。
  • inventory_hostname_short 变量inventory_hostname的第1部分,比如inventory_hostname的值是

books.ansible.com,那么inventory_hostname_short就是books。

  • play_hosts 将执行当前任务的所有主机。

From #

Ansible权威指南

cook:ansible

List all facts of a machine ad-hoc #

ansible -m setup hostname

用file模块获取文件信息 #

ansible machinename -m file -a 'path=/etc/fstab'

创建目录 #

ansible machinename -m file -a 'path=/tmp/teststate=directory mode=0700 owner=root'

拷贝 #

ansible machinename -m copy -a 'src=/etc/fstab dest=/tmp/fstab'

展示某个变量 #

使用debug模块。

ansible-pull #

从VCS的仓库中拉下playbook,并在本机上执行。

From #

mplayer全屏播放某个目录下所有视频

Content #

使用 mplayer 播放某个目录下所有视频文件,并在打开每个视频文件时自动全屏:

mplayer -fs /path/to/your/directory/*.mp4

上述命令中的参数说明: -fs:表示全屏播放。 /path/to/your/directory/*.mp4:指定目录下的所有以 .mp4 结尾的视频文件。

From #

roles中defaults目录与vars目录的区别

Content #

defaults 目录:用途:defaults 目录中存放的是 Role 的默认变量。这些变量在 Role 被调用时,如果用户没有明确覆盖,将会被用作默认值。优先级:defaults 目录中定义的变量具有相对较低的优先级,当用户在 Playbook 或其他地方定义同名变量时,会覆盖这里的默认值。

vars 目录:用途:vars 目录中存放的是 Role 的额外变量,用户可以根据需要覆盖这些变量。这里的变量不会被默认加载,而是需要用户明确引用或定义。优先级:vars 目录中定义的变量具有相对较高的优先级,用户在 Playbook 中定义的同名变量仍然会覆盖这里的值。

From #

sub:Ansible

Content #

从一台远程主机上获取另一台远程主机的变量信息 常用的内置变量(Ansible) roles中defaults目录与vars目录的区别 command与shell的区别 creates和removes参数 判断软件的主版本号

Generating a sample ansible.cfg file

部署nodejs应用(Ansible)

jinja2空格控制

Tips #

webservers和staging是ansible hosts文件中的组,下面的匹配规则的含义是什么?

webservers:!staging

在webservers组中但不在staging组中的主机。

ansible中希望同时对web1和web2主机执行任务,该如何表示目标主机?

web1:web2

webservers和staging是ansible hosts文件中的组,下面的匹配规则的含义是什么?

webservers:&staging

webservers组与staging组中同时存在的主机。

将多个环境变量传递到play,使用vars区块。

cook:ansible

Pod 挂载 PersistentVolume

Content #

下面就是 Pod 的 YAML 描述文件,把存储卷挂载到了 Nginx 容器的 /tmp 目录:

apiVersion: v1
kind: Pod
metadata:
  name: host-pvc-pod

spec:
  volumes:
  - name: host-pvc-vol
    persistentVolumeClaim:
      claimName: host-5m-pvc

  containers:
    - name: ngx-pvc-pod
      image: nginx:alpine
      ports:
      - containerPort: 80
      volumeMounts:
      - name: host-pvc-vol
        mountPath: /tmp

Pod 和 PVC/PV 的关系图(省略了字段 accessModes):

Viewpoints #

From #

24|PersistentVolume:怎么解决数据持久化的难题?

创建PersistentVolumeClaim示例

Content #

我们需要再定义 PVC 对象,向 Kubernetes 申请存储。下面这份 YAML 就是一个 PVC,要求使用一个 5MB 的存储设备,访问模式是 ReadWriteOnce:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: host-5m-pvc

spec:
  storageClassName: host-test
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Mi

PVC 的内容与 PV 很像,但它不表示实际的存储,而是一个“申请”或者“声明”,spec 里的字段描述的是对存储的“期望状态”。

所以 PVC 里的 storageClassName、accessModes 和 PV 是一样的,但不会有字段 capacity,而是要用 resources.request 表示希望要有多大的容量。

Kubernetes 就会根据 PVC 里的描述,去找能够匹配 StorageClass 和容量的 PV,然后把 PV 和 PVC“绑定”在一起,实现存储的分配。

Viewpoints #

From #

24|PersistentVolume:怎么解决数据持久化的难题?

粘贴时取消自动添加缩进(Vim)

Content #

如果你不希望 Vim 自动添加缩进,你可以在粘贴之前使用

:set paste

命令来临时禁用这个特性。当你完成粘贴后,再使用

:set nopaste

命令来恢复之前的设置。

如果你希望永久禁用这个特性,可以在你的 .vimrc 文件中添加以下行:

set pastetoggle=<F2>

这样你就可以通过按 F2 键来切换粘贴模式了。

From #

本机存储PersistentVolume示例

Content #

apiVersion: v1
kind: PersistentVolume
metadata:
  name: host-10m-pv

spec:
  storageClassName: host-test
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 10Mi
  hostPath:
    path: /tmp/host-10m-pv/

“storageClassName”,对存储类型的抽象 StorageClass。这个 PV 是我们手动管理的,名字可以任意起,这里我写的是 host-test,你也可以把它改成 manual、hand-work 之类的词汇。

“accessModes”定义了存储设备的访问模式,简单来说就是虚拟盘的读写权限,和 Linux 的文件访问模式差不多,目前 Kubernetes 里有 3 种:

  1. ReadWriteOnce:存储卷可读可写,但只能被一个节点上的 Pod 挂载。
  2. ReadOnlyMany:存储卷只读不可写,可以被任意节点上的 Pod 多次挂载。
  3. ReadWriteMany:存储卷可读可写,也可以被任意节点上的 Pod 多次挂载。

这 3 种访问模式限制的对象是节点而不是 Pod,因为存储是系统级别的概念,不属于 Pod 里的进程。

显然,本地目录只能是在本机使用,所以这个 PV 使用了 ReadWriteOnce。

第三个字段“capacity”就很好理解了,表示存储设备的容量,这里我设置为 10MB。

Kubernetes 里定义存储容量使用的是国际标准,我们日常习惯使用的 KB/MB/GB 的基数是 1024,要写成 Ki/Mi/Gi,一定要小心不要写错了,否则单位不一致实际容量就会对不上。

最后一个字段“hostPath”指定了存储卷的本地路径,也就是我们在节点上创建的目录。

Viewpoints #

From #

24|PersistentVolume:怎么解决数据持久化的难题?

...

sub:PersistentVolume

Content #

PersistentVolumeClaim,简称 PVC,就是用来向 Kubernetes 申请存储资源的。 PVC 是给 Pod 使用的对象,它相当于是 Pod 的代理,代表 Pod 向系统申请 PV。一旦资源申请成功,Kubernetes 就会把 PV 和 PVC 关联在一起,这个动作叫做“绑定”(bind)。

但是,系统里的存储资源非常多,如果要 PVC 去直接遍历查找合适的 PV 也很麻烦,所以就要用到 StorageClass。

StorageClass 抽象了特定类型的存储系统(比如 Ceph、NFS),在 PVC 和 PV 之间充当“协调人”的角色,帮助 PVC 找到合适的 PV。也就是说它可以简化 Pod 挂载“虚拟盘”的过程,让 Pod 看不到 PV 的实现细节。

HostPath示例:

  1. 本机存储PersistentVolume示例
  2. 创建PersistentVolumeClaim示例
  3. Pod 挂载 PersistentVolume

Viewpoints #

From #

24|PersistentVolume:怎么解决数据持久化的难题?