shell-output-to-file
Example:
# Create a file with the username of the executing user as content. - shell-output-to-file: command: echo $USER path: /tmp/username remote_execute: true owner: freckles mode: '0700'
Description
Execute a shell command and write the output to a file.
By default, this executes a shell command on the local (controller) host, and writes the file to the remote one. This can be mixed-and-matched in any possible combination though.
This does not (yet) create either the user to execute the command as (execute_as) nor the owner of the result file
(owner, group). Make sure to create those manually if necessary. It also does not create the parent directory
of the target file.
Resources
Variables
| Name | Type | Default | Description |
|---|---|---|---|
|
string | -- | The command to execute. Required |
|
string | -- | The path to the output file. Required |
|
string | -- | Change into this directory before running the shell command. |
|
string | -- | Needs to exist on the host that is used to execute. |
|
string | -- | The group of the target file. |
|
string | -- | The mode of the target file. |
|
string | -- | The owner of the target file. |
|
boolean | False | Whether to execute the command on the remote host. |
|
boolean | True | Whether to write the output file to the remote host, or locally. |
|
string | -- | Set the stdin of the command directly to the specified value. |
Examples
Example 1
Create a file with the username of the executing user as content.
Code
- shell-output-to-file: command: echo $USER path: /tmp/username remote_execute: true owner: freckles mode: '0700'
Description
Run a command that outputs the username of the current user, and write the result into the file /tmp/username. Ensure the file mode is '0700' and its user 'freckles'.
Code
doc: short_help: Execute a shell command, write the output to file. help: | Execute a shell command and write the output to a file. By default, this executes a shell command on the local (controller) host, and writes the file to the remote one. This can be mixed-and-matched in any possible combination though. This does not (yet) create either the user to execute the command as (``execute_as``) nor the owner of the result file (``owner``, ``group``). Make sure to create those manually if necessary. It also does not create the parent directory of the target file. references: Ansible 'shell' module documentation: https://docs.ansible.com/ansible/latest/modules/shell_module.html Ansible 'copy' module documentation: https://docs.ansible.com/ansible/latest/modules/copy_module.html examples: - title: Create a file with the username of the executing user as content. desc: | Run a command that outputs the username of the current user, and write the result into the file /tmp/username. Ensure the file mode is '0700' and its user 'freckles'. vars: command: echo $USER path: /tmp/username remote_execute: true owner: freckles mode: '0700' args: remote_execute: doc: short_help: Whether to execute the command on the remote host. type: boolean default: false required: false cli: param_decls: - --remote-execute/--no-remote-execute execute_as: doc: short_help: The user to execute the command as. help: | Needs to exist on the host that is used to execute. type: string required: false owner: doc: short_help: The owner of the target file. type: string required: false group: doc: short_help: The group of the target file. type: string required: false mode: doc: short_help: The mode of the target file. type: string required: false remote_write: doc: short_help: Whether to write the output file to the remote host, or locally. type: boolean default: true cli: param_decls: - --remote-write/--no-remote-write command: doc: short_help: The command to execute. type: string required: true chdir: doc: short_help: Change into this directory before running the shell command. type: string required: false stdin: doc: short_help: Set the stdin of the command directly to the specified value. type: string required: false path: doc: short_help: The path to the output file. type: string required: true frecklets: - frecklet: name: shell type: ansible-module desc: short: "execute command (in shell): '{{:: command ::}}'" long: | On {%:: if not remote_execute ::%}controller machine{%:: else ::%}target machine{%:: endif ::%}, {%:: if chdir ::%}change into directory {{:: chdir ::}} and {%:: endif ::%}run command{%:: if execute_as ::%} (as user {{:: execute_as ::}}){%:: endif ::%}: {{:: command ::}} Store output into internal variable '__command_output__'. properties: elevated: '{{:: execute_as | true_if_not_empty ::}}' idempotent: false references: "'shell' Ansible module": https://docs.ansible.com/ansible/latest/modules/shell_module.html task: delegate_to: "{{:: 'localhost' if not remote_execute else None ::}}" register: __command_output__ become: '{{:: execute_as | true_if_not_empty ::}}' become_user: '{{:: execute_as ::}}' vars: free_form: '{{:: command ::}}' chdir: '{{:: chdir ::}}' stdin: '{{:: stdin ::}}' - frecklet: name: copy type: ansible-module properties: idempotent: true internet: false elevated: '{{:: owner | true_if_not_empty ::}}' desc: references: "'copy' Ansible module": https://docs.ansible.com/ansible/latest/modules/copy_module.html short: 'write command output to: {{:: path ::}}' long: | Retrieve output of previous command from internal variable __command_output__ and create a file '{{:: path ::}}' with the 'stdout' property of the output as content of the file. {%:: if group ::%}Set the group of the file to be '{{:: group ::}}'. {%:: endif ::%}{%:: if owner ::%}Set the owner of the file to be '{{:: owner ::}}'.{%:: endif ::%} {%:: if mode ::%}Set the mode of the file to be: '{{:: mode ::}}'.{%:: endif ::%} task: delegate_to: "{{:: 'localhost' if not remote_write else None ::}}" become: '{{:: owner | true_if_not_empty ::}}' vars: content: '{{ __command_output__.stdout }}' dest: '{{:: path ::}}' mode: '{{:: mode ::}}' owner: '{{:: owner ::}}' group: '{{:: group ::}}'
frecklecute shell-output-to-file --help Usage: frecklecute shell-output-to-file [OPTIONS] Execute a shell command and write the output to a file. By default, this executes a shell command on the local (controller) host, and writes the file to the remote one. This can be mixed-and-matched in any possible combination though. This does not (yet) create either the user to execute the command as (``execute_as``) nor the owner of the result file (``owner``, ``group``). Make sure to create those manually if necessary. It also does not create the parent directory of the target file. Options: --command COMMAND The command to execute. [required] --path PATH The path to the output file. [required] --chdir CHDIR Change into this directory before running the shell command. --execute-as EXECUTE_AS The user to execute the command as. --group GROUP The group of the target file. --mode MODE The mode of the target file. --owner OWNER The owner of the target file. --remote-execute / --no-remote-execute Whether to execute the command on the remote host. --remote-write / --no-remote-write Whether to write the output file to the remote host, or locally. --stdin STDIN Set the stdin of the command directly to the specified value. --help Show this message and exit.
# -*- coding: utf-8 -*- # # module path: pycklets.shell_output_to_file.ShellOutputToFile # from dataclasses import dataclass from pyckles import AutoPycklet from typing import * # noqa @dataclass class ShellOutputToFile(AutoPycklet): """Execute a shell command and write the output to a file. By default, this executes a shell command on the local (controller) host, and writes the file to the remote one. This can be mixed-and-matched in any possible combination though. This does not (yet) create either the user to execute the command as (``execute_as``) nor the owner of the result file (``owner``, ``group``). Make sure to create those manually if necessary. It also does not create the parent directory of the target file. Args: chdir: Change into this directory before running the shell command. command: The command to execute. execute_as: The user to execute the command as. group: The group of the target file. mode: The mode of the target file. owner: The owner of the target file. path: The path to the output file. remote_execute: Whether to execute the command on the remote host. remote_write: Whether to write the output file to the remote host, or locally. stdin: Set the stdin of the command directly to the specified value. """ FRECKLET_ID = "shell-output-to-file" chdir: str = None command: str = None execute_as: str = None group: str = None mode: str = None owner: str = None path: str = None remote_execute: bool = None remote_write: bool = None stdin: str = None def __post_init__(self): super(ShellOutputToFile, self).__init__(var_names=["chdir", "command", "execute_as", "group", "mode", "owner", "path", "remote_execute", "remote_write", "stdin"]) frecklet_class = ShellOutputToFile
# -*- coding: utf-8 -*- # # module path: pycklets.shell_output_to_file.ShellOutputToFile # from pyckles import AutoPycklet class ShellOutputToFile(AutoPycklet): """Execute a shell command and write the output to a file. By default, this executes a shell command on the local (controller) host, and writes the file to the remote one. This can be mixed-and-matched in any possible combination though. This does not (yet) create either the user to execute the command as (``execute_as``) nor the owner of the result file (``owner``, ``group``). Make sure to create those manually if necessary. It also does not create the parent directory of the target file. Args: chdir: Change into this directory before running the shell command. command: The command to execute. execute_as: The user to execute the command as. group: The group of the target file. mode: The mode of the target file. owner: The owner of the target file. path: The path to the output file. remote_execute: Whether to execute the command on the remote host. remote_write: Whether to write the output file to the remote host, or locally. stdin: Set the stdin of the command directly to the specified value. """ FRECKLET_ID = "shell-output-to-file" def __init__(self, chdir=None, command=None, execute_as=None, group=None, mode=None, owner=None, path=None, remote_execute=None, remote_write=True, stdin=None): super(ShellOutputToFile, self).__init__(var_names=["chdir", "command", "execute_as", "group", "mode", "owner", "path", "remote_execute", "remote_write", "stdin"]) self._chdir = chdir self._command = command self._execute_as = execute_as self._group = group self._mode = mode self._owner = owner self._path = path self._remote_execute = remote_execute self._remote_write = remote_write self._stdin = stdin @property def chdir(self): return self._chdir @chdir.setter def chdir(self, chdir): self._chdir = chdir @property def command(self): return self._command @command.setter def command(self, command): self._command = command @property def execute_as(self): return self._execute_as @execute_as.setter def execute_as(self, execute_as): self._execute_as = execute_as @property def group(self): return self._group @group.setter def group(self, group): self._group = group @property def mode(self): return self._mode @mode.setter def mode(self, mode): self._mode = mode @property def owner(self): return self._owner @owner.setter def owner(self, owner): self._owner = owner @property def path(self): return self._path @path.setter def path(self, path): self._path = path @property def remote_execute(self): return self._remote_execute @remote_execute.setter def remote_execute(self, remote_execute): self._remote_execute = remote_execute @property def remote_write(self): return self._remote_write @remote_write.setter def remote_write(self, remote_write): self._remote_write = remote_write @property def stdin(self): return self._stdin @stdin.setter def stdin(self, stdin): self._stdin = stdin frecklet_class = ShellOutputToFile