summaryrefslogtreecommitdiff
path: root/docs/vyos.rest.vyos_httpapi.rst
blob: e9e8ce6cb342d43df082baf557097872d00293d3 (plain)
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
.. _vyos.rest.vyos_httpapi:


**************
vyos.rest.vyos
**************

**HttpApi plugin for VyOS REST API**


Version added: 1.0.0

.. contents::
   :local:
   :depth: 1


Synopsis
--------
- This HttpApi plugin provides methods to connect to VyOS devices via their HTTPS REST API.
- Use with ``ansible_connection=ansible.netcommon.httpapi`` and ``ansible_network_os=vyos.rest.vyos``.
- The VyOS REST API must be enabled with ``set service https api keys id ansible key YOUR_KEY``, ``set service https api rest``, then ``commit && save``.




Parameters
----------

.. raw:: html

    <table  border=0 cellpadding=0 class="documentation-table">
        <tr>
            <th colspan="1">Parameter</th>
            <th>Choices/<font color="blue">Defaults</font></th>
                <th>Configuration</th>
            <th width="100%">Comments</th>
        </tr>
            <tr>
                <td colspan="1">
                    <div class="ansibleOptionAnchor" id="parameter-"></div>
                    <b>api_key</b>
                    <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
                    <div style="font-size: small">
                        <span style="color: purple">string</span>
                    </div>
                </td>
                <td>
                </td>
                    <td>
                                <div>env:VYOS_API_KEY</div>
                                <div>var: ansible_httpapi_api_key</div>
                                <div>var: ansible_vyos_api_key</div>
                    </td>
                <td>
                        <div>The API key configured on the VyOS device.</div>
                        <div>Set <code>ansible_httpapi_api_key</code> in inventory or the <code>VYOS_API_KEY</code> environment variable.</div>
                </td>
            </tr>
            <tr>
                <td colspan="1">
                    <div class="ansibleOptionAnchor" id="parameter-"></div>
                    <b>auth_method</b>
                    <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
                    <div style="font-size: small">
                        <span style="color: purple">string</span>
                    </div>
                </td>
                <td>
                        <ul style="margin: 0; padding: 0"><b>Choices:</b>
                                    <li><div style="color: blue"><b>key</b>&nbsp;&larr;</div></li>
                                    <li>header</li>
                                    <li>bearer</li>
                                    <li>mtls</li>
                                    <li>oidc</li>
                        </ul>
                </td>
                    <td>
                                <div>var: ansible_httpapi_vyos_auth_method</div>
                                <div>var: ansible_vyos_auth_method</div>
                    </td>
                <td>
                        <div>Authentication method to use.</div>
                        <div><code>key</code> sends the API key as a form field (default, backward-compatible).</div>
                        <div><code>header</code> sends the API key as an <code>X-API-Key</code> header.</div>
                        <div><code>bearer</code> exchanges the API key for a short-lived JWT via <code>POST /token</code> and sends it as an Authorization Bearer header for subsequent requests.</div>
                        <div><code>mtls</code> uses mutual TLS client certificate authentication. No API key is sent. Requires <code>ansible_httpapi_client_cert</code> and <code>ansible_httpapi_client_key</code> to be set at the connection level.</div>
                        <div><code>oidc</code> fetches a Bearer token from an external identity provider using the OAuth2 client credentials grant and sends it as an Authorization Bearer header. Requires <code>ansible_vyos_oidc_token_url</code>, <code>ansible_vyos_oidc_client_id</code>, and <code>ansible_vyos_oidc_client_secret</code>.</div>
                </td>
            </tr>
            <tr>
                <td colspan="1">
                    <div class="ansibleOptionAnchor" id="parameter-"></div>
                    <b>oidc_client_id</b>
                    <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
                    <div style="font-size: small">
                        <span style="color: purple">string</span>
                    </div>
                </td>
                <td>
                </td>
                    <td>
                                <div>var: ansible_vyos_oidc_client_id</div>
                    </td>
                <td>
                        <div>OAuth2 client ID for the client credentials grant.</div>
                        <div>Required when <code>auth_method=oidc</code>.</div>
                </td>
            </tr>
            <tr>
                <td colspan="1">
                    <div class="ansibleOptionAnchor" id="parameter-"></div>
                    <b>oidc_client_secret</b>
                    <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
                    <div style="font-size: small">
                        <span style="color: purple">string</span>
                    </div>
                </td>
                <td>
                </td>
                    <td>
                                <div>var: ansible_vyos_oidc_client_secret</div>
                    </td>
                <td>
                        <div>OAuth2 client secret for the client credentials grant.</div>
                        <div>Required when <code>auth_method=oidc</code>.</div>
                </td>
            </tr>
            <tr>
                <td colspan="1">
                    <div class="ansibleOptionAnchor" id="parameter-"></div>
                    <b>oidc_token_url</b>
                    <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
                    <div style="font-size: small">
                        <span style="color: purple">string</span>
                    </div>
                </td>
                <td>
                </td>
                    <td>
                                <div>var: ansible_vyos_oidc_token_url</div>
                    </td>
                <td>
                        <div>Full URL of the OAuth2/OIDC token endpoint.</div>
                        <div>Required when <code>auth_method=oidc</code>.</div>
                </td>
            </tr>
    </table>
    <br/>


