本来打算自己写一波 ansible 系列的,后来发现一老哥写的太好了,「点击此处直达」,我这里也就边看边对该系列文章做下笔记,方便以后查阅,ansible 入门的话墙裂建议阅读前方链接博文~~~
语法
首先,我们需要创建一个 YAML 格式的 playbook 文件。
playbook 文件以 .yaml
或者 .yml
作为文件名后缀,此处我们创建一个名为 test.yml
的剧本文件。
---
- hosts: all
remote_user: root
tasks:
- name: ping the host
ping:
- name: make directory test
file:
path: /testdir/test
state: directory
第一行使用三个横杠作为开始,在 YAML 语法中,---
表示文档开始。
第二行使用 -
作为开头(注意:横杠后面有空格),如果你了解过 YAML 语法,那么你一定知道 YAML 使用 -
表示一个块序列的节点。从上例可以看出,-
后面使用 hosts
关键字指定了要操作的主机,hosts
关键字对应的值为 all
,表示我们要操作主机清单中的所有主机,hosts: all
是一个键值对,注意,在YAML语法中使用冒号映射键值对时,冒号后面必须有空格,这也是语法,没有为什么,记住就好,如果你想要一次性在多台主机上进行操作,可以同时写多个主机,每台主机使用逗号隔开,比如 hosts: A,B
,如果你在清单中对主机进行了分组,也可以使用组名。
第三行,使用 remote_user
关键字可以指定在进行远程操作时使用哪个用户进行操作,remote_user: root
表示清单中的所有主机都使用 root 用户进行操作,上图中,remote_user
关键字与 hosts
关键字对齐,表示它们是平级的,在YAML语法中进行缩进时,不能使用 tab
键进行缩进。
第四行,使用 tasks
关键字指明要进行操作的任务列表,之后的行都属于 tasks
键值对中的值。
之后的行都属于 tasks
任务列表中的任务,可以看出,整个任务列表一共有两个任务组成,每个任务都以 -
开头,每个任务都有自己的名字,任务名使用 name
关键字进行指定,第一个任务使用 ping
模块,使用 ping
模块时没有指定任何参数。第二个任务使用 file
模块,使用 file
模块时,指定了 path
参数与 state
参数的值。
还可使用在单行指定参数,效果和上述配置相同:
---
- hosts: all
remote_user: root
tasks:
- name: ping the host
ping:
- name: make directory test
file: path=/testdir/test state=directory
也可以这样写:
---
- hosts: all
remote_user: root
tasks:
- name: ping the host
ping:
- name: make directory test
file: path=/testdir/test
state=directory
运行剧本
运行剧本需要使用 ansible-playbook
命令,示例如下:
$ ansible-playbook test.yml
多个 play
一个剧本中也可以存在多个 play
,例如:
---
- hosts: B
tasks:
- name: ping the host
ping:
- name: make directory test
file:
path: /testdir/B
state: directory
- hosts: B,C
tasks:
- name: ping the host
ping:
- name: make directory test
file:
path: /testdir/test
state: directory
- hosts:
B
C
tasks:
- name: ping the host
ping:
如上所示,上例中有多个 play:
- 第一个 play 针对 B 执行,这个 play 会执行两个任务。
- 第二个 play 针对 B 和 C 执行,第二个 play 也包含两个任务,一个是 ping 主机,另一个则是在对应的目标主机上创建
/testdir/test
目录。 - 第三个
play
同样是针对 B 和 C 执行,细心如你一定发现了,当你需要在 play 中指定多个主机时,有两种语法可以使用,第二个 play 和第三个 play 中的语法都可以指定多个主机,第三个 play 只包含一个任务,即 ping 主机。
检查
语法检查:
$ ansible-playbook --syntax-check test.yml
测试执行(并不是真正执行):
$ ansible-playbook --C test.yml
评论区