🤖
GitLab を Ansible から操作する
Ansible に GitLab 関連の Collection があるので、CentOS8 上で試してみました。
使用したのは、以下の Collection です。
- community.general.gitlab_group – Creates/updates/deletes GitLab Groups
- community.general.gitlab_project – Creates/updates/deletes GitLab Projects
- community.general.gitlab_user – Creates/updates/deletes/blocks/unblocks GitLab Users
Access Token の発行
GitLab にrootでログインし、Access Tokenを発行します。
- rootでログインする
- 右上のアイコンをクリックし、Settingsを選択する
- 左側のメニューから Access Tokens を選択する
- 以下のように入力し、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」を使ってみました。
Discussion