GitLab を Ansible から操作する

6 min読了の目安(約5600字TECH技術記事

Ansible に GitLab 関連の Collection があるので、CentOS8 上で試してみました。
使用したのは、以下の Collection です。

Access Token の発行

GitLab にrootでログインし、Access Tokenを発行します。

  1. rootでログインする
  2. 右上のアイコンをクリックし、Settingsを選択する
  3. 左側のメニューから Access Tokens を選択する
  4. 以下のように入力し、Access Token を発行する
    • Name: Ansible
    • Expires at: null (無期限)
    • Scopes: api

Ansible 環境のインストール

CentOS8 標準の Ansible 2.9.13 の場合、gitlab モジュールを使用すると、以下のようなエラーが発生しました。

An exception occurred during task execution. To see the full traceback, use -vvv. The error was: TypeError: __init__() got an unexpected keyword argument 'email'

以下のバグが原因と思われます(Ubuntuのバグレポートですが)。

そこで、virtualenv上で Ansible2.10 をインストールして環境を構築することにします。なお、gitlabモジュールの実行には python-gitlab も必要なので、併せてインストールします。

$ cd
$ sudo pip3 install virtualenv
$ python3 -m virtualenv ansible-py3
$ source ansible-py3/bin/activate
$ pip install ansible
$ pip install python-gitlab

Ansible Playbook

以下のような Playbook を書きました。

---
- name: Configuration of GitLab
  hosts: 127.0.0.1
  connection: local
  gather_facts: false
  vars:
    gitlab_config:
      api_url: http://192.168.129.73/
      api_token: <ここに Access Token を書く>

      ## groups
      groups:
        - group1
        - group2

      ## projects
      projects:
        - project_group: group1
          project_name:
            - project1-1
            - project1-2
        - project_group: group2
          project_name:
            - project2-1

      ## users
      users:
        - name: user1
          username: user1
          password: password
          email: user1@example.com
          access_level: maintainer
  tasks:
    - name: Create GitLab Groups
      community.general.gitlab_group:
        api_url: "{{ gitlab_config.api_url }}"
        api_token: "{{ gitlab_config.api_token }}"
        validate_certs: False
        name: "{{ item }}"
        state: present
      with_items: "{{ gitlab_config.groups }}"

    - name: Create GitLab Project
      community.general.gitlab_project:
        api_url: "{{ gitlab_config.api_url }}"
        api_token: "{{ gitlab_config.api_token }}"
        validate_certs: False
        name: "{{ item.1 }}"
        group: "{{ item.0.project_group }}"
        state: present
      with_subelements:
        - "{{ gitlab_config.projects }}"
        - project_name

    - name: Create GitLab User
      community.general.gitlab_user:
        api_url: "{{ gitlab_config.api_url }}"
        api_token: "{{ gitlab_config.api_token }}"
        validate_certs: False
        name: "{{ item.name }}"
        username: "{{ item.username }}"
        password: "{{ item.password }}"
        email: "{{ item.email }}"
        state: present
        access_level: "{{ item.access_level }}"
      with_items: "{{ gitlab_config.users }}"

では、実行します。

$ ansible-playbook gitlab_playbook.yml
[DEPRECATION WARNING]: DEFAULT_HASH_BEHAVIOUR option, This feature is fragile and not portable, leading to continual confusion and misuse , use the
``combine`` filter explicitly instead. This feature will be removed in version 2.13. Deprecation warnings can be disabled by setting
deprecation_warnings=False in ansible.cfg.
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

PLAY [Configuration of GitLab] *****************************************************************************************************************************

TASK [Create GitLab Groups] ********************************************************************************************************************************
changed: [127.0.0.1] => (item=group1)
changed: [127.0.0.1] => (item=group2)

TASK [Create GitLab Project] *******************************************************************************************************************************
changed: [127.0.0.1] => (item=[{'project_group': 'group1'}, 'project1-1'])
changed: [127.0.0.1] => (item=[{'project_group': 'group1'}, 'project1-2'])
changed: [127.0.0.1] => (item=[{'project_group': 'group2'}, 'project2-1'])

TASK [Create GitLab User] **********************************************************************************************************************************
changed: [127.0.0.1] => (item={'name': 'user1', 'username': 'user1', 'password': 'password', 'email': 'user1@example.com', 'access_level': 'maintainer'})

PLAY RECAP *************************************************************************************************************************************************
127.0.0.1                  : ok=0    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

無事にグループ、プロジェクト、ユーザーが作成されました。

注意点

gitlab_user でユーザーを作成する際、groupを指定することができるのですが、ドキュメントには型が string と書いてあります。この記事では省略しましたが、親グループを作って、その配下に子グループを作ると、グループの指定は親グループを指定するだけでよくなるので、グループ構成は注意したほうがよさそうです。

また、今回は複数のグループを作成したかったので、二重ループにする必要があり、「with_subelements」を使ってみました。