Ansible--Ansible之Playbook

原创
小哥 3年前 (2022-11-02) 阅读数 10 #大杂烩

Ansible--Ansible之Playbook

Ansible之Playbook #

Playbook介绍 #

playbook参考文档

Playbookad-hoc 相比,是一个完全不同的应用程序ansible方式,类似于 saltstackstate 状态文件。 ad-hoc 不能长时间使用, playbook 可长期使用。
playbook 是由一个或多个 play 作曲表, play 的主要功能 ansible 中的 task 定义明确的角色。从根本上讲,所谓的 task 这不过是一个电话而已。 ansible 的一个 module 。将多个 play 企业中的组织 playbook 在中,它们可以组合在一起,按照预先安排的机制完成一项任务。

Playbook核心元素 #

  • Hosts 已执行的远程主机列表
  • Tasks 任务集
  • Varniables 中的内置变量或自定义变量playbook中调用
  • Templates 模板,即E.使用模板语法的文件,如配置文件等。
  • Handlers 和notity组合使用,特定条件触发的操作只有在满足条件时才执行,否则不执行。
  • tags 指定任务执行的标签,用于选择运行。playbook中的部分代码。

Playbook语法 #

playbook 使用 yaml 语法格式,后缀可以是 yaml ,也可以是 yml

  • 在一首歌中 playbook 在文件中,您可以有三个连续的序列号。( --- )区分多个 play 。还有三个连续的选择性点。( ... )用来表示 play 结尾也可以省略。
  • 第二行开始正常书写。 playbook 的内容 playbook 的功能。
  • 使用#请注意代码。
  • 缩进必须是一致的,而不是空格和 tab 混用。
  • 缩进的级别也必须是一致的,相同的缩进代表相同的级别,程序决定了配置的级别是通过缩进和换行符相结合来实现的。
  • YAML 文件内容和 Linux 该系统的案件判决是一致的和对案件敏感的, k/v 的价值
  • k/v 的值可以由对等项写入或通过换行符写入。同行使用:分隔。
  • v 它可以是字符串或列表
  • 完整的代码块功能需要包含最少的元素。 name: task

一个简单的例子 #

创建playbook文件

[root@ansible ~]# cat playbook01.yml --- #固定格式

  • hosts: 192.168.1.31 #定义需要执行的主机。 remote_user: root #远程用户 vars: #定义变量 http_port: 8088 #变量

    tasks: #定义任务的开始

    • name: create new file #定义任务的名称 file: name=/tmp/playtest.txt state=touch #调用模块,具体要做的事情
    • name: create new user user: name=test02 system=yes shell=/sbin/nologin
    • name: install package yum: name=httpd
    • name: config httpd template: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf notify: #定义为执行某项操作(action)让handlers为了引用执行,handlers配合使用
      • restart apache #notify要执行的动作,必须在这里。handlers中的name定义内容是一致的。
    • name: copy index.html copy: src=/var/www/html/index.html dest=/var/www/html/index.html
    • name: start httpd service: name=httpd state=started handlers: #处理器:更多tasks中notify定义的action触发以执行相应的处理操作
    • name: restart apache #要与notify定义是相同的 service: name=httpd state=restarted #触发要执行的操作

测试页准备

[root@ansible ~]# echo "

playbook test file

" >>/var/www/html/index.html

型材准备

[root@ansible ~]# cat httpd.conf |grep ^Listen Listen {{ http_port }}

执行playbook, 可以添加第一次执行-C选项,支票书写playbook是否ok

[root@ansible ~]# ansible-playbook playbook01.yml PLAY [192.168.1.31] * TASK [Gathering Facts] ** ok: [192.168.1.31] TASK [create new file] ** changed: [192.168.1.31] TASK [create new user] ** changed: [192.168.1.31] TASK [install package] ** changed: [192.168.1.31] TASK [config httpd] * changed: [192.168.1.31] TASK [copy index.html] ** changed: [192.168.1.31] TASK [start httpd] ** changed: [192.168.1.31] PLAY RECAP ** 192.168.1.31 : ok=7 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

验证上面playbook执行判决的结果

[root@ansible ~]# ansible 192.168.1.31 -m shell -a ls /tmp/playtest.txt && id test02 192.168.1.31 | CHANGED | rc=0 >> /tmp/playtest.txt uid=990(test02) gid=985(test02) 组=985(test02)

[root@ansible ~]# curl 192.168.1.31:8088

playbook test file

Playbook运营模式 #

通过 ansible-playbook 命令运行
格式: ansible-playbook <filename.yml> ... [options]

[root@ansible PlayBook]# ansible-playbook -h

ansible-playbook常见选项:

--check or -C #仅检测可能发生的更改,但不实际执行 --list-hosts #列出运行该任务的主机。 --list-tags #列出playbook所有这些都是在在文件中定义的。tags --list-tasks #列出playbook在文件中定义的销售订单任务集。 --limit #主机列表 仅适用于主机列表中的主机或组 -f #指定并发数,默认为5个 -t #指定tags跑,跑一个或多个tags。(前提playbook中有定义tags) -v #显示过程 -vv -vvv更详细

Playbook中等元素属性 #

主机和用户 #

在一个 playbook 开始时,第一个定义是要操作的主机和用户。


  • hosts: 192.168.1.31 remote_user: root

除了上述定义之外,还可以有一个 tasks 中定义了执行该任务的远程用户

tasks:

  • name: run df -h remote_user: test shell: name=df -h

您还可以定义使用 sudo 授权用户执行该任务

tasks:

  • name: run df -h sudo_user: test sudo: yes shell: name=df -h

tasks任务列表 #

每一个 task 一定有一个名字 name ,这是在运行 playbook 从它输出的任务执行信息可以清楚地识别它属于哪个任务。 task 的,如果未定义 nameaction 的值将用作输出信息中特定于标记的值。 task
每一个 playbook 可以包含一个或多个 tasks 任务列表,每个 tasks 在中完成特定任务,例如创建用户或安装软件。 hosts 中定义的主机或主机组将执行定义的 tasks

tasks:

  • name: create new file file: path=/tmp/test01.txt state=touch
  • name: create new user user: name=test001 state=present

Handlers与Notify #

很多时候,当我们的一个配置发生变化时,我们需要重新启动服务(例如httpd配置文件已更改)此时可以使用它。 handlersnotify 了;
(当发生变化时) notify actions 会在 playbook 的每一个task是在结束时触发的,即使有多个不同的task通知变更的发生, notify actions 通知触发一次; resources 指出,因为配置文件已更改,所以。 apache 需要重新启动,但重新启动操作将执行一次。

[root@ansible ~]# cat httpd.yml

用于安装httpd并配置启动


  • hosts: 192.168.1.31 remote_user: root

    tasks:

    • name: install httpd yum: name=httpd state=installed
    • name: config httpd template: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf notify:
      • restart httpd
    • name: start httpd service: name=httpd state=started

    handlers:

    • name: restart httpd service: name=httpd state=restarted

只要它就在这里httpd.conf配置文件已修改,需要重新启动才能生效。tasks中定义了restart httpd这个action,然后在handlers上面的引用tasks中定义的notify。

Playbook变量在中的使用 #

环境说明 :这里配置了两个组,一个apache组和一个nginx组

[root@ansible PlayBook]# cat /etc/ansible/hosts [apache] 192.168.1.36 192.168.1.33

[nginx] 192.168.1.3[1:2]

命令行指定变量。 #

执行 playbook 按参数计算的时间 -e 传入变量,因此传入的变量在整个 playbook 所有这些都可以调用,并且都属于全局变量。

[root@ansible PlayBook]# cat variables.yml

  • hosts: all remote_user: root

    tasks:

    • name: install pkg yum: name={{ pkg }}

执行playbook 指定pkg

[root@ansible PlayBook]# ansible-playbook -e "pkg=httpd" variables.yml

hosts变量在在文件中定义。 #

/etc/ansible/hosts 变量在在文件中定义。,可以针对每个主机定义不同的变量,也可以定义一个组的变量,然后直接在 playbook 直接打进来。请注意,组中定义的变量在单个主机中的优先级不高。

编辑hosts文件定义变量

[root@ansible PlayBook]# vim /etc/ansible/hosts [apache] 192.168.1.36 webdir=/opt/test #定义单个主机的变量 192.168.1.33 [apache:vars] #为整个组定义统一变量 webdir=/web/test

[nginx] 192.168.1.3[1:2] [nginx:vars] webdir=/opt/web

编辑playbook文件

