我正在通过gitlab-ci
执行一些ansible
剧本,我可以看到的是
-
Ansible剧本通过管道成功执行,但它没有产生预期的输出
-
当我重试
gitlab
作业时,它会产生我需要的输出。
这是我通过gitlab:执行的众多playbooks
之一
1_ca.yaml
---
- hosts: 127.0.0.1
connection: local
tasks:
- name: Create ca-csr.json
become: true
copy:
dest: ca-csr.json
content: '{"CN":"Kubernetes","key":{"algo":"rsa","size":2048},"names":[{"C":"US","L":"Portland","O":"Kubernetes","OU":"CA","ST":"Oregon"}]}'
- name: Create ca-config.json
become: true
copy:
dest: ca-config.json
content: '{"signing":{"default":{"expiry":"8760h"},"profiles":{"kubernetes":{"usages":["signing","key encipherment","server auth","client auth"],"expiry":"8760h"}}}}'
- name: Create the ca.pem & ca-key.pem
# become: true
shell: |
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
基本上,它所做的是它创建了一些我需要的证书。
但在第一次尝试中,即使管道通过,它也不会生成这些证书。当我重新启动(第二次运行同一作业(gitlab
中的特定作业时,它会生成这些证书。
为什么会发生这种情况?
这就是我的.gitlab-ci.yaml
的样子:
Create-Certificates:
stage: ansible-play-books-create-certs
retry:
max: 2
when:
- always
script:
- echo "Executing ansible playbooks for generating certficates"
- ansible-playbook ./ansible-playbooks/1_ca/1_ca.yaml
- ansible-playbook ./ansible-playbooks/1_ca/2_admin.yaml
- ansible-playbook ./ansible-playbooks/1_ca/3_kubelet.yaml
- ansible-playbook ./ansible-playbooks/1_ca/4_kube-controller.yaml
- ansible-playbook ./ansible-playbooks/1_ca/5_kube-proxy.yaml
- ansible-playbook ./ansible-playbooks/1_ca/6_kube-scheduler.yaml
- ansible-playbook ./ansible-playbooks/1_ca/7_kube-api-server.yaml
- ansible-playbook ./ansible-playbooks/1_ca/8_service-account.yaml
- ansible-playbook ./ansible-playbooks/1_ca/9_distribute-client-server-cert.yaml
# when: delayed
# start_in: 1 minutes
tags:
- banuka-gcp-k8s-hard-way
PS:这些易解析的剧本是在易解析主机本身执行的,而不是在远程服务器中。因此,我可以登录到ansible
主服务器,检查这些文件是否已创建。
在没有最后一个shell模块的情况下运行您的剧本会产生以下输出:
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
PLAY [127.0.0.1] **************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************************************************************************************************
ok: [127.0.0.1]
TASK [Create ca-csr.json] *****************************************************************************************************************************************************************************************
[WARNING]: File './ca-csr.json' created with default permissions '600'. The previous default was '666'. Specify 'mode' to avoid this warning.
changed: [127.0.0.1]
TASK [Create ca-config.json] **************************************************************************************************************************************************************************************
[WARNING]: File './ca-config.json' created with default permissions '600'. The previous default was '666'. Specify 'mode' to avoid this warning.
changed: [127.0.0.1]
PLAY RECAP ********************************************************************************************************************************************************************************************************
127.0.0.1 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
并检查是否存在:
$ ls ca* -al
-rw------- 1 root root 155 Aug 17 02:48 ca-config.json
-rw------- 1 root root 129 Aug 17 02:48 ca-csr.json
因此,尽管这是一种相当肮脏的剧本写作方式,但它确实有效。为什么它很脏?:
- 您没有使用任何库存
- 本地任务应该使用
local_action
,而不是connection: local
- 您正在滥用ansible,即多节点配置管理来执行
bash
脚本任务
因此,总之,你的ansible剧本没有错,或者文件权限(?(没有错,如果它没有运行,你应该更多地关注gitlab ci方向。
你需要提供更多关于Gitlab CI设置的详细信息,但可能stage
不正确?