24 Commits

Author SHA1 Message Date
Brooks Swinnerton
671974ed60 Add ability to turn off colored output (#32)
* Add Action input to control colored Ansible output

* Update main.js

Co-authored-by: Dawid Dziurla <dawidd0811@gmail.com>
2021-08-01 17:03:21 +02:00
Brooks Swinnerton
00e2fc8809 Capture output of stdout and stderr to Actions (#30)
* Capture output of stdout and stderr to Actions

* Remove type descriptors

Whoops! This isn't typescript

* Remove semicolons

* Rename cmd to args

* Separate command from arguments to exec

* Revert "Rename cmd to args"

This reverts commit 98591e5513.

* Append stdout and stderr to string, then log

* Consolidate stdout and stderr into single output

* Move base command back to cmd variable

* Embed execOptions as parameter to exec
2021-07-31 18:13:50 +02:00
Dawid Dziurla
fbcc2c2bae main: fix 2021-07-26 20:45:05 +02:00
Dawid Dziurla
490a9e7da1 main: put ssh option in quotes 2021-07-26 20:35:00 +02:00
Dawid Dziurla
e959e707d3 main: simplify known hosts logic 2021-07-26 20:24:44 +02:00
Dawid Dziurla
90a22da2b0 README: update 2021-07-26 18:46:29 +02:00
Dawid Dziurla
aefa1cb082 README: update 2021-07-26 18:44:13 +02:00
Dawid Dziurla
ad014132a3 Merge pull request #28 from dawidd6/sudo
main: pass PATH to sudo
2021-07-26 18:37:52 +02:00
Dawid Dziurla
df6f49da3e main: preserve env - sudo 2021-07-26 18:32:34 +02:00
Dawid Dziurla
95ac226ed8 workflows: test sudo 2021-07-26 18:29:42 +02:00
Dawid Dziurla
163a4d1959 main: pass PATH to sudo 2021-07-26 18:25:55 +02:00
obbiondo
03f941b221 Add sudo option for root access (#16)
Co-authored-by: ANDREA BIONDO s291512 <s291512@studenti.polito.it>
Co-authored-by: Dawid Dziurla <dawidd0811@gmail.com>
2021-07-19 17:49:48 +02:00
Dawid Dziurla
f0b38f33e9 Merge pull request #21 from dawidd6/dependabot-add-v2-config-file
Upgrade to GitHub-native Dependabot
2021-04-29 07:40:46 +02:00
dependabot-preview[bot]
75ae627236 Upgrade to GitHub-native Dependabot 2021-04-28 22:30:47 +00:00
Dawid Dziurla
69990b93b4 Merge pull request #20 from dawidd6/dependabot-npm_and_yarn-actions-core-1.2.7
build(deps): bump @actions/core from 1.2.6 to 1.2.7
2021-04-14 09:14:00 +02:00
dependabot-preview[bot]
3c219bf69c build(deps): bump @actions/core from 1.2.6 to 1.2.7
Bumps [@actions/core](https://github.com/actions/toolkit/tree/HEAD/packages/core) from 1.2.6 to 1.2.7.
- [Release notes](https://github.com/actions/toolkit/releases)
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/core/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/core)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-14 04:54:38 +00:00
Dawid Dziurla
212713722b Merge pull request #19 from Apreche/host_key_checking
Add support for SSH Host Key Checking
2021-04-04 23:29:36 +02:00
Scott Rubin
d45b74f42d Add support for SSH Host Key Checking
By default it seems that SSH host key checking has been disabled. This
patch makes it optional. If a variable named known_hosts is passed in,
the key checking will be enabled. The variable should contain the
complete contents of the known_hosts file, which must contain the public
key(s) of the host(s) in the inventory.
2021-04-04 16:51:46 -04:00
Dawid Dziurla
aad578fcdd Merge pull request #18 from dawidd6/dependabot-npm_and_yarn-yaml-1.10.2
build(deps): bump yaml from 1.10.0 to 1.10.2
2021-03-15 10:56:05 +01:00
dependabot-preview[bot]
16c5208cd3 build(deps): bump yaml from 1.10.0 to 1.10.2
Bumps [yaml](https://github.com/eemeli/yaml) from 1.10.0 to 1.10.2.
- [Release notes](https://github.com/eemeli/yaml/releases)
- [Commits](https://github.com/eemeli/yaml/compare/v1.10.0...v1.10.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-15 04:43:20 +00:00
Dawid Dziurla
1b347b1afe put test stuff intooo... test/ dir 2021-02-11 17:28:46 +01:00
Dawid Dziurla
0eefa394aa workflows: always run in test/ dir 2021-02-11 17:28:23 +01:00
Dawid Dziurla
0d7274dc6a workflows: refactor 2021-02-11 17:24:38 +01:00
Dawid Dziurla
9c19e7ec30 test/playbook: install cowsay via apt 2021-02-11 17:08:44 +01:00
13 changed files with 172 additions and 61 deletions

18
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
version: 2
updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: daily
time: "04:00"
pull-request-branch-name:
separator: "-"
open-pull-requests-limit: 10
- package-ecosystem: github-actions
directory: "/"
schedule:
interval: daily
time: "04:00"
pull-request-branch-name:
separator: "-"
open-pull-requests-limit: 10

View File

@@ -7,14 +7,56 @@ on:
pull_request:
jobs:
test-remote:
remote:
runs-on: ubuntu-latest
env:
SSH_PRIVATE_KEY: |
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
SSH_PUBLIC_KEY: |
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDDWY9FVubMDUsZZuT2uT2U3ELfgztmUIeL84CCCUy0V8/p/3mGg0CZKCCiaVOBA3KyTX+RN+FW4i9UNWuhNXqLLEzpvR4E7BIyCVmfrQ89kJfMX5Wy1+sxQflV09u5qFVNbjneDVkCHAD4Q8MEwSnZXPNtmBft0I7RadisiteSd+In6w1gStWb1apjnxrtqiJjh4KBEP/0UYzIahByua4c9Hq0oI3TMihUqX/CPNYfaNFSFFtlt/tXvZU36VbAnJyIftX5KXhhmKhv8mZbQUg9xZySg7X6EtQBDQulJqgLLPu5r4bTCBGh4sfdzfbJBWMAcV6xjNDKaGf8pVkFE990jYePOqP5ydi/J/LS3dHz8rqt261FJhpCip8VoXGha2Xn0H+/n8gQTuzRmzLYHlknhJt1izWUDvhRQaf5eNdWivtNPG8NYFXzeekcUYE6GfeCpItFxnwktvspjkIaFunLfPvLkkNjSViJlpZdNRCYg59fnhyxO7jT7IKeUKNEdoM=
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Setup remote
run: |
echo "${{secrets.SSH_PUBLIC_KEY}}" | sudo tee /etc/ssh/authorized_keys
echo "$SSH_PUBLIC_KEY" | sudo tee /etc/ssh/authorized_keys
sudo tee /etc/ssh/sshd_config <<EOF
PasswordAuthentication no
PubkeyAuthentication yes
@@ -23,12 +65,18 @@ jobs:
Subsystem sftp /usr/lib/openssh/sftp-server
EOF
sudo systemctl restart sshd
- name: Test remote
echo 'SSH_KNOWN_HOSTS<<EOF' >> $GITHUB_ENV
echo $(ssh-keyscan localhost) >> $GITHUB_ENV
echo 'EOF' >> $GITHUB_ENV
- name: With everything
uses: ./
with:
playbook: playbook.yml
key: ${{env.SSH_PRIVATE_KEY}}
known_hosts: ${{env.SSH_KNOWN_HOSTS}}
directory: test
key: ${{secrets.SSH_PRIVATE_KEY}}
vault_password: test
requirements: requirements.yml
inventory: |
[all]
localhost
@@ -39,48 +87,36 @@ jobs:
-e db_name=db_name
-e db_user=db_user
-e db_pass=db_pass
test-local:
local:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Test local
- name: With requirements
uses: ./
with:
playbook: playbook.yml
directory: test
requirements: requirements.yml
options: |
--inventory hosts
--limit local
- name: Test local
options: --inventory hosts
- name: With requirements bundle
uses: ./
with:
playbook: playbook.yml
directory: test
requirements: requirements-bundle.yml
options: |
--inventory hosts
--limit local
test-local-more:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Test local
options: --inventory hosts
- name: With vault password
uses: ./
with:
playbook: playbook.yml
directory: test
vault_password: test
inventory: |
[all]
localhost ansible_connection=local
options: |
-e key1=val1
-e key2=val2
- name: Test local
options: --inventory hosts
- name: With sudo
uses: ./
with:
playbook: playbook.yml
vault_password: test
inventory: |
[all]
localhost ansible_connection=local
directory: test
sudo: true
options: --inventory hosts

View File

@@ -1,6 +1,6 @@
# Run Ansible playbook Github Action
# Run Ansible playbook GitHub Action
An action that executes given Ansible playbook on selected hosts.
An Action that executes given Ansible playbook on selected hosts.
Should work on any OS, if `ansible-playbook` command is available in `PATH`.
@@ -10,17 +10,28 @@ Should work on any OS, if `ansible-playbook` command is available in `PATH`.
- name: Run playbook
uses: dawidd6/action-ansible-playbook@v2
with:
# Required, playbook filepath
playbook: deploy.yml
# Optional, directory where playbooks live
directory: ./
# Optional, SSH private key
key: ${{secrets.SSH_PRIVATE_KEY}}
# Optional, literal inventory file contents
inventory: |
[all]
example.com
[group1]
example.com
# Optional, SSH known hosts file content
known_hosts: .known_hosts
# Optional, encrypted vault password
vault_password: ${{secrets.VAULT_PASSWORD}}
# Optional, galaxy requirements filepath
requirements: galaxy-requirements.yml
# Optional, additional flags to pass to ansible-playbook
options: |
--inventory .hosts
--limit group1
--extra-vars hello=there
--verbose

View File

@@ -22,9 +22,21 @@ inputs:
vault_password:
description: The password used for decrypting vaulted files
required: false
known_hosts:
description: Contents of SSH known_hosts file
required: false
options:
description: Extra options that should be passed to ansible-playbook command
required: false
sudo:
description: Set to "true" if root is required for running your playbook
required: false
no_color:
description: Set to "true" if the Ansible output should not include colors (defaults to "false")
required: false
outputs:
output:
description: The captured output of both stdout and stderr from the Ansible Playbook run
runs:
using: node12
main: main.js

35
main.js
View File

@@ -12,7 +12,10 @@ async function main() {
const key = core.getInput("key")
const inventory = core.getInput("inventory")
const vaultPassword = core.getInput("vault_password")
const knownHosts = core.getInput("known_hosts")
const options = core.getInput("options")
const sudo = core.getInput("sudo")
const noColor = core.getInput("no_color")
let cmd = ["ansible-playbook", playbook]
@@ -63,10 +66,38 @@ async function main() {
cmd.push(vaultPasswordFile)
}
if (knownHosts) {
const knownHostsFile = ".ansible_known_hosts"
fs.writeFileSync(knownHostsFile, knownHosts, { mode: 0600 })
core.saveState("knownHostsFile", knownHostsFile)
cmd.push(`--ssh-common-args="-o UserKnownHostsFile=${knownHostsFile}"`)
process.env.ANSIBLE_HOST_KEY_CHECKING = "True"
} else {
process.env.ANSIBLE_HOST_KEY_CHECKING = "False"
process.env.ANSIBLE_FORCE_COLOR = "True"
}
await exec.exec(cmd.join(" "))
if (sudo) {
cmd.unshift("sudo", "-E", "env", `PATH=${process.env.PATH}`)
}
if (noColor) {
process.env.ANSIBLE_NOCOLOR = "True"
} else {
process.env.ANSIBLE_FORCE_COLOR = "True"
}
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)
} catch (error) {
core.setFailed(error.message)
}

28
package-lock.json generated
View File

@@ -5,15 +5,15 @@
"packages": {
"": {
"dependencies": {
"@actions/core": "^1.2.6",
"@actions/core": "^1.2.7",
"@actions/exec": "^1.0.4",
"yaml": "^1.10.0"
"yaml": "^1.10.2"
}
},
"node_modules/@actions/core": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.6.tgz",
"integrity": "sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA=="
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.7.tgz",
"integrity": "sha512-kzLFD5BgEvq6ubcxdgPbRKGD2Qrgya/5j+wh4LZzqT915I0V3rED+MvjH6NXghbvk1MXknpNNQ3uKjXSEN00Ig=="
},
"node_modules/@actions/exec": {
"version": "1.0.4",
@@ -29,9 +29,9 @@
"integrity": "sha512-J8KuFqVPr3p6U8W93DOXlXW6zFvrQAJANdS+vw0YhusLIq+bszW8zmK2Fh1C2kDPX8FMvwIl1OUcFgvJoXLbAg=="
},
"node_modules/yaml": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
"integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
"engines": {
"node": ">= 6"
}
@@ -39,9 +39,9 @@
},
"dependencies": {
"@actions/core": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.6.tgz",
"integrity": "sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA=="
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.7.tgz",
"integrity": "sha512-kzLFD5BgEvq6ubcxdgPbRKGD2Qrgya/5j+wh4LZzqT915I0V3rED+MvjH6NXghbvk1MXknpNNQ3uKjXSEN00Ig=="
},
"@actions/exec": {
"version": "1.0.4",
@@ -57,9 +57,9 @@
"integrity": "sha512-J8KuFqVPr3p6U8W93DOXlXW6zFvrQAJANdS+vw0YhusLIq+bszW8zmK2Fh1C2kDPX8FMvwIl1OUcFgvJoXLbAg=="
},
"yaml": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
"integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg=="
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
}
}
}

View File

@@ -2,8 +2,8 @@
"name": "action-ansible-playbook",
"main": "main.js",
"dependencies": {
"@actions/core": "^1.2.6",
"@actions/core": "^1.2.7",
"@actions/exec": "^1.0.4",
"yaml": "^1.10.0"
"yaml": "^1.10.2"
}
}

View File

@@ -1,7 +0,0 @@
- name: Test Action
hosts: all
tasks:
- name: Copy action.yml
copy:
src: action.yml
dest: /tmp/action.yml

View File

@@ -14,6 +14,7 @@ async function main() {
const keyFile = core.getState("keyFile")
const inventoryFile = core.getState("inventoryFile")
const vaultPasswordFile = core.getState("vaultPasswordFile")
const knownHostsFile = core.getState("knownHostsFile")
if (directory)
process.chdir(directory)
@@ -26,6 +27,10 @@ async function main() {
if (vaultPasswordFile)
rm(vaultPasswordFile)
if (knownHostsFile)
rm(knownHostsFile)
} catch (error) {
core.setFailed(error.message)
}

View File

View File

@@ -1,7 +1,12 @@
- name: Test Action
hosts: all
tasks:
- name: Copy action.yml
- name: Copy file
copy:
src: ../action.yml
dest: /tmp/action.yml
src: requirements.yml
dest: /tmp/requirements.yml
- name: Install cowsay
become: yes
apt:
name: cowsay
update_cache: yes