[root@ansible PlayBook]# cat variables.yml

  • hosts: all remote_user: root

    tasks:

    • name: create webdir file: name={{ webdir }} state=directory #引用变量

执行playbook

[root@ansible PlayBook]# ansible-playbook variables.yml

playbook变量在在文件中定义。 #

编写 playbook 当直接在其中定义变量,然后直接引用时,可以定义多个变量; playbook 时间,然后穿透。 -e 该参数指定变量的值,然后 -e 应以规定的参数为准。

编辑playbook

[root@ansible PlayBook]# cat variables.yml

  • hosts: all remote_user: root vars: #定义变量 pkg: nginx #变量1 dir: /tmp/test1 #变量2

    tasks:

    • name: install pkg yum: name={{ pkg }} state=installed #引用变量
    • name: create new dir file: name={{ dir }} state=directory #引用变量

执行playbook

[root@ansible PlayBook]# ansible-playbook variables.yml

如果在执行时重新指定变量的值,则将重新指定该变量。

[root@ansible PlayBook]# ansible-playbook -e "dir=/tmp/test2" variables.yml

调用setup模块获取变量。 #

setup 模块的默认设置是获取主机信息,有时是在。 playbook 它需要在中使用,所以可以直接调用。公共参数 参考

编辑playbook文件

[root@ansible PlayBook]# cat variables.yml

  • hosts: all remote_user: root

    tasks:

    • name: create file file: name={{ ansible_fqdn }}.log state=touch #引用setup中的ansible_fqdn

执行playbook

[root@ansible PlayBook]# ansible-playbook variables.yml

自变量YAML在文件中定义 #

为了方便管理将所有的变量统一放在一个自变量 YAML 文件中, laybook 文件直接引用文件调用变量。

定义保存变量的文件。

[root@ansible PlayBook]# cat var.yml var1: vsftpd var2: httpd

编写playbook

[root@ansible PlayBook]# cat variables.yml

  • hosts: all remote_user: root vars_files: #参考变量文件

    • ./var.yml #指定变量文件。path(这可以是绝对路径或相对路径)

    tasks:

    • name: install package yum: name={{ var1 }} #引用变量
    • name: create file file: name=/tmp/{{ var2 }}.log state=touch #引用变量

执行playbook

[root@ansible PlayBook]# ansible-playbook variables.yml

Playbook标签在中的使用 #

一个 playbook 在该文件中,如果要在执行过程中执行某个任务,可以标记每个任务集,以便在执行过程中传递它。 -t 选择要执行的指定标签,但也要通过。 --skip-tags 选择除特定标签以外的所有标签执行,依此类推。

编辑playbook

[root@ansible PlayBook]# cat httpd.yml

  • hosts: 192.168.1.31 remote_user: root

    tasks:

    • name: install httpd yum: name=httpd state=installed tags: inhttpd

    • name: start httpd service: name=httpd state=started tags: sthttpd

    • name: restart httpd service: name=httpd state=restarted tags:

      • rshttpd
      • rs_httpd

正常执行判决的结果

[root@ansible PlayBook]# ansible-playbook httpd.yml

PLAY [192.168.1.31] **

TASK [Gathering Facts] *** ok: [192.168.1.31]

TASK [install httpd] ***** ok: [192.168.1.31]

TASK [start httpd] *** ok: [192.168.1.31]

TASK [restart httpd] ***** changed: [192.168.1.31]

PLAY RECAP *** 192.168.1.31 : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

1)通过 -t 选项指定 tags 进行执行

通过-t指定tags名称,多个tags用逗号分隔

[root@ansible PlayBook]# ansible-playbook -t rshttpd httpd.yml

PLAY [192.168.1.31] **

TASK [Gathering Facts] *** ok: [192.168.1.31]

TASK [restart httpd] ***** changed: [192.168.1.31]

PLAY RECAP *** 192.168.1.31 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

2)通过 --skip-tags 选项排除非执行 tags

[root@ansible PlayBook]# ansible-playbook --skip-tags inhttpd httpd.yml

PLAY [192.168.1.31] **

TASK [Gathering Facts] *** ok: [192.168.1.31]

TASK [start httpd] *** ok: [192.168.1.31]

TASK [restart httpd] ***** changed: [192.168.1.31]

PLAY RECAP *** 192.168.1.31 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

Playbook模板在中的使用 #

