1 | #!/usr/bin/env node
|
2 |
|
3 | const path = require('path');
|
4 | const fs = require('fs');
|
5 | const { spawn } = require('child_process');
|
6 | const program = require('commander');
|
7 | const chalk = require('chalk');
|
8 |
|
9 | const { version } = require('../package.json');
|
10 |
|
11 | const basedir = process.cwd();
|
12 | const terminal = chalk.cyan('athena:');
|
13 | const environments = ['uat', 'uat2', 'wuxi', 'wuxiB'];
|
14 | const success = chalk.cyan(`deploy success...`);
|
15 |
|
16 | function 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 |
|
50 | function 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 |
|
70 | async function pipeline() {
|
71 | try {
|
72 | await validate();
|
73 | await deploy();
|
74 |
|
75 |
|
76 | console.log(`${terminal} ${success}`);
|
77 |
|
78 | } catch (err) {
|
79 |
|
80 | console.error(err.stack);
|
81 |
|
82 | process.exit(1);
|
83 | }
|
84 | }
|
85 |
|
86 | program
|
87 | .version(version)
|
88 | .option('-i, --inventory <inventory>', 'ansible machine inventory')
|
89 | .option('-p, --playbook <playbook>', 'ansible task compose')
|
90 | .parse(process.argv);
|
91 |
|
92 | pipeline();
|