Jenkins 传递 sudo password 给 Ansible Playbook
环境
-
Linux: RedHat 7.8
-
Jenkins: 2.263.4
-
Ansible: 2.9.17
-
Python: 2.7.5
方法
Ansible 在部署的过程中,有一部分任务需要用到 sudo 权限,这个时候就需要 sudo 密码了。这里我们有三种方式(我所知道的)可以指定 sudo 密码。
-
使用
-K
,--ask-become-pass
等方式(ansible 官方推荐)来交互式的输入 sudo 密码。 -
在 inventory 文件(即 hosts 文件)中指定
-
传入额外的变量
-e ansible_become_pass=xxx
下面实例说明:
交互式
ansible-playbook deploy.yml -K
# 或者
ansible-playbook deploy.yml --ask-become-pass
hosts 中指定(不安全,不推荐)
将密码明文保存在文件中是非常不安全的一种方式
hosts 文件:
[webserver]
webserver1 172.16.5.241 ansible_become_pass=xxxx
执行命令:
ansible-playbook deploy.yml
传入额外变量(不安全,但 Jenkins 能使其变得安全)
这种方法在执行 ansible playbook 的时候,将密码以参数形式传入,这意味着能在命令历史中查看到该记录,这是非常不安全的,一般情况下不建议使用。但是配合 Jenkins 能使其安全性得到保障,这里要用到的就是 Jenkins 的 secret text 。
用法:
ansible-playbook deploy.yml -e ansible_becom_pass=xxx
下面以这种方式 + Jenkins Secrect Text 实现标题所指的功能
在 Jenkins 的 Credential 中创建 Secret text
在 Dashboard
> Manager Jenkins
> Security
> Manage Credential
中,点击下图的这个按钮
跳转到下一个页面后,点击下面的按钮
然后点击 Add Credentials
然后按照自己的实际情况填写
secret 填写密码
ID 作为 Jenkins 里边的唯一标识,在实际用到 credential 时起区分作用
Description 描述
在 Jenkins Job 里边使用
在任务的配置中,将 Build Environment
下的 Use secret text(s) or file(s)
勾上,然后在 Bindings
里边选择 Secret text
填完之后:
这样就定义了一个变量 sudo_pass,变量的值就是我们先前设置的密码,这个变量在任务执行的过程中可以拿到。然后在 Build
中定义一个执行步骤:
这样就可以将 sudo 的密码传给 ansible 了,既实现了自动化部署,又能确保密码不会泄漏。
评论