实验:
vim /etc/ansible/hosts
[test01]
192.168.200.112
192.168.200.113
保存退出
vim /etc/ansible/test.yml //创建test.yml文件
--- //开头格式(可忽略)
- host: tes01 //表示对test01(192.168.200.112)的操作
remote_user: root //远端执行用户身份root
tasks: //任务列表
- name: adduser //任务名称
user: name=user2 state=present //执行user模块创建用户
reglster: print_result #将之前命令的输出结果保存在变量print_result里
tags: //创建tag标签
- testaaa //tag标签为testaaa
- debug: var=print_result //将变量的值作为debug输出出来
- name: addgroup //任务名称
group: name=root system=yes //执行group模块创建组
tags: //创建tag标签
- testbbb //tag标签为testbbb
- hosts: test02
remote_user: root
tasks:
- name: copy file //任务名称
copy: src=/etc/passwd dest=/home //执行copy模块复制文件
tags:
- testccc
...
保存与退出
语法检查:
ansible-playbook --syntax-check /etc/ansible/test.yml
预执行测试:
ansible-playbook -C /etc/ansible/test.yml
ansible-playbook --list-hosts /etc/ansible/test.yml
执行:
ansible-playbook /etc/ansible/test.yml
---------------------------------------------------------------------------
触发器:
ansible test01 -m shell -a 'netstat -aupt |grep 80'
vim /etc/ansible/httpd.yml
---
- hosts: laowang
remote_user: root
tasks:
- name: chang port
command: sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.conf
notify: (完成任务后调用restart httpd触发器)
- restart httpd (调用触发器名字)
handlers: (配置触发器)
- name: restart httpd (指定触发器名字)
service: name=httpd state=restarted (指定触发器条件为重启httpd)
...
保存退出
ansible-playbook -C /etc/ansible/httpd.yml //检测
ansible-playbook /etc/ansible/httpd.yml //执行
---------------------------------------------------------------------------------------------------------
实验案例: 被管理主机安装mariadb 安装后上传提前准备好的配置文件,到远程主机,重启服务,并创建testdb 数据库 允许test用户对其拥有所有权限
【1】被管理端配置yum源
cd /etc/yum.repos.d/
ls
backup Centos-Media.repo
yum clean all
【2】配置数据库角色
mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
vim /etc/ansible/mariadb.yml (建立剧本)
---
- hosts: laowang
remote_user: root
roles: (角色)
- mariadb
...
cd /etc/ansible/roles/mariadb/
vim tasks/main.yml (创建任务)
- name: install mariadb (安装mariadb)
yum: name=mariadb-server state=present
- name: move config file (备份主配置文件)
shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config file (拷贝files的主配置文件到客户机/etc/my.cnf下)
copy: src=my.cnf dest=/etc/my.cnf
- name: reload mariadb (重启mariadb)
shell: systemctl restart mariadb
- name: create database testdb (建立库,并且授权账号)
shell: mysql -uroot -e "create database testdb;grant all privileges on testdb.* to 'test'@'192.168.200.%' identified by 'test123';flush privileges;"
notify: (配置触发器)
- restart mariadb
保存退出
vim handlers/main.yml (创建触发器)
- name: restart mariadb
service: name=mariadb state=restarted
保存退出
cp /etc/my.cnf /etc/ansible/roles/mariadb/files/ (准备配置文件)
vim files/my.cnf
(编辑配置文件,在末尾标记下,在客户机上查看配置文件是否变化)
保存退出
ansible-playbook -C /etc/ansible/mariadb.yml (预执行)
ansible-playbook /etc/ansible/mariadb.yml (部署)
vim /etc/ansible/hosts
[test01]
192.168.200.112
192.168.200.113
保存退出
vim /etc/ansible/test.yml //创建test.yml文件
--- //开头格式(可忽略)
- host: tes01 //表示对test01(192.168.200.112)的操作
remote_user: root //远端执行用户身份root
tasks: //任务列表
- name: adduser //任务名称
user: name=user2 state=present //执行user模块创建用户
reglster: print_result #将之前命令的输出结果保存在变量print_result里
tags: //创建tag标签
- testaaa //tag标签为testaaa
- debug: var=print_result //将变量的值作为debug输出出来
- name: addgroup //任务名称
group: name=root system=yes //执行group模块创建组
tags: //创建tag标签
- testbbb //tag标签为testbbb
- hosts: test02
remote_user: root
tasks:
- name: copy file //任务名称
copy: src=/etc/passwd dest=/home //执行copy模块复制文件
tags:
- testccc
...
保存与退出
语法检查:
ansible-playbook --syntax-check /etc/ansible/test.yml
预执行测试:
ansible-playbook -C /etc/ansible/test.yml
ansible-playbook --list-hosts /etc/ansible/test.yml
执行:
ansible-playbook /etc/ansible/test.yml
---------------------------------------------------------------------------
触发器:
ansible test01 -m shell -a 'netstat -aupt |grep 80'
vim /etc/ansible/httpd.yml
---
- hosts: laowang
remote_user: root
tasks:
- name: chang port
command: sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.conf
notify: (完成任务后调用restart httpd触发器)
- restart httpd (调用触发器名字)
handlers: (配置触发器)
- name: restart httpd (指定触发器名字)
service: name=httpd state=restarted (指定触发器条件为重启httpd)
...
保存退出
ansible-playbook -C /etc/ansible/httpd.yml //检测
ansible-playbook /etc/ansible/httpd.yml //执行
---------------------------------------------------------------------------------------------------------
实验案例: 被管理主机安装mariadb 安装后上传提前准备好的配置文件,到远程主机,重启服务,并创建testdb 数据库 允许test用户对其拥有所有权限
【1】被管理端配置yum源
cd /etc/yum.repos.d/
ls
backup Centos-Media.repo
yum clean all
【2】配置数据库角色
mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
vim /etc/ansible/mariadb.yml (建立剧本)
---
- hosts: laowang
remote_user: root
roles: (角色)
- mariadb
...
cd /etc/ansible/roles/mariadb/
vim tasks/main.yml (创建任务)
- name: install mariadb (安装mariadb)
yum: name=mariadb-server state=present
- name: move config file (备份主配置文件)
shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config file (拷贝files的主配置文件到客户机/etc/my.cnf下)
copy: src=my.cnf dest=/etc/my.cnf
- name: reload mariadb (重启mariadb)
shell: systemctl restart mariadb
- name: create database testdb (建立库,并且授权账号)
shell: mysql -uroot -e "create database testdb;grant all privileges on testdb.* to 'test'@'192.168.200.%' identified by 'test123';flush privileges;"
notify: (配置触发器)
- restart mariadb
保存退出
vim handlers/main.yml (创建触发器)
- name: restart mariadb
service: name=mariadb state=restarted
保存退出
cp /etc/my.cnf /etc/ansible/roles/mariadb/files/ (准备配置文件)
vim files/my.cnf
(编辑配置文件,在末尾标记下,在客户机上查看配置文件是否变化)
保存退出
ansible-playbook -C /etc/ansible/mariadb.yml (预执行)
ansible-playbook /etc/ansible/mariadb.yml (部署)
--------------------------------------------------------------------------------------------------------
1、执行配置文件
Playbook配置文件使用YAML语法。Playbook配置文件类似于shell脚本,是一个YAML格式的文件。YAML文件的扩展名通常为.yaml或 .yml
YAML语法和其他高级语言类似,其结构通过缩进来展示,通过“-”来代表选项,通过冒号“:”来分隔建和值。整个文件以“---”开始并以“...”结束,-和:后面必须有空格,而且要注意缩进和对齐
执行结果输出
在用playbook进行ansible模块操作的时候,并没有命令的执行结果输出,默认被隐藏了。可以通过register模块追加输出命令的执行结果8、执行输出
在用playbook进行ansible模块操作的时候,并没有命令的执行结果输出,默认被隐藏了。可以通过register模块追加输出命令的执行结果
--- (开头,可忽略)
- hosts:test01 (操作的主机,分组)
remote_user: root (在被操控的主机上以什么身份运行)
tasks: (任务)
- name: adduser (任务名)
user: name=user2 state=present (调用user模块,建立用户)
register: print_result (将之前命令的输出结果保存在变量print_result里)
tags: (任务标签)
- testaaa (任务标签名)
- debug: var=print_result (将变量的值作为debug输出出来)
- name: addgroup (任务名)
group: name=root system=yes (调用group模块,建立系统组)
tags: (任务标签)
- testbbb (任务标签名)
- hosts: test02 (操作的主机,分组)
remote_user: root (在被操控的主机上以root身份运行)
tasks: (任务)
- name: copy file (任务名)
copy: src=/etc/passwd dest=/home (调用copy模块)
tags: (标签)
- testccc (标签名)
... (结尾,可忽略)
remote_user: root (在被操控的主机上以root身份运行)
tasks: (任务)
- name: copy file (任务名)
copy: src=/etc/passwd dest=/home (调用copy模块)
tags: (标签)
- testccc (标签名)
... (结尾,可忽略)
Playbook的核心元素:
1、hosts:任务的目标主机,多个主机用冒号分隔,一般调用/etc/ansible/hosts中的分组信息
2、remote_user:远程主机上,运行此任务的什么默认为root
3、tasks:任务,即定义的具体任务,有模块定义的操作列表
4、handlers:触发器,类似tasks,只是在特定的条件下才会触发任务。某任务的状态在运行后为changed时,可以通过“notify”通知给相应的handlers进行触发执行。
5、roles:角色,将hosts剥离出去,有tasks,handlers等组成的一种特定的结构集合
1、hosts:任务的目标主机,多个主机用冒号分隔,一般调用/etc/ansible/hosts中的分组信息
2、remote_user:远程主机上,运行此任务的什么默认为root
3、tasks:任务,即定义的具体任务,有模块定义的操作列表
4、handlers:触发器,类似tasks,只是在特定的条件下才会触发任务。某任务的状态在运行后为changed时,可以通过“notify”通知给相应的handlers进行触发执行。
5、roles:角色,将hosts剥离出去,有tasks,handlers等组成的一种特定的结构集合
用法:
Playbook文件定义的任务需要通过ansible-playbook命令进行调用并执行
格式:ansible-playbook [option] /PTAH/TO/PLAYBOOK.yaml
其中[option]部分的功能包括:
【1】--syntax-check:检测yaml文件的语法
【2】-C (--check) :测试,不会改变主机的任何配置
【3】 --list-hosts:列出yaml 文件影响的主机列表
【4】--list-tasks: 列出yaml文件的任务列表
【5】--list-tags:列出yaml文件的标签
【6】-t TAGS(--tags=TAGS): 表示只执行指定标签的任务
【7】--skip-tags=SKIP_TAGSS:表示除了指定标签任务,执行其他任务
【8】--start-art-task=START_AT:从指定任务开始往下运行
2、触发器
需要触发才能执行的任务,当之前定义在tasks的任务执行完成后,若希望在基础上触发其他的任务,这是需要定义handlers。例如,当通过ansible的模块对目标主机的配置文件进行修改之后,如果任务执行成功,可以触发一个触发器,在触发器中定义目标主机的服务重启操作,一边配置文件生效,handlers触发器具有以下优点
1、handlers是Ansible提供的条件机制之一,handlers和task很类似,但是他在被task通知的时候才会触发执行
2、handlers只会在所有任务执行完成后执行,而且即使被通知了多次,它也只会执行一次,handlers按照定义的顺序依次执行
httpd端口更改与触发器启动服务
---
- hosts: laowang
remote_user: root
tasks:
- name: chang port
command: sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.conf
notify: (完成任务后调用restart httpd触发器)
- restart httpd (调用触发器名字)
handlers: (配置触发器)
- name: restart httpd (指定触发器名字)
service: name=httpd state=restarted (指定触发器条件为重启httpd)
...
Playbook文件定义的任务需要通过ansible-playbook命令进行调用并执行
格式:ansible-playbook [option] /PTAH/TO/PLAYBOOK.yaml
其中[option]部分的功能包括:
【1】--syntax-check:检测yaml文件的语法
【2】-C (--check) :测试,不会改变主机的任何配置
【3】 --list-hosts:列出yaml 文件影响的主机列表
【4】--list-tasks: 列出yaml文件的任务列表
【5】--list-tags:列出yaml文件的标签
【6】-t TAGS(--tags=TAGS): 表示只执行指定标签的任务
【7】--skip-tags=SKIP_TAGSS:表示除了指定标签任务,执行其他任务
【8】--start-art-task=START_AT:从指定任务开始往下运行
2、触发器
需要触发才能执行的任务,当之前定义在tasks的任务执行完成后,若希望在基础上触发其他的任务,这是需要定义handlers。例如,当通过ansible的模块对目标主机的配置文件进行修改之后,如果任务执行成功,可以触发一个触发器,在触发器中定义目标主机的服务重启操作,一边配置文件生效,handlers触发器具有以下优点
1、handlers是Ansible提供的条件机制之一,handlers和task很类似,但是他在被task通知的时候才会触发执行
2、handlers只会在所有任务执行完成后执行,而且即使被通知了多次,它也只会执行一次,handlers按照定义的顺序依次执行
httpd端口更改与触发器启动服务
---
- hosts: laowang
remote_user: root
tasks:
- name: chang port
command: sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.conf
notify: (完成任务后调用restart httpd触发器)
- restart httpd (调用触发器名字)
handlers: (配置触发器)
- name: restart httpd (指定触发器名字)
service: name=httpd state=restarted (指定触发器条件为重启httpd)
...
3.角色
将多种不同的tasks的文件集中存放在某个目录下,则该目录就是角色,角色一般存放在/etc/ansible/roles/目录中,可通过ansible的配置文件来调整默认的角色目录。/etc/ansible/roles目录下有很多子目录,其中每一个子目录对应一个角色。每个角色也有自己的目录结构。
将多种不同的tasks的文件集中存放在某个目录下,则该目录就是角色,角色一般存放在/etc/ansible/roles/目录中,可通过ansible的配置文件来调整默认的角色目录。/etc/ansible/roles目录下有很多子目录,其中每一个子目录对应一个角色。每个角色也有自己的目录结构。
每个角色的定义,以特定的层级目录结构进行组织
1、files:存放copy或script等模块调用的文件
2、templates:存放template模块快查找所需要的模板文件的目录,如mysql配置文件等模板
3、tasks:任务存放目录
4、handlers:存放相关触发执行器的目录
5、vars:变量存放的目录
6、meta:用于存放此角色元数据
7、default:默认变量存放目录,文件中定义了此角色使用的默认变量
1、files:存放copy或script等模块调用的文件
2、templates:存放template模块快查找所需要的模板文件的目录,如mysql配置文件等模板
3、tasks:任务存放目录
4、handlers:存放相关触发执行器的目录
5、vars:变量存放的目录
6、meta:用于存放此角色元数据
7、default:默认变量存放目录,文件中定义了此角色使用的默认变量
目录中tasks,handlers,vars,meta,default至少应该包含一个main.yml,该目录下也可以有其他的yum文件,但需要在main.yml文件中用include指定将其他的.yml文件包含进来。
有了角色之后,可以直接在yaml文件中(playbook配置文件)
可以只调用一个角色,也可以调用多个角色,当定义了角色后,用ansible-playbook PLAYBOOK文件执行即可,此时ansible会到角色集合的目录(/etc/ansible/roles)去找mysql和httpd目录,然后依次运行mysql目录和httpd目录下的所有代码
有了角色之后,可以直接在yaml文件中(playbook配置文件)
可以只调用一个角色,也可以调用多个角色,当定义了角色后,用ansible-playbook PLAYBOOK文件执行即可,此时ansible会到角色集合的目录(/etc/ansible/roles)去找mysql和httpd目录,然后依次运行mysql目录和httpd目录下的所有代码
被管理主机自动安装Mriadb,安装完成后上传提前准备好的配置文件到远端主机。重启服务,然后新建testdb数据库,并允许test用户对其拥有所有权限
1。被管理主机要有yum仓库
2、配置数据库角色
mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
vim /etc/ansible/mariadb.yml (建立剧本)
---
- hosts: laowang
remote_user: root
roles: (角色)
- mariadb
...
cd /etc/ansible/roles/mariadb/
vim tasks/main.yml (创建任务)
- name: install mariadb (安装mariadb)
yum: name=mariadb-server state=present
- name: move config file (备份主配置文件)
shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config file (拷贝files的主配置文件到客户机/etc/my.cnf下)
copy: src=my.cnf dest=/etc/my.cnf
- name: reload mariadb (重启mariadb)
shell: systemctl restart mariadb
- name: create database testdb (建立库,并且授权账号)
shell: mysql -uroot -e "create database testdb;grant all privileges on testdb.* to 'test'@'192.168.200.%' identified by 'test123';flush privileges;"
notify: (配置触发器)
- restart mariadb
vim handlers/main.yml (创建触发器)
- name: restart mariadb
service: name=mariadb state=restarted
cp /etc/my.cnf /etc/ansible/roles/mariadb/files/ (准备配置文件)
vim files/my.cnf (编辑配置文件,在末尾标记下,在客户机上查看配置文件是否变化)
ansible-playbook -C /etc/ansible/mariadb.yml (预执行)
ansible-playbook /etc/ansible/mariadb.yml (部署)
1。被管理主机要有yum仓库
2、配置数据库角色
mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
vim /etc/ansible/mariadb.yml (建立剧本)
---
- hosts: laowang
remote_user: root
roles: (角色)
- mariadb
...
cd /etc/ansible/roles/mariadb/
vim tasks/main.yml (创建任务)
- name: install mariadb (安装mariadb)
yum: name=mariadb-server state=present
- name: move config file (备份主配置文件)
shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: provide a new config file (拷贝files的主配置文件到客户机/etc/my.cnf下)
copy: src=my.cnf dest=/etc/my.cnf
- name: reload mariadb (重启mariadb)
shell: systemctl restart mariadb
- name: create database testdb (建立库,并且授权账号)
shell: mysql -uroot -e "create database testdb;grant all privileges on testdb.* to 'test'@'192.168.200.%' identified by 'test123';flush privileges;"
notify: (配置触发器)
- restart mariadb
vim handlers/main.yml (创建触发器)
- name: restart mariadb
service: name=mariadb state=restarted
cp /etc/my.cnf /etc/ansible/roles/mariadb/files/ (准备配置文件)
vim files/my.cnf (编辑配置文件,在末尾标记下,在客户机上查看配置文件是否变化)
ansible-playbook -C /etc/ansible/mariadb.yml (预执行)
ansible-playbook /etc/ansible/mariadb.yml (部署)
4、变量
4.1在playbook中使用自定义变量
vim /etc/ansible/test_vars.yml
- hosts: laowang
vars: (定义变量)
- nm: "cloud" (第一个nm变量)
age: "3" (第二个age变量)
tasks:
- name: "{{ nm }}" ({{}}两对大括号引用变量,变量名两头空格)
shell: echo "myname {{ nm }},myage{{ age }}"
register: var_result
- debug: var=var_result
4.1在playbook中使用自定义变量
vim /etc/ansible/test_vars.yml
- hosts: laowang
vars: (定义变量)
- nm: "cloud" (第一个nm变量)
age: "3" (第二个age变量)
tasks:
- name: "{{ nm }}" ({{}}两对大括号引用变量,变量名两头空格)
shell: echo "myname {{ nm }},myage{{ age }}"
register: var_result
- debug: var=var_result
4.2在playbook中使用ansible的内置变量
使用ansible 组名或者all全部 -m setup | more 查看 ansible 内置变量
vim /etc/ansible/test_setupvars.yml (建立内置变量测试)
- hosts: laowang
gather_facts: True (使用ansible内置变量)
tasks:
- name: setup var
shell: echo "ip {{ ansible_ens33['ipv4']['address'] }} cpu {{ ansible_processor_count }}"
register: var_result
- debug: var=var_result
ansible-playbook /etc/ansible/test_setupvars.yml
使用ansible 组名或者all全部 -m setup | more 查看 ansible 内置变量
vim /etc/ansible/test_setupvars.yml (建立内置变量测试)
- hosts: laowang
gather_facts: True (使用ansible内置变量)
tasks:
- name: setup var
shell: echo "ip {{ ansible_ens33['ipv4']['address'] }} cpu {{ ansible_processor_count }}"
register: var_result
- debug: var=var_result
ansible-playbook /etc/ansible/test_setupvars.yml
5、Template模板
配置文件如果使用copy模块去下发的话,那配置都是一样的;如果下发的配置文件里有可变的配置,需要用到template模块
模板后缀一般为xxx.j2(因为它使用jinjia2)
5.1、利用template模块下发可变的配置文件
vim /tmp/test (建立模板)
my name is {{ myname }}
my ip is {{ ansible_ens33['ipv4']['address'] }} ({{ ansible_all_ipv4_addresses[1] }}这个方法不对,会匹配到virbr0的IP)
vim /etc/ansible/filevars.yml (编写模板下发脚本)
- hosts: all
gather_facts: True //启用内置变量
vars:
- myname: "cloud"
tasks:
- name: template test
template: src=/tmp/test dest=/root/test
ansible-playbook /etc/ansible/filevars.yml (测试)
【但是IP会显示virbr0网卡的IP,不知道怎么回事】
配置文件如果使用copy模块去下发的话,那配置都是一样的;如果下发的配置文件里有可变的配置,需要用到template模块
模板后缀一般为xxx.j2(因为它使用jinjia2)
5.1、利用template模块下发可变的配置文件
vim /tmp/test (建立模板)
my name is {{ myname }}
my ip is {{ ansible_ens33['ipv4']['address'] }} ({{ ansible_all_ipv4_addresses[1] }}这个方法不对,会匹配到virbr0的IP)
vim /etc/ansible/filevars.yml (编写模板下发脚本)
- hosts: all
gather_facts: True //启用内置变量
vars:
- myname: "cloud"
tasks:
- name: template test
template: src=/tmp/test dest=/root/test
ansible-playbook /etc/ansible/filevars.yml (测试)
【但是IP会显示virbr0网卡的IP,不知道怎么回事】
5.2、下发配置文件里面使用判断语法
vim /tmp/if.j2 (建立判断测试文件)
{% if PORT %} (如果PORT端口存在)
ip=0.0.0.0:{{ PORT }} (则为0.0.0.0端口)
{% else %} (否则)
ip=0.0.0.0:80 (为0.0.0.0:80)
{% endif %} (结尾)
vim /etc/ansible/test_ifvars.yml (建立测试剧本)
- hosts: laowang
vars:
- PORT: 90 (PORT变量为90)
tasks:
- name: jinja2 if test
template: src=/tmp/if.j2 dest=/root/test
ansible-playbook /etc/ansible/test_ifvars.yml (运行剧本)
在客户机上测试
cat /root/test
ip=0.0.0.0:90 (查看客户机测试结果)
vim /tmp/if.j2 (建立判断测试文件)
{% if PORT %} (如果PORT端口存在)
ip=0.0.0.0:{{ PORT }} (则为0.0.0.0端口)
{% else %} (否则)
ip=0.0.0.0:80 (为0.0.0.0:80)
{% endif %} (结尾)
vim /etc/ansible/test_ifvars.yml (建立测试剧本)
- hosts: laowang
vars:
- PORT: 90 (PORT变量为90)
tasks:
- name: jinja2 if test
template: src=/tmp/if.j2 dest=/root/test
ansible-playbook /etc/ansible/test_ifvars.yml (运行剧本)
在客户机上测试
cat /root/test
ip=0.0.0.0:90 (查看客户机测试结果)
修改test_ifvars.yml端口
vim /etc/ansible/test_ifvars.yml
- hosts: laowang
vars:
- PORT:
tasks:
- name: jinja2 if test
template: src=/tmp/if.j2 dest=/root/test
ansible-playbook /etc/ansible/test_ifvars.yml
在客户机上测试
cat /root/test
ip=0.0.0.0:80
vim /etc/ansible/test_ifvars.yml
- hosts: laowang
vars:
- PORT:
tasks:
- name: jinja2 if test
template: src=/tmp/if.j2 dest=/root/test
ansible-playbook /etc/ansible/test_ifvars.yml
在客户机上测试
cat /root/test
ip=0.0.0.0:80
如果端口存在,则为0.0.0.0:变量端口号
如果端口不存在,则为0.0.0.0:80
如果端口不存在,则为0.0.0.0:80