template 该模板为我们提供了动态配置服务,使用 jinja2 语言,它支持各种条件判断、循环、逻辑运算、比较运算等。说白了,它也是一个文件,它与前面的简介一起使用。 copy 就像,就用吧。 copy ,不能根据不同的服务器配置动态配置。这不利于管理。
说明:
1,在大多数情况下都会 template 该文件放置在和中。 playbook 文件对等 templates 目录(手动创建),因此。 playbook 该文件可直接引用,并将自动查找。如果放置在其他位置,也可以由绝对路径指定。
2,模板文件后缀 .j2

循环参考

示例:template安装httpd

1) playbook 文件编写

[root@ansible PlayBook]# cat testtmp.yml

模板示例


  • hosts: all remote_user: root vars:

    • listen_port: 88 #定义变量

    tasks:

    • name: Install Httpd yum: name=httpd state=installed
    • name: Config Httpd template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #使用模板 notify: Restart Httpd
    • name: Start Httpd service: name=httpd state=started

    handlers:

    • name: Restart Httpd service: name=httpd state=restarted

2)模板文件准备, httpd 型材准备,这里配置文件端口使用了变量

[root@ansible PlayBook]# cat templates/httpd.conf.j2 |grep ^Listen Listen {{ listen_port }}

3)查看目录结构

目录结构

[root@ansible PlayBook]# tree . . ├── templates │   └── httpd.conf.j2 └── testtmp.yml

1 directory, 2 files

4)执行 playbook ,由于 192.168.1.36 那台机器是 6 系统中,模板文件中的简介是。 7 上面的默认设置 httpd 个人资料, httpd 不同版本( 6默认版本为2.2.15,7默认版本为2.4.6 ),因此复制开始错误之后的过去。以下用法如下 playbook 对中的判决语句进行处理;

[root@ansible PlayBook]# ansible-playbook testtmp.yml

PLAY [all] **

TASK [Gathering Facts] ** ok: [192.168.1.36] ok: [192.168.1.32] ok: [192.168.1.33] ok: [192.168.1.31]

TASK [Install Httpd] **** ok: [192.168.1.36] ok: [192.168.1.33] ok: [192.168.1.32] ok: [192.168.1.31]

TASK [Config Httpd] ***** changed: [192.168.1.31] changed: [192.168.1.33] changed: [192.168.1.32] changed: [192.168.1.36]

TASK [Start Httpd] ** fatal: [192.168.1.36]: FAILED! => {"changed": false, "msg": "httpd: Syntax error on line 56 of /etc/httpd/conf/httpd.conf: Include directory /etc/httpd/conf.modules.d not found\n"} changed: [192.168.1.32] changed: [192.168.1.33] changed: [192.168.1.31]

RUNNING HANDLER [Restart Httpd] ***** changed: [192.168.1.31] changed: [192.168.1.32] changed: [192.168.1.33]

PLAY RECAP ** 192.168.1.31 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.1.32 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.1.33 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.1.36 : ok=3 changed=1 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0

template之when #

when语句参考

条件测试:如果您需要基于变量, facts 或先前任务的执行结果作为特定的 task 执行与否的前提是使用条件测试,通过。 when 语句执行,在 task 中使用 jinja2 的语法格式,
when语句:
task 后添加 when 子句可以使用条件测试; when 语句支持 jinja2 表达式语法。

类似于此:

tasks:

  • command: /bin/false register: result ignore_errors: True
  • command: /bin/something when: result|failed
  • command: /bin/something_else when: result|success
  • command: /bin/still/something_else when: result|skipped

示例:when这一声明完善了上述内容httpd配置

1)准备两个个人资料,一个 centos6 系统 httpd 个人资料,一个 centos7 系统httpd侧写。

[root@ansible PlayBook]# tree templates/ templates/ ├── httpd6.conf.j2 #6系统2.2.15版本httpd配置文件 └── httpd7.conf.j2 #7系统2.4.6版本httpd配置文件

0 directories, 2 files

2)修改 playbook 文件,setup模块获取系统版本进行判断。 setup常用模块

[root@ansible PlayBook]# cat testtmp.yml