Notes
-----

.. note::
   - Bearer tokens are cached in memory for the duration of the connection and refreshed automatically 30 seconds before expiry.
   - Token expiry is controlled on the device via ``set service https api rest authentication expiration <seconds>``.
   - For mTLS, set ``ansible_httpapi_client_cert`` and ``ansible_httpapi_client_key`` at the connection level. The netcommon httpapi connection plugin handles the TLS handshake automatically.
   - OIDC tokens are cached and refreshed using the ``expires_in`` value returned by the identity provider.



Examples
--------

.. code-block:: yaml

    # inventory.yml - form-field API key (default, backward-compatible)
    all:
      hosts:
        vyos01:
          ansible_host: 192.168.1.1
          ansible_connection: ansible.netcommon.httpapi
          ansible_network_os: vyos.rest.vyos
          ansible_httpapi_use_ssl: true
          ansible_httpapi_validate_certs: false
          ansible_httpapi_api_key: mysecretkey

    # inventory.yml - X-API-Key header
    all:
      hosts:
        vyos01:
          ansible_host: 192.168.1.1
          ansible_connection: ansible.netcommon.httpapi
          ansible_network_os: vyos.rest.vyos
          ansible_httpapi_use_ssl: true
          ansible_httpapi_validate_certs: false
          ansible_httpapi_api_key: mysecretkey
          ansible_vyos_auth_method: header

    # inventory.yml - Bearer token (JWT)
    all:
      hosts:
        vyos01:
          ansible_host: 192.168.1.1
          ansible_connection: ansible.netcommon.httpapi
          ansible_network_os: vyos.rest.vyos
          ansible_httpapi_use_ssl: true
          ansible_httpapi_validate_certs: false
          ansible_httpapi_api_key: mysecretkey
          ansible_vyos_auth_method: bearer

    # inventory.yml - mTLS client certificate
    all:
      hosts:
        vyos01:
          ansible_host: 192.168.1.1
          ansible_connection: ansible.netcommon.httpapi
          ansible_network_os: vyos.rest.vyos
          ansible_httpapi_use_ssl: true
          ansible_httpapi_validate_certs: false
          ansible_vyos_auth_method: mtls
          ansible_httpapi_client_cert: /etc/ansible/certs/client.pem
          ansible_httpapi_client_key: /etc/ansible/certs/client.key

    # inventory.yml - OIDC (Keycloak client credentials)
    all:
      hosts:
        vyos01:
          ansible_host: 192.168.1.1
          ansible_connection: ansible.netcommon.httpapi
          ansible_network_os: vyos.rest.vyos
          ansible_httpapi_use_ssl: true
          ansible_httpapi_validate_certs: false
          ansible_vyos_auth_method: oidc
          ansible_vyos_oidc_token_url: https://keycloak.example.com/realms/vyos/protocol/openid-connect/token
          ansible_vyos_oidc_client_id: vyos-api
          ansible_vyos_oidc_client_secret: mysecret




Status
------


Authors
~~~~~~~

- VyOS Community (@vyos)


.. hint::
    Configuration entries for each entry type have a low to high priority order. For example, a variable that is lower in the list will override a variable that is higher up.