无法从数据库中获取GitLab Runner注册令牌

3

我正在尝试使用Ansible完全部署我的Gitlab CI/CD堆栈,并自动注册Runner。

我在playbook中使用以下任务来获取注册令牌并将其存储在事实中,以供我的Runner进一步注册。正如我在几个教程中看到的那样,我们可以从Gitlab数据库中获取注册令牌。

Ansible playbook任务:

- name: Extract Runner Registration Token directly from Gitlab DB
    become: true
    become_user: gitlab-psql
    vars:
        ansible_ssh_pipelining: true
        query: "SELECT runners_registration_token FROM application_settings ORDER BY id DESC LIMIT 1"
        psql_exec: "/opt/gitlab/embedded/bin/psql"
        gitlab_db_name: "gitlabhq_production"
    shell: '{{ psql_exec }} -h /var/opt/gitlab/postgresql/ -d {{ gitlab_db_name }} -t -A -c "{{ query }}"'
    register: gitlab_runner_registration_token_result

但是这个任务没有返回任何“注册令牌”(得到一个空字符串),因为“application_settings”表中不存在“runners_registration_token”列。然而,“runners_registration_token_encrypted”列存在,但是“runner-register”api拒绝返回的“runners_registration_token_encrypted”字符串。
因此,我必须从gitlab gui(在“admin/runners”中)复制运行者注册令牌,将其硬编码到playbook中,然后再次运行playbook以成功注册stack。
有人能解释一下gitlab存储其在GUI中显示的运行者注册令牌的位置吗(我注意到在重新启动gitlab服务器后它是相同的,不会改变)? 是否完全不可能自动获取gitlab运行者注册令牌以进行非交互式注册? 你们有关于实现这一点的正确方法的任何想法吗?
3个回答

6
也许可以在应用服务器上使用Rails控制台? 将以下内容放入shell或命令中,在gitlab应用服务器上运行并捕获输出:
gitlab-rails runner -e production "puts Gitlab::CurrentSettings.current_application_settings.runners_registration_token"

那么使用Ansible可以做到这样:
- name: Extract Runner Registration Token directly from Gitlab Rails console
    become: true
    shell: 'gitlab-rails runner -e production "puts Gitlab::CurrentSettings.current_application_settings.runners_registration_token"'
    register: gitlab_runner_registration_token_result

2

使用Ansible这种方式,我可以从我的私有Gitlab服务器获取Gitlab Runner注册令牌,并在Runner主机上自动注册Docker Runner:

最初的回答:

- name: obtain registration token
  when: gitlab_host is defined
  delegate_to: "{{ gitlab_host }}"
  command: 'gitlab-rails runner -e production "puts Gitlab::CurrentSettings.current_application_settings.runners_registration_token"'
  register: runners_registration_token
  changed_when: false

- name: set gitlab_runner_token
  when: gitlab_host is defined and runners_registration_token.rc == 0
  set_fact:
    gitlab_runner_token: "{{ runners_registration_token.stdout }}"

- name: register docker runner
  when: docker_runner|bool
  command: |
    gitlab-ci-multi-runner register \
    --non-interactive \
    --url "{{ gitlab_external_url }}" \
    --registration-token "{{ gitlab_runner_token|quote }}" \
    --description "docker-runner" \
    --executor "docker" \
    --docker-network-mode="host" \
    --docker-tlsverify=false \
    --docker-privileged \
    --tag-list '{{ gitlab_runner_tags | join(",") }}' \
    --docker-image='{{ gitlab_runner_image |default('alpine') }}'

角色可用,dockpack.gitlab_runner的原始答案是"最初的回答"。

0
你们有任何关于正确实现这个的想法吗?
正确的方式是通过他们的API。允许任何人,包括ansible playbooks,访问gitlab数据库非常不明智。
另外,虽然与您特定的查询无关,但使用quote将jinja变量馈入shell字符串是一个非常好的习惯。

2
感谢 @Matthew 的回答,但是无法通过API获取注册令牌。文档要求您从Gitlab GUI中获取令牌,然后使用它来注册运行程序。 - nixmind
是的@Matthew,我赞同nixmind... 你无法通过API获取这个。GitLab Comunity Edition中存在一个两年前提到这个问题的问题 - https://gitlab.com/gitlab-org/gitlab-ce/issues/24030 - eRadical
注意引号过滤器的问题,但请注意命令模块,当命令足够时不使用 shell 是最佳实践。 - bbaassssiiee
在版本“13.0”中删除了令牌,请查看您链接的文档中的注释。 - elmariofredo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接