UNPKG

2.42 kBJavaScriptView Raw
1#!/usr/bin/env node
2
3const path = require('path');
4const fs = require('fs');
5const { spawn } = require('child_process');
6const program = require('commander');
7const chalk = require('chalk');
8// internal
9const { version } = require('../package.json');
10// scope
11const basedir = process.cwd();
12const terminal = chalk.cyan('athena:');
13const environments = ['uat', 'uat2', 'wuxi', 'wuxiB'];
14const success = chalk.cyan(`deploy success...`);
15
16function validate() {
17 if (!program.playbook || !program.inventory) {
18 throw new Error(
19 `The playbook, inventory options is required, please verify again.`
20 );
21 }
22
23 if (!environments.includes(program.environment)) {
24 throw new Error(
25 `none supported runtime environment --> ${program.environment}`
26 );
27 }
28
29 const key = `ANSIBLE_SUDO_PASS_${program.environment.toUpperCase()}`;
30 const password = Reflect.get(process.env, key);
31
32 if (!password) {
33 throw new Error(
34 `The environment sudo password is required, please verify again.`
35 );
36 }
37
38 const inventory = path.resolve(basedir, program.inventory);
39 const playbook = path.resolve(basedir, program.playbook);
40
41 if (!fs.existsSync(playbook)) {
42 throw new Error(`The playbook --> ${playbook} not exist`);
43 }
44
45 if (!fs.existsSync(inventory)) {
46 throw new Error(`The inventory --> ${playbook} not exist`);
47 }
48}
49
50function deploy() {
51 const key = `ANSIBLE_SUDO_PASS_${program.environment.toUpperCase()}`;
52 const password = Reflect.get(process.env, key);
53 const ansible = spawn('ansible-playbook', [
54 program.playbook,
55 '-i',
56 program.inventory,
57 '--extra-vars',
58 `ansible_sudo_pass=${password}`,
59 ]);
60
61 ansible.stdout.pipe(process.stdout);
62 ansible.stderr.pipe(process.stderr);
63
64 return new Promise((resolve, reject) => {
65 ansible.on('error', (error) => reject(error));
66 ansible.on('close', () => resolve());
67 });
68}
69
70async function pipeline() {
71 try {
72 await validate();
73 await deploy();
74
75 /* eslint-disable no-console */
76 console.log(`${terminal} ${success}`);
77 /* eslint-enable no-console */
78 } catch (err) {
79 /* eslint-disable no-console */
80 console.error(err.stack);
81 /* eslint-disable no-console */
82 process.exit(1);
83 }
84}
85
86program
87 .version(version)
88 .option('-i, --inventory <inventory>', 'ansible machine inventory')
89 .option('-p, --playbook <playbook>', 'ansible task compose')
90 .parse(process.argv);
91
92pipeline();