Ansible 无法从数据库中获取gitlab runners注册令牌

Ansible 无法从数据库中获取gitlab runners注册令牌,ansible,gitlab,gitlab-ci,gitlab-ci-runner,gitlab-omnibus,Ansible,Gitlab,Gitlab Ci,Gitlab Ci Runner,Gitlab Omnibus,我正在尝试使用ansible和自动注册运行程序完全部署我的gitlab cicd堆栈 我在playbook中使用下面的任务获取注册令牌并将其存储在facts中,以便我的跑步者进一步注册,正如我在几个教程中看到的那样,我们可以从gitlab数据库获取注册令牌 ansible playbook任务: - name: Extract Runner Registration Token directly from Gitlab DB become: true become_user: g

我正在尝试使用ansible和自动注册运行程序完全部署我的gitlab cicd堆栈

我在playbook中使用下面的任务获取注册令牌并将其存储在facts中,以便我的跑步者进一步注册,正如我在几个教程中看到的那样,我们可以从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
但是此任务不会返回任何注册令牌(获取空字符串),因为runners\u registration\u token列在application\u settings表中不存在。但是,
runners\u registration\u token\u encrypted
列存在,但是
runners\u registration\u token\u encrypted
api拒绝返回的
string

因此,我必须从gitlab gui(在admin/runners中)复制runners注册令牌,将其硬编码到playbook中,然后再次运行playbook以成功注册堆栈

有人能解释一下gitlab在GUI中显示的runners注册令牌的存储位置吗(我注意到它在重新启动gitlab服务器后是相同的,它没有改变)? 是否完全不可能为自动跑步者非交互式注册自动执行gitlab跑步者注册令牌检索? 请问,你们对实现这一目标的正确方法有什么想法吗

请问,你们对实现这一目标的正确方法有什么想法吗

正确的方法是通过。允许任何人(包括ansible剧本)访问gitlab数据库是非常非常非常不明智的


另外,虽然与您的特定查询不太相关,但在将jinja变量输入shell字符串时使用它是一个非常好的习惯

是否可以使用应用程序服务器上的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

通过使用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') }}'

您可以使用角色

Thx@Matthew获得答案,但无法通过API检索注册令牌。文档要求您从gitlab GUI获取令牌,并使用它注册跑步者。。。你不能通过API来实现这一点。GitLab Comunity Edition中有一个2年前的问题提到了这一点-关于quote filter,但请注意命令模块,在命令足够时不使用shell也是一种最佳做法。在版本“13.0”中删除了令牌请参阅链接文档中的注释。