Gitlab¶
[1]:
from nornir.plugins.tasks.version_control import gitlab
print(gitlab.__doc__)
Exposes some of the Gitlab API functionality for operations on files
in a Gitlab repository.
Example:
nornir.run(files.gitlab,
action="create",
url="https://gitlab.localhost.com",
token="ABCD1234",
repository="test",
filename="config",
ref="master")
Arguments:
dry_run: Whether to apply changes or not
url: Gitlab instance URL
token: Personal access token
repository: source/destination repository
filename: source/destination file name
content: content to write
action: ``create``, ``update``, ``get``
branch: destination branch
destination: local destination filename (only used in get action)
ref: branch, commit hash or tag (only used in get action)
commit_message: commit message
Returns:
Result object with the following attributes set:
* changed (``bool``):
* diff (``str``): unified diff
Example 1 : create a file in a git repository on a gitlab server¶
In this example we will create a new file in a git repository on a gitlab server.
The contents that we will write to the file is a arbitrary string, in a real world scenario this could be the running configuration of a device that we fetched using napalm or through another method.
First let’s import the necessary methods & tasks, then we will create a variable called content
which is an arbitrary string.
[1]:
from nornir import InitNornir
from nornir.plugins.tasks.version_control import gitlab
from nornir.plugins.tasks.commands import remote_command
from nornir.plugins.functions.text import print_result
inventory = {
"plugin": "nornir.plugins.inventory.simple.SimpleInventory",
"options": {
"host_file": "gitlab_data/inventory/hosts.yaml"
}
}
n = InitNornir(inventory=inventory)
content = """127.0.0.1\t\tlocalhost
255.255.255.255\tbroadcasthost
::1\t\tlocalhost
"""
And create a new file called hosts
in the repository test
on the master
branch.
[3]:
result = n.run(
gitlab,
action="create",
url="http://localhost:8080",
token = "SuperSecretToken",
repository="test",
branch="master",
filename="hosts",
#content=results["dev5.no_group"][0]
content=content,
commit_message="Nornir is AWESOME!"
)
The result of the task shows us a diff of the created hosts
file and the content we provided.
[4]:
print_result(result)
gitlab**************************************************************************
* alpine ** changed : True *****************************************************
vvvv gitlab ** changed : True vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO
---
+++ hosts
@@ -0,0 +1,3 @@
+127.0.0.1 localhost
+255.255.255.255 broadcasthost
+::1 localhost
^^^^ END gitlab ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Example 2 : update an existing file in a git repository on a gitlab server¶
In this example we will update the contents of the hosts file that we created in the previous step. The new contents could come again from a remote host or device, but in this case we will use an arbitrary value for the new contents of the file.
[5]:
result = n.run(
gitlab,
action="update",
url="http://localhost:8080",
token="SuperSecretToken",
repository="test",
branch="master",
filename="hosts",
content=f"{content}8.8.8.8\t\tgoogledns",
commit_message="Added new line to hosts file"
)
The result of the task should show us a diff of the changes that we made.
[6]:
print_result(result)
gitlab**************************************************************************
* alpine ** changed : True *****************************************************
vvvv gitlab ** changed : True vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO
--- hosts
+++ hosts
@@ -1,3 +1,4 @@
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
+8.8.8.8 googledns
^^^^ END gitlab ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Example 3: get a file from a gitlab repository¶
In this example we will get/download a file from a repository in gitlab. The contents of this file could be a staged configuration of a device or a service on a device. This configuration could then be pushed to the device.
In our example we will download the file hosts
from the master
branch and save it as /tmp/hosts
. The ref
parameter can also be a commit hash or tag.
[7]:
!rm -f /tmp/hosts
result = n.run(
gitlab,
action="get",
url="http://localhost:8080",
token="SuperSecretToken",
repository="test",
ref="master",
filename="hosts",
destination="/tmp/hosts"
)
The result should show us a new file /tmp/hosts
being created on the local system.
[8]:
print_result(result)
gitlab**************************************************************************
* alpine ** changed : True *****************************************************
vvvv gitlab ** changed : True vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO
--- /tmp/hosts
+++ /tmp/hosts
@@ -0,0 +1,3 @@
+127.0.0.1 localhost
+255.255.255.255 broadcasthost
+::1 localhost
^^^^ END gitlab ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[ ]: