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 密码。

  1. 使用 -K, --ask-become-pass 等方式(ansible 官方推荐)来交互式的输入 sudo 密码。

  2. 在 inventory 文件(即 hosts 文件)中指定

  3. 传入额外的变量 -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 中,点击下图的这个按钮
image.png

跳转到下一个页面后,点击下面的按钮
image.png

然后点击 Add Credentials
image.png

然后按照自己的实际情况填写
image.png

secret 填写密码
ID 作为 Jenkins 里边的唯一标识,在实际用到 credential 时起区分作用
Description 描述

在 Jenkins Job 里边使用

在任务的配置中,将 Build Environment 下的 Use secret text(s) or file(s) 勾上,然后在 Bindings 里边选择 Secret text

image.png

填完之后:
image.png

这样就定义了一个变量 sudo_pass,变量的值就是我们先前设置的密码,这个变量在任务执行的过程中可以拿到。然后在 Build 中定义一个执行步骤:
image.png

这样就可以将 sudo 的密码传给 ansible 了,既实现了自动化部署,又能确保密码不会泄漏。

评论