when示例


  • hosts: all remote_user: root vars:

    • listen_port: 88

    tasks:

    • name: Install Httpd yum: name=httpd state=installed
    • name: Config System6 Httpd template: src=httpd6.conf.j2 dest=/etc/httpd/conf/httpd.conf when: ansible_distribution_major_version == "6" #确定系统版本,即6然后执行上面的命令template配置6的简介 notify: Restart Httpd
    • name: Config System7 Httpd template: src=httpd7.conf.j2 dest=/etc/httpd/conf/httpd.conf when: ansible_distribution_major_version == "7" #确定系统版本,即7然后执行上面的命令template配置7的简介 notify: Restart Httpd
    • name: Start Httpd service: name=httpd state=started

    handlers:

    • name: Restart Httpd service: name=httpd state=restarted

3)执行playbook

[root@ansible PlayBook]# ansible-playbook testtmp.yml

PLAY [all] **

TASK [Gathering Facts] ** ok: [192.168.1.31] ok: [192.168.1.32] ok: [192.168.1.33] ok: [192.168.1.36]

TASK [Install Httpd] **** ok: [192.168.1.32] ok: [192.168.1.33] ok: [192.168.1.31] ok: [192.168.1.36]

TASK [Config System6 Httpd] ***** skipping: [192.168.1.33] skipping: [192.168.1.31] skipping: [192.168.1.32] changed: [192.168.1.36]

TASK [Config System7 Httpd] ***** skipping: [192.168.1.36] changed: [192.168.1.33] changed: [192.168.1.31] changed: [192.168.1.32]

TASK [Start Httpd] ** ok: [192.168.1.36] ok: [192.168.1.31] ok: [192.168.1.32] ok: [192.168.1.33]

RUNNING HANDLER [Restart Httpd] ***** changed: [192.168.1.33] changed: [192.168.1.31] changed: [192.168.1.32] changed: [192.168.1.36]

PLAY RECAP ** 192.168.1.31 : ok=5 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
192.168.1.32 : ok=5 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
192.168.1.33 : ok=5 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
192.168.1.36 : ok=5 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0

template之with_items #

with_items 迭代,当有任务需要重复执行时,可以使用迭代机制。
引用具有名为的固定变量的迭代项 “item” ,要在task中使用with_items给定要迭代的元素列表。
列表格式:
字符串
字典

示例1:通过with_items安装多个不同的软件

编写 playbook

[root@ansible PlayBook]# cat testwith.yml

示例with_items


  • hosts: all remote_user: root

    tasks:

    • name: Install Package yum: name={{ item }} state=installed #引用item获取值 with_items: #定义with_items
      • httpd
      • vsftpd
      • nginx

上面 tasks 写作是等同的:


  • hosts: all remote_user: root tasks:
    • name: Install Httpd yum: name=httpd state=installed
    • name: Install Vsftpd yum: name=vsftpd state=installed
    • name: Install Nginx yum: name=nginx state=installed

示例2:通过嵌套子变量创建用户,并加入不同的组。

1)编写 playbook

[root@ansible PlayBook]# cat testwith01.yml

示例with_items嵌套子变量


  • hosts: all remote_user: root

    tasks:

    • name: Create New Group group: name={{ item }} state=present with_items:

      • group1
      • group2
      • group3
    • name: Create New User user: name={{ item.name }} group={{ item.group }} state=present with_items:

      • { name: user1, group: group1 }
      • { name: user2, group: group2 }
      • { name: user3, group: group3 }

2)执行 playbook 并验证

执行playbook

[root@ansible PlayBook]# ansible-playbook testwith01.yml

验证是否已成功创建用户和组

[root@ansible PlayBook]# ansible all -m shell -a tail -3 /etc/passwd 192.168.1.36 | CHANGED | rc=0 >> user1:x:500:500::/home/user1:/bin/bash user2:x:501:501::/home/user2:/bin/bash user3:x:502:502::/home/user3:/bin/bash

192.168.1.32 | CHANGED | rc=0 >> user1:x:1001:1001::/home/user1:/bin/bash user2:x:1002:1002::/home/user2:/bin/bash user3:x:1003:1003::/home/user3:/bin/bash

192.168.1.31 | CHANGED | rc=0 >> user1:x:1002:1003::/home/user1:/bin/bash user2:x:1003:1004::/home/user2:/bin/bash user3:x:1004:1005::/home/user3:/bin/bash

192.168.1.33 | CHANGED | rc=0 >> user1:x:1001:1001::/home/user1:/bin/bash user2:x:1002:1002::/home/user2:/bin/bash user3:x:1003:1003::/home/user3:/bin/bash

template之for if #

