Discussion:
[Fab-user] Update multiple files and just backup once
Randal Ray
2016-12-14 16:34:24 UTC
Permalink
Hi everyone,

I've recently started using Fabric. I have multiple 3 web servers. The specification of SSH options such as HostName and User are saved in $HOME/.ssh/config, which looks like this:

Host server1
HostName 54.xxx.yyy.zzz
User ubuntu

Host server2
HostName 54.aaa.bbb.ccc
User ubuntu

Host server3
HostName 54.ddd.eee.fff
User ubuntu

Now I would like to update a file on each of these 3 servers (the content of these files are the same) with a local file.

My fabfile looks like this:

env.use_ssh_config = True

def upload():
execute(backup)
conf_files = current_dir + 'abc.conf'
remote_conf_dir = '/etc/abc/'
put(conf_files, remote_conf_dir, use_sudo=True)
print(green("Upload complete"))

When I run `fab -H server1, server2, server3 upload`, this script will backup the file three times.

Because the content of these 3 files are the same, I want to backup just one copy of the file on my local machine at first, then update all 3 of them.

My first thought was to read the ssh config file into a list and iterate the list, do things on the first server, then break the loop. I felt this seemed a bit hokey to find.

Is there any other way to implement this? I've searched Google and Stackoverflow, but I got nothing about this.

Your help would be appreciated!
Vincent
Carlos García
2016-12-14 16:47:46 UTC
Permalink
Hi Randal,

the task is being executed on each host you put in -H, that’s why the
backup is done 3 times. In order to avoid this, I think the easiest way is
to use execute(). (BTW, I’m not really sure what are you doing in backup)

def backup_and_upload():
execute(backup)
execute(upload, hosts=['server1',''server2', 'server3'])

def upload():
conf_files = current_dir + 'abc.conf'
remote_conf_dir = '/etc/abc/'
put(conf_files, remote_conf_dir, use_sudo=True)
print(green("Upload complete"))

You can run this locally (fab backup_and_upload -H localhost), as execute()
will connect to hosts to perform the task.

This will work, but maybe later you will need to add more servers. In that
case, you can use parameters or try a more dynamic approach. Read this, is
a must! http://docs.fabfile.org/en/1.12/usage/execution.html

Regards

2016-12-14 17:34 GMT+01:00 Randal Ray <***@outlook.com>:

Hi everyone,
Post by Randal Ray
I've recently started using Fabric. I have multiple 3 web servers. The
specification of SSH options such as HostName and User are saved in
Host server1
HostName 54.xxx.yyy.zzz
User ubuntu
Host server2
HostName 54.aaa.bbb.ccc
User ubuntu
Host server3
HostName 54.ddd.eee.fff
User ubuntu
Now I would like to update a file on each of these 3 servers (the content
of these files are the same) with a local file.
env.use_ssh_config = True
execute(backup)
conf_files = current_dir + 'abc.conf'
remote_conf_dir = '/etc/abc/'
put(conf_files, remote_conf_dir, use_sudo=True)
print(green("Upload complete"))
When I run `fab -H server1, server2, server3 upload`, this script will
backup the file three times.
Because the content of these 3 files are the same, I want to backup just
one copy of the file on my local machine at first, then update all 3 of
them.
My first thought was to read the ssh config file into a list and iterate
the list, do things on the first server, then break the loop. I felt this
seemed a bit hokey to find.
Is there any other way to implement this? I've searched Google and
Stackoverflow, but I got nothing about this.
Your help would be appreciated!
Vincent
_______________________________________________
Fab-user mailing list
https://lists.nongnu.org/mailman/listinfo/fab-user
​
Loading...