目录
一、批量创建文件
1.脚本内容
2.执行脚本
3.执行结果
二、变量封装成一个文件
1.定义变量文件
2.编写脚本
3.检查与执行脚本
4.运行结果
二、templates——模板
1.安装nginx
2.创建templates文件
3.复制nginx的配置文件到templates中,并重命名
4.编辑脚本
5.检查并执行脚本——nginx的worker进程根据被控机的cpu个数来指定
6.nginx的worker进程改为cpu的2倍
(1)修改模板
(2)修改前是auto
(3)cpu的个数需要变量来表示,因此,先查看被控机的cpu个数
(4)修改后
(5)修改配置文件,需要重启服务——handlers
(6)检查并执行脚本
7.修改每台被控机nginx的端口号
(1)在主机清单中设置端口号
(2)找到j2文件的监听内容,配置变量
(3)执行脚本
(4)检查被控机各自的端口号是否更改 编辑
8.将变量写在playbook中
9.当变量在命令行中定义,命令行中的变量优先级最高
三、when ——条件测试
1.when概述
2.变量的优先级
3.when使用示例
(1)编写脚本
(2)修改j2配置文件
(3)修改nginx.conf6.j2文件的用户
(4)执行脚本
(5)查看被控机端口信息
四、with_items——迭代
(一)批量下载程序
1.脚本示例
2.执行脚本并检查
(二)批量创建用户组
1.编写脚本
2.检查group是否成功创建
(三)迭代嵌套子变量——批量创建用户名
1.编写脚本
2.查看脚本执行结果
五、playbook中template for if
(一)遍历生成文件的内容
1.编写脚本
2.执行脚本并检查结果
(二)键值对形式的for循环
1.编写脚本
2.执行脚本并检查结果
(三)多层嵌套
1.编写脚本
2.执行脚本并检查结果
(四)if判断的用法
1.编写脚本
2.执行脚本并检查结果
书接上回《自动化运维工具——Ansible学习(二)》
在被控机的/data/目录下创建以各个被控机主机名为文件名的.log文件
vim var.yml
---
- hosts: websrvs
remote_user: root
tasks:
- name: create log file
file: name=/data/{{ ansible_fqdn }}.log state=touch mode=600 owner=lxm
# 检查语法
[root@ansible145 ansible]# ansible-playbook -C var.yml
# 执行脚本
[root@ansible145 ansible]# ansible-playbook var.yml
如果变量过多,就可以将变量封装为一个文件。
[root@ansible145 ansible]# vim vars.yml
var1: httpd
var2: vsftpd
[root@ansible145 ansible]# vim testvar.yml
---
- hosts: websrvs
remote_user: root
vars_files:
- vars.yml
tasks:
- name: install package
yum: name={{ var1 }}
- name: create file
file: name=/data/{{ var2 }}.log state=touch
# 检查脚本
[root@ansible145 ansible]# ansible-playbook -C testvar.yml
# 执行脚本
[root@ansible145 ansible]# ansible-playbook testvar.yml
即用一个文件作为模板,传送到远程的被控机上去,并且针对被控机的配置去改写文件,一般是配置文件。
template不能作为命令行调用,只能写在playbook中进行调用。
// 是整除的意思,例如9/2=4.5,9//2=4
**是幂次方,取指数
[root@ansible145 ansible]# mkdir templates
[root@ansible145 ansible]# cp /etc/nginx/nginx.conf templates/nginx.conf.j2
[root@ansible145 ansible]# vim templates/nginx.conf.j2
---
- hosts: websrvs
remote_user: root
tasks:
- name: install package
yum: name=nginx
- name: copy template
template: src=/nginx.conf.j2 dest=/ect/nginx/nginx.conf
- name: start service
service: name=nginx state=started enabled=yes
注意:
如果j2文件放在templates文件下,可以直接写template: src=nginx.conf.j2,ansible可以自动识别出来;
如果j2文件没有放在templates文件下,需要加上绝对路径template: src=xx/xx/nginx.conf.j2
[root@ansible145 ansible]# ansible-playbook -C testtempl.yml
[root@ansible145 ansible]# ansible-playbook testtempl.yml
[root@ansible145 ansible]# ansible websrvs -m shell -a 'rpm -q nginx'
# 检查端口
[root@ansible145 ansible]# ansible websrvs -m shell -a 'ss -ntpl'
[root@ansible145 ansible]# ansible websrvs -m shell -a 'ps aux | grep nginx'
102有4个nginx的worker进程
[root@ansible145 ansible]# vim templates/nginx.conf.j2
[root@ansible145 ansible]# ansible websrvs -m setup | grep "cpu"
"ansible_processor_vcpus": 4,
"ansible_processor_vcpus": 4,
---
- hosts: websrvs
remote_user: root
tasks:
- name: install package
yum: name=nginx
- name: copy template
template: src=/nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart service
- name: start service
service: name=nginx state=started enabled=yes
handlers:
- name: restart service
service: name=nginx state=restarted
[root@ansible145 ansible]# ansible-playbook -C testtempl.yml
[root@ansible145 ansible]# ansible-playbook testtempl.yml
[root@ansible145 ansible]# ansible websrvs -m shell -a 'ps aux | grep nginx'
[root@ansible145 ansible]# vim /etc/ansible/hosts
[websrvs]
192.168.22.141 http_port=81
192.168.22.142 http_port=82
[root@ansible145 ansible]# ansible-playbook testtempl.yml
---
- hosts: websrvs
remote_user: root
vars:
- http_port: 88
tasks:
- name: install package
yum: name=nginx
- name: copy template
template: src=/nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart service
- name: start service
service: name=nginx state=started enabled=yes
handlers:
- name: restart service
service: name=nginx state=restarted
即使主机清单中已经定义了端口号,但是playbook优先于主机清单
修改后的端口号:
[root@ansible145 ansible]# ansible-playbook -e "http_port=99" testtempl.yml
-e 命令行<----playbook<-----主机清单中的普通变量<-----主机清单中的组变量
当CentOS版本不同时,选择不同的配置文件
注意:提前在未安装nginx的被控机上安装好nginx
---
- hosts: all
remote_user: root
vars:
- http_port: 88
tasks:
- name: install package
yum: name=nginx
- name: copy template for cnetos7
template: src=/nginx.conf7.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version == "7"
notify: restart service
- name: copy template for cnetos7
template: src=/nginx.conf6.j2 dest=/ect/nginx/nginx.conf
when: ansible_distribution_major_version == "6"
notify: restart service
- name: start service
service: name=nginx state=started enabled=yes
handlers:
- name: restart service
service: name=nginx state=restarted
将不同版本的CentOS上的nginx配置文件复制到主控机后再修改!
[root@ansible145 ansible]# ansible-playbook testtempl.yml
# 查看端口号
[root@ansible145 ansible]# ansible all -m shell -a 'ss -ntl'
# 查看nginx进程
[root@ansible145 ansible]# ansible all -m shell -a 'ps aux | grep nginx'
[root@ansible145 ansible]# vim testitem.yml
---
- hosts: all
remote_user: root
tasks:
- name: create some files
file: name=/data/{{ item }} state=touch
when: ansible_distribution_major_version == "7"
with_items:
- file1
- file2
- file3
- name: install some packages
yum: name={{ item }}
with_items:
- htop
- sl
- hping3
[root@ansible145 ansible]# ansible-playbook testitem.yml
[root@ansible145 ansible]# vim testitem2.yml
---
- hosts: all
remote_user: root
tasks:
- name: create some group
group: name={{ item }}
when: ansible_distribution_major_version == "7"
with_items:
- g1
- g2
- g3
[root@ansible145 ansible]# ansible all -m shell -a 'getent group'
[root@ansible145 ansible]# vim testitem3.yml
---
- hosts: all
remote_user: root
tasks:
- name: create some group
group: name={{ item }}
when: ansible_distribution_major_version == "7"
with_items:
- g1
- g2
- g3
- name: create some user
user: name={{ item.name }} group {{ item.group }}
with_items:
- { name: 'user1', group: 'g1' }
- { name: 'user2', group: 'g2' }
- { name: 'user3', group: 'g3' }
[root@ansible145 ansible]# ansible all -m shell -a 'getent passwd '
用户名的属组对应组ID
[root@ansible145 ansible]# vim testfor.yml
---
- hosts: websrvs
remote_user: root
vars:
ports:
- 81
- 82
- 83
tasks:
- name: copy conf
template: src=for1.conf.j2 dest=/data/for1.conf
[root@ansible145 templates]# vim for1.conf.j2
{% for port in ports %}
server{
listen {{ port }}
}
{% endfor %}
[root@ansible145 ansible]# ansible-playbook testfor.yml
[root@ansible145 ansible]# vim testfor2.yml
---
- hosts: websrvs
remote_user: root
vars:
ports:
- listen_port: 81
- listen_port: 82
- listen_port: 83
tasks:
- name: copy conf
template: src=for1.conf.j2 dest=/data/for1.conf
[root@ansible145 ansible]# vim ./templates/for1.conf.j2
{% for port in ports %}
server{
listen {{ port.listen_port }}
}
{% endfor %}
[root@ansible145 ansible]# ansible-playbook testfor2.yml
[root@ansible145 ansible]# vim testfor3.yml
---
- hosts: websrvs
remote_user: root
vars:
ports:
- web1:
port: 81
name: node141
rootdir: /data/website1
- web2:
port: 82
name: node142
rootdir: /data/website2
- web3:
port: 83
name: node143
rootdir: /data/website3
tasks:
- name: copy conf
template: src=for3.conf.j2 dest=/data/for3.conf
[root@ansible145 ansible]# vim ./templates/for3.conf.j2
{% for p in ports %}
server{
listen {{ p.port }}
servername {{ p.name }}
documentroot {{ p.rootdir }}
}
{% endfor %}
[root@ansible145 ansible]# ansible-playbook testfor3.yml
[root@ansible145 ansible]# vim testfor4.yml
---
- hosts: websrvs
remote_user: root
vars:
ports:
- web1:
port: 81
# name: node141
rootdir: /data/website1
- web2:
port: 82
name: node142
rootdir: /data/website2
- web3:
port: 83
# name: node143
rootdir: /data/website3
tasks:
- name: copy conf
template: src=for4.conf.j2 dest=/data/for4.conf
[root@ansible145 ansible]# vim templates/for4.conf.j2
{% for p in ports %}
server{
listen {{ p.port }}
{% if p.name is defined %}
servername {{ p.name }}
{% endif %}
documentroot {{ p.rootdir }}
}
{% endfor %}
[root@ansible145 ansible]# ansible-playbook testfor4.yml
至此,playbook学习完结。