通过使用 forif 可以更加灵活的生成配置文件等需求,还可以在里面根据各种条件进行判断,然后生成不同的简介、或者服务器配置相关等。

示例1

1)编写 playbook

[root@ansible PlayBook]# cat testfor01.yml

template for 示例


  • hosts: all remote_user: root vars: nginx_vhost_port:

    • 81
    • 82
    • 83

    tasks:

    • name: Templage Nginx Config template: src=nginx.conf.j2 dest=/tmp/nginx_test.conf

2)模板文件写入

循环playbook在将文件中定义的变量赋给port

[root@ansible PlayBook]# cat templates/nginx.conf.j2 {% for port in nginx_vhost_port %} server{ listen: {{ port }}; server_name: localhost; } {% endfor %}

3)执行 playbook 并查看生成的结果

[root@ansible PlayBook]# ansible-playbook testfor01.yml

转到一个节点并查看生成的结果,会发现自动生成了三个虚拟主机。

[root@linux ~]# cat /tmp/nginx_test.conf server{ listen: 81; server_name: localhost; } server{ listen: 82; server_name: localhost; } server{ listen: 83; server_name: localhost; }

示例2

1)编写 playbook

[root@ansible PlayBook]# cat testfor02.yml

template for 示例


  • hosts: all remote_user: root vars: nginx_vhosts:

    • web1: listen: 8081 server_name: "web1.example.com" root: "/var/www/nginx/web1"
    • web2: listen: 8082 server_name: "web2.example.com" root: "/var/www/nginx/web2"
    • web3: listen: 8083 server_name: "web3.example.com" root: "/var/www/nginx/web3"

    tasks:

    • name: Templage Nginx Config template: src=nginx.conf.j2 dest=/tmp/nginx_vhost.conf

2)模板文件写入

[root@ansible PlayBook]# cat templates/nginx.conf.j2 {% for vhost in nginx_vhosts %} server{ listen: {{ vhost.listen }}; server_name: {{ vhost.server_name }}; root: {{ vhost.root }}; } {% endfor %}

3)执行 playbook 并查看生成的结果

[root@ansible PlayBook]# ansible-playbook testfor02.yml

转到一个节点并查看生成的结果,会发现自动生成了三个虚拟主机。

[root@linux ~]# cat /tmp/nginx_vhost.conf server{ listen: 8081; server_name: web1.example.com; root: /var/www/nginx/web1; } server{ listen: 8082; server_name: web2.example.com; root: /var/www/nginx/web2; } server{ listen: 8083; server_name: web3.example.com; root: /var/www/nginx/web3; }

示例3

在for重新嵌套在循环中if判断,让生成的简介更加灵活

1)编写 playbook

[root@ansible PlayBook]# cat testfor03.yml

template for 示例


  • hosts: all remote_user: root vars: nginx_vhosts:

    • web1: listen: 8081 root: "/var/www/nginx/web1"
    • web2: server_name: "web2.example.com" root: "/var/www/nginx/web2"
    • web3: listen: 8083 server_name: "web3.example.com" root: "/var/www/nginx/web3"

    tasks:

    • name: Templage Nginx Config template: src=nginx.conf.j2 dest=/tmp/nginx_vhost.conf

2)模板文件写入

注:在此添加判断,如果listen如果未定义,则使用默认端口。8888,如果server_name有定义,那么生成的简介中才有这一项。

[root@ansible PlayBook]# cat templates/nginx.conf.j2 {% for vhost in nginx_vhosts %} server{ {% if vhost.listen is defined %} listen: {{ vhost.listen }}; {% else %} listen: 8888; {% endif %} {% if vhost.server_name is defined %} server_name: {{ vhost.server_name }}; {% endif %} root: {{ vhost.root }}; } {% endfor %}

3)执行 playbook 并查看生成的结果

[root@ansible PlayBook]# ansible-playbook testfor03.yml

转到一个节点并查看生成的结果,会发现自动生成了三个虚拟主机。

[root@linux ~]# cat /tmp/nginx_vhost.conf server{ listen: 8081; root: /var/www/nginx/web1; } server{ listen: 8888; server_name: web2.example.com; root: /var/www/nginx/web2; } server{ listen: 8083; server_name: web3.example.com; root: /var/www/nginx/web3; }

以上三个例子的图片显示了效果。

例一

例二

例三

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除