http://galaxy.ansible.com #ansible开源个人共享库
https://galaxy.ansible.com/explore#/
http://github.com/ #ansible源代码
http://ansible.com.cn/ #马哥团队荣誉出品
https://github.com/ansible/ansible
https://github.com/ansible/ansible-examples
playbook由一个或者多个play组成的列表,playbook采用yaml语言
task是ansible中的一个个module模块。在playbook剧本中,按照事先规定的剧本中的一个个模块,剧情,来同唱一台大戏
Hosts 执行的远程主机列表
Tasks 任务集
Varniables 内置变量或自定义变量在playbook中调用
Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible 具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其 确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可 以通过tags跳过此些代码片断
ansible-playbook –t tagsname useradd.yml
目录
#检查一下语法是否有误 -C测试
#再次执行,不会发生改变,幂等性
handler与notify
playbook变量
主机清单中定义变量
摸版templates
when 条件判断
with_items 迭代
[root@centos7:~]# ansible all -m yum -a 'name=httpd state=absent'
[root@centos7:~]# mkdir ansible
[root@centos7:~]# cd ansible
[root@centos7:~]# cp /etc/httpd/conf/httpd.conf .
[root@centos7:~]# vim httpd.conf
Listen 8080
[root@centos7:ansible]# vim httpd.yml
---
- hosts: appsrvs
remote_user: root
tasks:
- name: isntall package
yum: name=httpd
- name: copy config
copy: src=/root/httpd.conf dest=/etc/httpd/conf/
- name: start service
service: name=httpd state=started
[root@centos7:ansible]# ansible-playbook -C httpd.yml
[root@centos7:ansible]# ansible-playbook httpd.yml
PLAY [appsrvs] *********************************************************************************************
TASK [Gathering Facts] *************************************************************************************
ok: [192.168.31.27]
ok: [192.168.31.17]
TASK [isntall package] *************************************************************************************
changed: [192.168.31.27]
changed: [192.168.31.17]
TASK [copy config] *****************************************************************************************
changed: [192.168.31.27]
changed: [192.168.31.17]
TASK [start service] ***************************************************************************************
changed: [192.168.31.27]
changed: [192.168.31.17]
PLAY RECAP *************************************************************************************************
192.168.31.17 : ok=4 changed=3 unreachable=0 failed=0
192.168.31.27 : ok=4 changed=3 unreachable=0 failed=0
[root@centos7:ansible]# ansible-playbook httpd.yml
[root@centos7:ansible]# vim httpd.yml
- hosts: appsrvs:websrvs
#centos6上执行失败
[root@centos7:ansible]# ansible-playbook httpd.yml
PLAY [appsrvs:websrvs] *************************************************************************************
TASK [Gathering Facts] *************************************************************************************
ok: [192.168.31.27]
ok: [192.168.31.17]
ok: [192.168.31.6]
TASK [isntall package] *************************************************************************************
ok: [192.168.31.27]
ok: [192.168.31.17]
changed: [192.168.31.6]
TASK [copy config] *****************************************************************************************
ok: [192.168.31.27]
changed: [192.168.31.6]
ok: [192.168.31.17]
TASK [start service] ***************************************************************************************
ok: [192.168.31.27]
fatal: [192.168.31.6]: 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"}
ok: [192.168.31.17]
to retry, use: --limit @/root/ansible/httpd.retry
PLAY RECAP *************************************************************************************************
192.168.31.17 : ok=4 changed=0 unreachable=0 failed=0
192.168.31.27 : ok=4 changed=0 unreachable=0 failed=0
192.168.31.6 : ok=3 changed=2 unreachable=0 failed=1
[root@centos7:ansible]# cat user.yml
---
- hosts: websrvs
remote_user: root
tasks:
- name: create group
group: name=nginx gid=80 system=yes
- name: create user
user: name=nginx uid=80 group=nginx shell=/sbin/nologin home=/data/ngnix system=yes comment="nginx user"
[root@centos7:ansible]# ansible-playbook -C user.yml
[root@centos7:ansible]# ansible websrvs -a 'getent passwd nginx'
192.168.31.6 | SUCCESS | rc=0 >>
nginx:x:80:80:nginx user:/data/ngnix:/sbin/nologin
192.168.31.17 | SUCCESS | rc=0 >>
nginx:x:80:80:nginx user:/data/ngnix:/sbin/nologin
[root@centos7:ansible]# ansible websrvs -a 'ls /data'
192.168.31.6 | SUCCESS | rc=0 >>
ngnix
testlink2.txt
testlink.txt
test.txt
[root@centos7:ansible]# ansible websrvs -m user -a 'name=nginx remove=yes state=absent'
[root@centos7:ansible]# cat httpd.yml
---
- hosts: appsrvs
remote_user: root
tasks:
- name: isntall package
yum: name=httpd
- name: copy config
copy: src=/root/httpd.conf dest=/etc/httpd/conf/
notify: restart service #通知
- name: start service
service: name=httpd state=started
handlers: #处理
- name: restart service
service: name=httpd state=restarted
[root@centos7:ansible]# ansible-playbook -C httpd.yml
[root@centos7:ansible]# vim /root/httpd.conf
Listen 80
[root@centos7:ansible]# ansible-playbook httpd.yml
RUNNING HANDLER [restart service] **************************************************************************
changed: [192.168.31.27]
changed: [192.168.31.17]
[root@centos7:~]# vim ansible/httpd.yml
---
- hosts: appsrvs
remote_user: root
tasks:
- name: isntall package
yum: name=httpd
- name: copy config
copy: src=/root/httpd.conf dest=/etc/httpd/conf/
tags: conf
notify: restart service
- name: start service
service: name=httpd state=started
tags: start
handlers:
- name: restart service
service: name=httpd state=restarted
#只执行conf所在的字典,即copy config,并且标签名可以相同,执行的时候,都会执行
[root@centos7:ansible]# ansible-playbook -t conf httpd.yml
[root@centos7:ansible]# ansible-playbook -t conf,start httpd.yml
[root@centos7:ansible]# ansible-doc -s setup
[root@centos7:ansible]# ansible all -m setup | grep name
[root@centos7:~]# ansible all -m setup -a 'filter=ansible_nodename'
192.168.31.6 | SUCCESS => {
"ansible_facts": {
"ansible_nodename": "centos6.dhy.com"
},
"changed": false
}
#操作系统的主版本号
[root@centos7:~]# ansible all -m setup -a 'filter=*major*'
192.168.31.6 | SUCCESS => {
"ansible_facts": {
"ansible_distribution_major_version": "6"
},
"changed": false
}
192.168.31.17 | SUCCESS => {
"ansible_facts": {
"ansible_distribution_major_version": "7"
},
"changed": false
}
变量ansible_distribution_major_version
#内存
[root@centos7:~]# ansible all -m setup -a 'filter=*mb*'
"ansible_memtotal_mb": 974,
"ansible_swapfree_mb": 0,
"ansible_swaptotal_mb": 0
--------------------------------------------
#变量
[root@centos7:ansible]# cat var1.yml
- hosts: appsrvs
remote_user: root
tasks:
- name: install package
yum: name={{ pname }} #变量{{ pname }}
[root@centos7:ansible]# ansible-playbook -e pname=vsftpd var1.yml
[root@centos7-1:~]# yum history info 22
----------------------------------------------
[root@centos7:ansible]# cat var1.yml
- hosts: appsrvs
remote_user: root
tasks:
- name: install package
yum: name={{ pname }} #变量
tags: install
- name: remove package
yum: name={{ pname }} state=absent #
tags: remove #
[root@centos7:ansible]# ansible-playbook -t remove -e pname=vsftpd var1.yml
----------------------------------------------------
[root@centos7:ansible]# cat var1.yml
- hosts: appsrvs
remote_user: root
tasks:
- name: install package
yum: name={{ pname1 }}
tags: install #标签可以重名
- name: install package2
yum : name={{ pname2 }}
tags: install #标签可以重名
- name: remove package
yum: name={{ pname }} state=absent
tags: remove
[root@centos7:ansible]# ansible-playbook -t install -e "pname1=vsftpd pname2=samba" var1.yml
--------------------------------------------
[root@centos7:ansible]# cat var1.yml
- hosts: appsrvs
remote_user: root
vars:
- pname1: vsftpd #定义变量
- pname2: samba
tasks:
- name: install package
yum: name={{ pname1 }}
tags: install
- name: install package2
yum : name={{ pname2 }}
tags: install
- name: remove package
yum: name={{ pname }} state=absent
tags: remove
[root@centos7:ansible]# ansible-playbook -t remove -e "pname=vsftpd" var1.yml
[root@centos7:ansible]# ansible-playbook -t remove -e "pname=samba" var1.yml
[root@centos7:ansible]# ansible-playbook -t install var1.yml
---------------------------------------------------------------------
# 命令行的优先级高于配置文件中的变量
[root@centos7:ansible]# ansible-playbook -t install -e "pname1=memcached pname2=screen" var1.yml
[root@centos7-1:~]# yum history
Loaded plugins: fastestmirror, langpacks
ID | Command line | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
33 | -d 2 -y install screen | 2018-07-29 19:27 | Install | 1
——————————————————————————————————————————————————
#定义变量文件
[root@centos7:ansible]# vim vars.yml
pname1: samba
pname2: vsftpd
[root@centos7:ansible]# cat var1.yml
- hosts: appsrvs
remote_user: root
vars_files: #引用变量文件
- vars.yml
tasks:
- name: install package
yum: name={{ pname1 }}
tags: install
- name: install package2
yum : name={{ pname2 }}
tags: install
- name: remove package
yum: name={{ pname }} state=absent
tags: remove
[root@centos7:ansible]# ansible-playbook -t install var1.yml
————————————————————————————————————————————————————————
[root@centos7:~]# vim /etc/ansible/hosts
[appsrvs]
192.168.31.17 http_port=81 #主机清单定义变量
192.168.31.27 http_port=82
[root@centos7:ansible]# pwd
/root/ansible
[root@centos7:ansible]# vim var2.yml
[root@centos7:ansible]# cat var2.yml
- hosts: appsrvs
remote_user: root
tasks:
- name: change hostname
hostname: name=web-{{http_port}}.dhy.com
[root@centos7:ansible]# ansible-playbook var2.yml
[root@centos7-1:~]# hostname
web-81.dhy.com
[root@centos7-2:~ ]# hostname
web-82.dhy.com
---------------------------------------------
[root@centos7:~]# vim /etc/ansible/hosts
[appsrvs]
192.168.31.17 hname=web1 http_port=81 #主机清单中定义两个变量
192.168.31.27 hname=web2 http_port=82
[root@centos7:ansible]# cat var2.yml
- hosts: appsrvs
remote_user: root
tasks:
- name: change hostname
hostname: name={{hname}}-{{http_port}}.dhy.com #引用变量
[root@centos7:ansible]# ansible-playbook var2.yml
[root@centos7-1:~]# hostname
web1-81.dhy.com
[root@centos7-2:~ ]# hostname
web2-82.dhy.com
-------------------------------------
[root@centos7:~]# vim /etc/ansible/hosts
[appsrvs]
192.168.31.17 hname=web1 http_port=81
192.168.31.27 hname=web2 http_port=82
[appsrvs:vars]
mark='_' #通用变量
[root@centos7:ansible]# cat var2.yml
- hosts: appsrvs
remote_user: root
tasks:
- name: change hostname
hostname: name={{hname}}{{mark}}{{http_port}}.dhy.com #引用通用变量
[root@centos7-1:~]# hostname
web1_81.dhy.com
[root@centos7-2:~ ]# hostname
web2_82.dhy.com
-----------------------------------------------
#文件中的变量优先级高于主机清单中变量的优先级;命令中的优先级最高
[root@centos7:ansible]# cat var2.yml
- hosts: appsrvs
remote_user: root
vars: #文件中定义变量,另主机清单中也有变量
- hname: websrv
- mark: -
tasks:
- name: change hostname
hostname: name={{hname}}{{mark}}{{http_port}}.dhy.com
[root@centos7:ansible]# ansible-playbook var2.yml
[root@centos7-1:~]# hostname
websrv-81.dhy.com
----------------------
[root@centos7:~]# vim /etc/ansible/hosts
[appsrvs]
192.168.31.17 hname=web1 http_port=81 mark='-' #优先级高于组变量
192.168.31.27 hname=web2 http_port=82
[appsrvs:vars] #组变量
mark='_'
-------------------------
copy拷贝文件,都是一样的,如果要实现拷贝到不同的远程主机上的文件不相同,则需要摸版template
文本文件,嵌套有脚本(使用模板编程语言编写)
Jinja2语言,使用字面量,有下面形式
字符串:使用单引号或双引号
数字:整数,浮点数
列表:[item1, item2, ...]
元组:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布尔型:true/false
算术运算:+, -, *, /, //, %, **
比较操作:==, !=, >, >=, <, <=
逻辑运算:and, o r, not
流表达式:For If When
templates功能:根据模块文件动态生成对应的配置文件
templates文件必须存放于templates目录下,且命名为 .j2 结尾
yaml/yml 文件需和templates目录平级,目录结构如下:
./
├── temnginx.yml
└── templates
└── nginx.conf.j2
[root@centos7:ansible]# pwd
/root/ansible
[root@centos7:ansible]# mkdir templates
[root@centos7:ansible]# tree
.
├── httpd.retry
├── httpd.yml
├── templates
├── user.yml
├── var1.yml
├── var2.yml
└── vars.yml
1 directory, 6 files
[root@centos7:ansible]# yum install nginx
[root@centos7:ansible]# rpm -ql nginx
安装nginx服务,centos7-1,centos7-2 两个主机都是2个cpu,把centos7-2的cpu改为4个。下面实现ansible安装nginx时,根据cpu个数生成对应cpu个数2倍的线程数
[root@websrv-82:~ ]# lscpu
CPU(s): 4
[root@centos7-1:~]# lscpu
CPU(s): 2
[root@centos7:ansible]# cat nginx.yml
- hosts: appsrvs
remote_user: root
tasks:
- name: install package #name和yum对齐
yum: name=nginx
- name: start
service: name=nginx state=started
#nginx服务没有启动
[root@centos7-1:~]# ps aux |grep nginx
root 52839 0.0 0.0 112704 972 pts/1 S+ 20:21 0:00 grep --color=auto nginx
#默认cpu个数个work process
[root@websrv-82:~ ]# ps aux |grep nginx
root 2180 0.0 0.1 122908 2236 ? Ss 20:33 0:00 nginx: master process /usr/sbin/nginx
nginx 2181 0.0 0.3 125376 3552 ? S 20:33 0:00 nginx: worker process
nginx 2182 0.0 0.3 125376 3552 ? S 20:33 0:00 nginx: worker process
nginx 2183 0.0 0.3 125376 3552 ? S 20:33 0:00 nginx: worker process
nginx 2184 0.0 0.3 125376 3552 ? S 20:33 0:00 nginx: worker process
root 2206 0.0 0.0 112660 968 pts/0 S+ 20:33 0:00 grep --color=auto nginx
[root@centos7:ansible]# ansible all -m setup | grep cpu
"ansible_processor_vcpus": 4,
"ansible_processor_vcpus": 2,
"ansible_processor_vcpus": 2,
[root@centos7:ansible]# vim templates/nginx.conf.j2
由auto改为变量
worker_processes {{ansible_processor_vcpus*2}};
[root@centos7:ansible]# ansible appsrvs -m yum -a 'name=nginx state=absent'
[root@centos7:ansible]# vim nginx.yml
- hosts: appsrvs
remote_user: root
tasks:
- name: install package
yum: name=nginx
- name: template
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
- name: start
service: name=nginx state=started
[root@centos7:ansible]# ansible-playbook nginx.yml
#4个线程 work process状态
[root@centos7-1:~]# ps aux |grep nginx
root 56559 0.0 0.2 107968 2136 ? Ss 20:52 0:00 nginx: master process /usr/sbin/nginx
nginx 56560 0.0 0.3 110472 3416 ? S 20:52 0:00 nginx: worker process
nginx 56561 0.0 0.3 110472 3416 ? S 20:52 0:00 nginx: worker process
nginx 56562 0.0 0.3 110472 3416 ? S 20:52 0:00 nginx: worker process
nginx 56563 0.0 0.3 110472 3416 ? S 20:52 0:00 nginx: worker process
root 56581 0.0 0.0 112704 972 pts/1 R+ 20:52 0:00 grep --color=auto nginx
#8个线程 work process状态
[root@websrv-82:~ ]# ps aux |grep nginx
root 4063 0.0 0.1 122908 2244 ? Ss 20:52 0:00 nginx: master process /usr/sbin/nginx
nginx 4064 0.0 0.3 125376 3568 ? S 20:52 0:00 nginx: worker process
nginx 4065 0.0 0.3 125376 3568 ? S 20:52 0:00 nginx: worker process
nginx 4066 0.0 0.3 125376 3568 ? S 20:52 0:00 nginx: worker process
nginx 4067 0.0 0.3 125376 3568 ? S 20:52 0:00 nginx: worker process
nginx 4068 0.0 0.3 125376 3568 ? S 20:52 0:00 nginx: worker process
nginx 4069 0.0 0.3 125376 3568 ? S 20:52 0:00 nginx: worker process
nginx 4070 0.0 0.3 125376 3568 ? S 20:52 0:00 nginx: worker process
nginx 4071 0.0 0.3 125376 3568 ? S 20:52 0:00 nginx: worker process
root 4091 0.0 0.0 112660 968 pts/0 R+ 20:52 0:00 grep --color=auto nginx
---------------------------------------------------------------
[root@centos7:ansible]# vim templates/nginx.conf.j2
server {
listen {{http_port}} default_server;
[root@centos7:ansible]# vim /etc/ansible/hosts
[appsrvs]
192.168.31.17 hname=web1 http_port=81
192.168.31.27 hname=web2 http_port=82
[appsrvs:vars]
mark='_'
[root@centos7:ansible]# ansible appsrvs -m yum -a 'name=nginx state=absent'
#摸版中的端口号80改为了变量,而变量定义在主机清单中,nginx.yml无需改动
[root@centos7-1:~]# ss -ntl
LISTEN 0 128 *:81 *:*
[root@websrv-82:~ ]# ss -ntl
LISTEN 0 128 *:82 *:*
---------------------------------
#改成83
[root@centos7:ansible]# cat nginx.yml
- hosts: appsrvs
remote_user: root
vars:
- http_port: 83
tasks:
- name: install package
yum: name=nginx
- name: template
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
- name: start
service: name=nginx state=started
[root@centos7:ansible]# ansible appsrvs -m yum -a 'name=nginx state=absent'
[root@centos7-1:~]# ss -ntl
LISTEN 0 128 *:83 *:*
[root@websrv-82:~ ]# ss -ntl
LISTEN 0 128 *:83 *:*
--------------------------------------------
#httpd服务利用ansible安装到centos6和centos7上,由于6和7配置文件不同,需要条件判断
[root@centos7:ansible]# scp 192.168.31.6:/etc/httpd/conf/httpd.conf templates/httpd.conf6.j2
/root/.bashrc: line 8: aliaz: command not found
httpd.conf 100% 11KB 8.3MB/s 00:00
#主版本号变量
[root@centos7:ansible]# ansible all -m setup -a "filter=*major*"
192.168.31.6 | SUCCESS => {
"ansible_facts": {
"ansible_distribution_major_version": "6"
[root@centos7:ansible]# cat templatehttpd.yml
- hosts: all
remote_user: root
tasks:
- name: install package
yum: name=httpd
- name: copy template file
template: src=httpd.conf6.j2 dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution_major_version == '6'
- name: start
service: name=httpd state=started
[root@centos7:ansible]# cp /etc/httpd/conf/httpd.conf templates/httpd.conf7.j2
#端口号改为9527
[root@centos7:ansible]# vim templates/httpd.conf6.j2
Listen 9527
[root@centos7:ansible]# ansible-playbook templatehttpd.yml
TASK [copy template file] **********************************************************************************
skipping: [192.168.31.17]
skipping: [192.168.31.27]
changed: [192.168.31.6]
[root@centos7:ansible]# cat templatecopy.yml
- hosts: appsrvs
remote_user: root
tasks:
- name: copy files
copy: src={{item}} dest=/data/
with_items:
- file1
- file2
- file3
[root@centos7:ansible]# mkdir files
[root@centos7:ansible]# touch files/file{1,2,3}
[root@centos7:ansible]# tree
[root@centos7:ansible]# tree
.
├── files
│ ├── file1
│ ├── file2
│ └── file3
├── httpd.yml
├── nginx.yml
├── templatehttpd.retry
├── templatehttpd.yml
├── templates
│ ├── httpd.conf6.j2
│ ├── httpd.conf7.j2
│ └── nginx.conf.j2
├── user.yml
├── var1.yml
├── var2.yml
└── vars.yml
2 directories, 14 files
#把f1,f2,f3文件拷贝到远程主机
[root@centos7:ansible]# ansible-playbook templatecopy.yml
TASK [copy files] ******************************************************************************************
changed: [192.168.31.27] => (item=file1)
changed: [192.168.31.17] => (item=file1)
changed: [192.168.31.27] => (item=file2)
changed: [192.168.31.17] => (item=file2)
changed: [192.168.31.27] => (item=file3)
changed: [192.168.31.17] => (item=file3)
-----------------------------------------------
[root@centos7:ansible]# cat batchusers.yml
- hosts: appsrvs
remote_user:
tasks:
- name: create user
user: naem={{item}}
with_items:
- tom
- jerry
- duck
- dog
[root@centos7:ansible]# ansible-playbook -C batchusers.yml
[root@websrv-82:~ ]# for i in tom jerry duck dog;do userdel -r $i;done
-------------------------------------------------------------------
[root@centos7:ansible]# cat batchusers.yml
- hosts: appsrvs
remote_user: root
tasks:
- name: create user
group: name={{item}}
with_items:
- g1
- g2
- g3
- g4
- name: create user
user: name={{item.name}} group={{item.group}}
with_items:
- {name: 'tom',group: 'g1'}
- {name: 'jerry',group: 'g2'}
- {name: 'duck',group: 'g3'}
- {name: 'cat',group: 'g4'}
[root@centos7:ansible]# ansible-playbook batchusers.yml
------------------------------------------------
playbook中的template for if
[root@centos7:ansible]# cat templates/for.j2
{% for port in ports %}
server {
listen {{port}}
}
{%endfor%}
[root@centos7:ansible]# cat templatefor.yml
- hosts: appsrvs
remote_user: root
vars:
ports:
- 81
- 82
- 83
tasks:
- name: conf
template: src=for.j2 dest=/data/for.conf
[root@centos7:ansible]# ansible-playbook templatefor.yml
[root@centos7-1:~]# ls /data
file1 file2 file3 testlink2.txt testlink.txt test.txt
[root@centos7:ansible]# tree
.
├── batchusers.yml
├── files
│ ├── file1
│ ├── file2
│ └── file3
├── httpd.yml
├── nginx.yml
├── templatecopy.yml
├── templatefor.yml
├── templatehttpd.retry
├── templatehttpd.yml
├── templates
│ ├── for.j2
│ ├── httpd.conf6.j2
│ ├── httpd.conf7.j2
│ └── nginx.conf.j2
├── user.yml
├── var1.yml
├── var2.yml
└── vars.yml
2 directories, 18 files
------------------------------------------------------------------
[root@centos7:ansible]# cp templatefor.yml templatefor2.yml
[root@centos7:ansible]# cat templates/for2.j2
{% for host in vhosts %}
server {
server {{host.fqdn}}
root {{host.dataroot}}
listen {{host.port}}
}
{%endfor%}
[root@centos7:ansible]# cat templatefor2.yml
- hosts: appsrvs
remote_user: root
vars:
vhosts:
- web1:
fqdn: www.a.com
dataroot: /data/sitea
port: 81
- web2:
fqdn: www.b.com
dataroot: /data/siteb
port: 82
- web3:
fqdn: www.c.com
dataroot: /data/sitec
port: 83
tasks:
- name: conf
template: src=for2.j2 dest=/data/for2.conf
[root@centos7:ansible]# ansible-playbook templatefor2.yml
[WARNING]: Found variable using reserved name: tasks
#报错原因是tasks和hosts没对齐
PLAY [appsrvs] *********************************************************************************************
TASK [Gathering Facts] *************************************************************************************
ok: [192.168.31.27]
ok: [192.168.31.17]
PLAY RECAP *************************************************************************************************
192.168.31.17 : ok=1 changed=0 unreachable=0 failed=0
192.168.31.27 : ok=1 changed=0 unreachable=0 failed=0
[root@centos7:ansible]# ansible-playbook -C templatefor2.yml
[root@centos7-1:data]# cat /data/for2.conf
server {
server www.a.com
root /data/sitea
listen 81
}
server {
server www.b.com
root /data/siteb
listen 82
}
server {
server www.c.com
root /data/sitec
listen 83
}
--------------if----------------------
[root@centos7:ansible]# cp templatefor2.yml templateif.yml
[root@centos7:ansible]# cp templates/for2.j2 templates/for3.j2
[root@centos7:ansible]# cat templateif.yml
- hosts: appsrvs
remote_user: root
vars:
vhosts:
- web1:
#fqdn: www.a.com
dataroot: /data/sitea
port: 81
- web2:
fqdn: www.b.com
dataroot: /data/siteb
port: 82
- web3:
#fqdn: www.c.com
dataroot: /data/sitec
port: 83
tasks:
- name: conf
template: src=for3.j2 dest=/data/for3.conf
[root@centos7:ansible]# cat templates/for3.j2
{% for host in vhosts %}
server {
{% if host.fqdn is defined %}
server {{host.fqdn}}
{%endif%}
root {{host.dataroot}}
listen {{host.port}}
}
{%endfor%}
[root@centos7:ansible]# ansible-playbook -C templatefor2.yml
[root@centos7-1:data]# cat for3.conf
server {
root /data/sitea
listen 81
}
server {
server www.b.com
root /data/siteb
listen 82
}
server {
root /data/sitec
listen 83
}
[root@centos7:ansible]# tree
.
├── batchusers.yml
├── files
│ ├── file1
│ ├── file2
│ └── file3
├── httpd.yml
├── nginx.yml
├── templatecopy.yml
├── templatefor2.yml
├── templatefor.yml
├── templatehttpd.retry
├── templatehttpd.yml
├── templateif.yml
├── templates
│ ├── for2.j2
│ ├── for3.j2
│ ├── for.j2
│ ├── httpd.conf6.j2
│ ├── httpd.conf7.j2
│ └── nginx.conf.j2
├── user.yml
├── var1.yml
├── var2.yml
└── vars.yml
2 directories, 22 files