2020-05-01 18:11:28 +00:00
|
|
|
const core = require('@actions/core')
|
|
|
|
const exec = require('@actions/exec')
|
2020-12-09 10:57:43 +00:00
|
|
|
const yaml = require('yaml')
|
2020-05-01 18:11:28 +00:00
|
|
|
const fs = require('fs')
|
|
|
|
const os = require('os')
|
|
|
|
|
|
|
|
async function main() {
|
|
|
|
try {
|
|
|
|
const playbook = core.getInput("playbook", { required: true })
|
2020-12-06 16:06:02 +00:00
|
|
|
const requirements = core.getInput("requirements")
|
2020-05-01 18:11:28 +00:00
|
|
|
const directory = core.getInput("directory")
|
|
|
|
const key = core.getInput("key")
|
|
|
|
const inventory = core.getInput("inventory")
|
|
|
|
const vaultPassword = core.getInput("vault_password")
|
2021-04-04 18:51:37 +00:00
|
|
|
const knownHosts = core.getInput("known_hosts")
|
2020-05-01 18:11:28 +00:00
|
|
|
const options = core.getInput("options")
|
2021-07-19 15:49:48 +00:00
|
|
|
const sudo = core.getInput("sudo")
|
2021-08-01 15:03:21 +00:00
|
|
|
const noColor = core.getInput("no_color")
|
2020-05-01 18:11:28 +00:00
|
|
|
|
|
|
|
let cmd = ["ansible-playbook", playbook]
|
|
|
|
|
|
|
|
if (options) {
|
2020-05-03 10:50:24 +00:00
|
|
|
cmd.push(options.replace(/\n/g, " "))
|
2020-05-01 18:11:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (directory) {
|
|
|
|
process.chdir(directory)
|
2020-05-14 18:13:55 +00:00
|
|
|
core.saveState("directory", directory)
|
2020-05-01 18:11:28 +00:00
|
|
|
}
|
|
|
|
|
2020-12-06 16:06:02 +00:00
|
|
|
if (requirements) {
|
2020-12-09 10:57:43 +00:00
|
|
|
const requirementsContent = fs.readFileSync(requirements, 'utf8')
|
|
|
|
const requirementsObject = yaml.parse(requirementsContent)
|
|
|
|
|
|
|
|
if (Array.isArray(requirementsObject)) {
|
|
|
|
await exec.exec("ansible-galaxy", ["install", "-r", requirements])
|
|
|
|
} else {
|
|
|
|
if (requirementsObject.roles)
|
|
|
|
await exec.exec("ansible-galaxy", ["role", "install", "-r", requirements])
|
|
|
|
if (requirementsObject.collections)
|
|
|
|
await exec.exec("ansible-galaxy", ["collection", "install", "-r", requirements])
|
|
|
|
}
|
2020-12-06 16:06:02 +00:00
|
|
|
}
|
|
|
|
|
2020-05-01 18:11:28 +00:00
|
|
|
if (key) {
|
|
|
|
const keyFile = ".ansible_key"
|
|
|
|
fs.writeFileSync(keyFile, key + os.EOL, { mode: 0600 })
|
2020-05-07 09:41:33 +00:00
|
|
|
core.saveState("keyFile", keyFile)
|
2020-05-01 18:11:28 +00:00
|
|
|
cmd.push("--key-file")
|
|
|
|
cmd.push(keyFile)
|
|
|
|
}
|
|
|
|
|
|
|
|
if (inventory) {
|
|
|
|
const inventoryFile = ".ansible_inventory"
|
|
|
|
fs.writeFileSync(inventoryFile, inventory, { mode: 0600 })
|
2020-05-07 09:41:33 +00:00
|
|
|
core.saveState("inventoryFile", inventoryFile)
|
2020-05-01 18:11:28 +00:00
|
|
|
cmd.push("--inventory-file")
|
|
|
|
cmd.push(inventoryFile)
|
|
|
|
}
|
|
|
|
|
|
|
|
if (vaultPassword) {
|
|
|
|
const vaultPasswordFile = ".ansible_vault_password"
|
|
|
|
fs.writeFileSync(vaultPasswordFile, vaultPassword, { mode: 0600 })
|
2020-05-07 09:41:33 +00:00
|
|
|
core.saveState("vaultPasswordFile", vaultPasswordFile)
|
2020-05-01 18:11:28 +00:00
|
|
|
cmd.push("--vault-password-file")
|
|
|
|
cmd.push(vaultPasswordFile)
|
|
|
|
}
|
|
|
|
|
2021-04-04 18:51:37 +00:00
|
|
|
if (knownHosts) {
|
|
|
|
const knownHostsFile = ".ansible_known_hosts"
|
|
|
|
fs.writeFileSync(knownHostsFile, knownHosts, { mode: 0600 })
|
|
|
|
core.saveState("knownHostsFile", knownHostsFile)
|
2021-07-26 18:45:05 +00:00
|
|
|
cmd.push(`--ssh-common-args="-o UserKnownHostsFile=${knownHostsFile}"`)
|
2021-04-04 18:51:37 +00:00
|
|
|
process.env.ANSIBLE_HOST_KEY_CHECKING = "True"
|
|
|
|
} else {
|
|
|
|
process.env.ANSIBLE_HOST_KEY_CHECKING = "False"
|
|
|
|
}
|
|
|
|
|
2021-07-19 15:49:48 +00:00
|
|
|
if (sudo) {
|
2021-07-26 16:32:34 +00:00
|
|
|
cmd.unshift("sudo", "-E", "env", `PATH=${process.env.PATH}`)
|
2021-07-19 15:49:48 +00:00
|
|
|
}
|
|
|
|
|
2021-08-01 15:03:21 +00:00
|
|
|
if (noColor) {
|
|
|
|
process.env.ANSIBLE_NOCOLOR = "True"
|
|
|
|
} else {
|
|
|
|
process.env.ANSIBLE_FORCE_COLOR = "True"
|
|
|
|
}
|
2020-05-01 18:11:28 +00:00
|
|
|
|
2021-07-31 16:13:50 +00:00
|
|
|
let output = ""
|
|
|
|
await exec.exec(cmd.join(' '), null, {
|
|
|
|
listeners: {
|
|
|
|
stdout: function(data) {
|
|
|
|
output += data.toString()
|
|
|
|
},
|
|
|
|
stderr: function(data) {
|
|
|
|
output += data.toString()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
core.setOutput("output", output)
|
2020-05-01 18:11:28 +00:00
|
|
|
} catch (error) {
|
|
|
|
core.setFailed(error.message)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
main()
|