Ansible自动化之批量推送文件

[Ansible自动化]之批量推送文件


Ansible中文权威指南 Ansible
Ansible-Playbooks中文指南 Ansible-Playbooks


剧本正文

请注意:(以下剧本存在一些变量,请根据实际情况使用或修改,请根据YML格式进行修改)

剧本目录详情

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/etc/ansible/
├── ansible.cfg
── hosts #我这边没有使用这里存放hosts主机
├── inventory #这里是存放我hosts主机的目录
│ └── aliyun #例如:阿里云服务器
│ ├── zabbix #存放zabbix主机清单的目录
│ └── webapps #存放web的主机清单目录
│ └── hosts #webapps主机清单
├── keys #存放秘钥的目录
│ └── ssh #存放ssh秘钥的目录
│ ├── centos_id_rsa.pub #远程管理用户公钥
│ └── centos-key.pem #远程管理用户秘钥
├── roles #剧本存放的地方
│ ├── sync #sync剧本
│ │ ├── files #需要传输的文件存放目录,如果你要传输一些文件可以放到这
│ │ │ └── music.mp3
│ ├── tasks #任务
│ │ │ ├── main.yml #
│ │ │ └── sync.yml
│ │ └── templates #这里存放模板的,例如我要批量推送nginx.conf就把配置好的nginx配置文件改成j2后缀的文件放在这
│ │ └── webapps.j2
└── vars
── sync.yml
/etc/sync.yml
1
2
3
4
5
6
7
- hosts: "{{ hosts }}"
user: "{{ user }}"
become: yes
become_user: root
become_method: sudo
roles:
- sync
/etc/roles/sync/tasks/sync.yml
1
2
3
4
- name: Sync webapps config
template: src=/etc/ansible/roles/sync/templates/webapps.j2 dest=/etc/nginx/conf.d/webapps.conf owner=root group=root mode=0644 follow=yes
- name: Sync webapps music
copy: src=/etc/ansible/roles/sync/files/music.mp3 dest=/data/servers/webapps/static/music/music.mp3 owner=nginx group=nginx mode=0644 follow=yes
/etc/ansible/inventory/aliyun/webapps/hosts
1
2
[frontend]
192.168.1.100 ansible_ssh_port=22 ansible_ssh_user=centos ansible_ssh_private_key_file=/etc/ansible/keys/ssh/centos-key.pem
webapps.j2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
server {
listen 80;
server_name {{ frontendip }};
index index.html index.htm;

location / {
root /data/servers/webapps/;
index index.html index.htm;
try_files $uri $uri/ @rewrites;
}

location @rewrites {
#rewrite ^/(.+)$ /$1.html last;
rewrite ^(.+)$ /index.html last;
}

location /api/ {
proxy_pass http://{{ backendip }}:8080/;
client_max_body_size 300m;
client_body_buffer_size 128k;
proxy_connect_timeout 6000;
proxy_read_timeout 6000;
proxy_send_timeout 6000;
#这三行 start
proxy_buffer_size 128k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 128k;
#这三行 end
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header Accept-Encoding "gzip";
}
}
剧本详情讲解
1
2
3
4
5
6
7
8
$ ansible -i /etc/ansible/inventory/aliyun/webapps/hosts frontend -a 'uptime'
$ ansible-playbook /etc/ansible/sync.yml -i /etc/ansible/inventory/aliyun/webapps/hosts --extra-vars "hosts=frontend user=centos frontendip=192.168.1.100 backendip=192.168.1.200"

# 首先第一步毋容置疑就是测试服务器可连接性
# 第二步里面首先指定剧本然后指定hosts主机清单
# 然后利用--extra-vars传送变量到剧本进行完整的执行,我们可以看到剧本里面有好几个变量
# hosts=执行任务主机 user=执行任务的用户 在之后还有2个变量是frontendip和backendip就是nginx配置的前端监听ip和后端ip
# 我们通过--extra-vars传送变量到配置文件,这样子我们就不需要去frontend服务器进行配置了
执行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
music.mp3传输目标主机的/data/servers/webapps/static/music/music.mp3下
webapps.j2传输目标主机的/etc/nginx/conf.d/下并改名为webapps.conf
后通过传输的变量使配置文件内容变为:
server {
listen 80;
server_name 192.168.1.100;
index index.html index.htm;

location / {
root /data/servers/webapps/;
index index.html index.htm;
try_files $uri $uri/ @rewrites;
}

location @rewrites {
#rewrite ^/(.+)$ /$1.html last;
rewrite ^(.+)$ /index.html last;
}

location /api/ {
proxy_pass http://192.168.1.200:8080/;
client_max_body_size 300m;
client_body_buffer_size 128k;
proxy_connect_timeout 6000;
proxy_read_timeout 6000;
proxy_send_timeout 6000;
#这三行 start
proxy_buffer_size 128k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 128k;
#这三行 end
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header Accept-Encoding "gzip";
}
}

More Info: Ansible