mirror of https://github.com/ansible/ansible.git
proposals were moved to ansible/proposals
parent
04610106a3
commit
0c92ec5e8f
@ -1,487 +0,0 @@
|
|||||||
# Docker_Container Module Proposal
|
|
||||||
|
|
||||||
## Purpose and Scope:
|
|
||||||
|
|
||||||
The purpose of docker_container is to manage the lifecycle of a container. The module will provide a mechanism for
|
|
||||||
moving the container between absent, present, stopped and started states. It will focus purely on managing container
|
|
||||||
state. The intention of the narrow focus is to make understanding and using the module clear and keep maintenance
|
|
||||||
and testing as easy as possible.
|
|
||||||
|
|
||||||
Docker_container will manage a container using docker-py to communicate with either a local or remote API. It will
|
|
||||||
support API versions >= 1.14. API connection details will be handled externally in a shared utility module similar to
|
|
||||||
how other cloud modules operate.
|
|
||||||
|
|
||||||
The container world is moving rapidly, so the goal is to create a suite of docker modules that keep pace, with docker_container
|
|
||||||
leading the way. If this project is successful, it will naturally deprecate the existing docker module.
|
|
||||||
|
|
||||||
## Parameters:
|
|
||||||
|
|
||||||
Docker_container will accept the parameters listed below. An attempt has been made to represent all the options available to
|
|
||||||
docker's create, kill, pause, run, rm, start, stop and update commands.
|
|
||||||
|
|
||||||
Parameters for connecting to the API are not listed here. They are included in the common utility module mentioned above.
|
|
||||||
|
|
||||||
```
|
|
||||||
blkio_weight:
|
|
||||||
description:
|
|
||||||
- Block IO (relative weight), between 10 and 1000.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
capabilities:
|
|
||||||
description:
|
|
||||||
- List of capabilities to add to the container.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
command:
|
|
||||||
description:
|
|
||||||
- Command or list of commands to execute in the container when it starts.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
cpu_period:
|
|
||||||
description:
|
|
||||||
- Limit CPU CFS (Completely Fair Scheduler) period
|
|
||||||
default: 0
|
|
||||||
|
|
||||||
cpu_quota:
|
|
||||||
description:
|
|
||||||
- Limit CPU CFS (Completely Fair Scheduler) quota
|
|
||||||
default: 0
|
|
||||||
|
|
||||||
cpuset_cpus:
|
|
||||||
description:
|
|
||||||
- CPUs in which to allow execution C(1,3) or C(1-3).
|
|
||||||
default: null
|
|
||||||
|
|
||||||
cpuset_mems:
|
|
||||||
description:
|
|
||||||
- Memory nodes (MEMs) in which to allow execution C(0-3) or C(0,1)
|
|
||||||
default: null
|
|
||||||
|
|
||||||
cpu_shares:
|
|
||||||
description:
|
|
||||||
- CPU shares (relative weight).
|
|
||||||
default: null
|
|
||||||
|
|
||||||
detach:
|
|
||||||
description:
|
|
||||||
- Enable detached mode to leave the container running in background.
|
|
||||||
If disabled, fail unless the process exits cleanly.
|
|
||||||
default: true
|
|
||||||
|
|
||||||
devices:
|
|
||||||
description:
|
|
||||||
- List of host device bindings to add to the container. Each binding is a mapping expressed
|
|
||||||
in the format: <path_on_host>:<path_in_container>:<cgroup_permissions>
|
|
||||||
default: null
|
|
||||||
|
|
||||||
dns_servers:
|
|
||||||
description:
|
|
||||||
- List of custom DNS servers.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
dns_search_domains:
|
|
||||||
description:
|
|
||||||
- List of custom DNS search domains.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
env:
|
|
||||||
description:
|
|
||||||
- Dictionary of key,value pairs.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
entrypoint:
|
|
||||||
description:
|
|
||||||
- String or list of commands that overwrite the default ENTRYPOINT of the image.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
etc_hosts:
|
|
||||||
description:
|
|
||||||
- Dict of host-to-IP mappings, where each host name is key in the dictionary. Hostname will be added to the
|
|
||||||
container's /etc/hosts file.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
exposed_ports:
|
|
||||||
description:
|
|
||||||
- List of additional container ports to expose for port mappings or links.
|
|
||||||
If the port is already exposed using EXPOSE in a Dockerfile, it does not
|
|
||||||
need to be exposed again.
|
|
||||||
default: null
|
|
||||||
aliases:
|
|
||||||
- exposed
|
|
||||||
|
|
||||||
force_kill:
|
|
||||||
description:
|
|
||||||
- Use with absent, present, started and stopped states to use the kill command rather
|
|
||||||
than the stop command.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
groups:
|
|
||||||
description:
|
|
||||||
- List of additional group names and/or IDs that the container process will run as.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
hostname:
|
|
||||||
description:
|
|
||||||
- Container hostname.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
image:
|
|
||||||
description:
|
|
||||||
- Container image used to create and match containers.
|
|
||||||
required: true
|
|
||||||
|
|
||||||
interactive:
|
|
||||||
description:
|
|
||||||
- Keep stdin open after a container is launched, even if not attached.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
ipc_mode:
|
|
||||||
description:
|
|
||||||
- Set the IPC mode for the container. Can be one of
|
|
||||||
'container:<name|id>' to reuse another container's IPC namespace
|
|
||||||
or 'host' to use the host's IPC namespace within the container.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
keep_volumes:
|
|
||||||
description:
|
|
||||||
- Retain volumes associated with a removed container.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
kill_signal:
|
|
||||||
description:
|
|
||||||
- Override default signal used to kill a running container.
|
|
||||||
default null:
|
|
||||||
|
|
||||||
kernel_memory:
|
|
||||||
description:
|
|
||||||
- Kernel memory limit (format: <number>[<unit>]). Number is a positive integer.
|
|
||||||
Unit can be one of b, k, m, or g. Minimum is 4M.
|
|
||||||
default: 0
|
|
||||||
|
|
||||||
labels:
|
|
||||||
description:
|
|
||||||
- Dictionary of key value pairs.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
links:
|
|
||||||
description:
|
|
||||||
- List of name aliases for linked containers in the format C(container_name:alias)
|
|
||||||
default: null
|
|
||||||
|
|
||||||
log_driver:
|
|
||||||
description:
|
|
||||||
- Specify the logging driver.
|
|
||||||
choices:
|
|
||||||
- json-file
|
|
||||||
- syslog
|
|
||||||
- journald
|
|
||||||
- gelf
|
|
||||||
- fluentd
|
|
||||||
- awslogs
|
|
||||||
- splunk
|
|
||||||
defult: json-file
|
|
||||||
|
|
||||||
log_options:
|
|
||||||
description:
|
|
||||||
- Dictionary of options specific to the chosen log_driver. See https://docs.docker.com/engine/admin/logging/overview/
|
|
||||||
for details.
|
|
||||||
required: false
|
|
||||||
default: null
|
|
||||||
|
|
||||||
mac_address:
|
|
||||||
description:
|
|
||||||
- Container MAC address (e.g. 92:d0:c6:0a:29:33)
|
|
||||||
default: null
|
|
||||||
|
|
||||||
memory:
|
|
||||||
description:
|
|
||||||
- Memory limit (format: <number>[<unit>]). Number is a positive integer.
|
|
||||||
Unit can be one of b, k, m, or g
|
|
||||||
default: 0
|
|
||||||
|
|
||||||
memory_reservation:
|
|
||||||
description:
|
|
||||||
- Memory soft limit (format: <number>[<unit>]). Number is a positive integer.
|
|
||||||
Unit can be one of b, k, m, or g
|
|
||||||
default: 0
|
|
||||||
|
|
||||||
memory_swap:
|
|
||||||
description:
|
|
||||||
- Total memory limit (memory + swap, format:<number>[<unit>]).
|
|
||||||
Number is a positive integer. Unit can be one of b, k, m, or g.
|
|
||||||
default: 0
|
|
||||||
|
|
||||||
memory_swappiness:
|
|
||||||
description:
|
|
||||||
- Tune a container's memory swappiness behavior. Accepts an integer between 0 and 100.
|
|
||||||
default: 0
|
|
||||||
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- Assign a name to a new container or match an existing container.
|
|
||||||
- When identifying an existing container name may be a name or a long or short container ID.
|
|
||||||
required: true
|
|
||||||
|
|
||||||
network_mode:
|
|
||||||
description:
|
|
||||||
- Connect the container to a network.
|
|
||||||
choices:
|
|
||||||
- bridge
|
|
||||||
- container:<name|id>
|
|
||||||
- host
|
|
||||||
- none
|
|
||||||
default: null
|
|
||||||
|
|
||||||
networks:
|
|
||||||
description:
|
|
||||||
- Dictionary of networks to which the container will be connected. The dictionary must have a name key (the name of the network).
|
|
||||||
Optional keys include: aliases (a list of container aliases), and links (a list of links in the format C(container_name:alias)).
|
|
||||||
default: null
|
|
||||||
|
|
||||||
oom_killer:
|
|
||||||
desription:
|
|
||||||
- Whether or not to disable OOM Killer for the container.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
paused:
|
|
||||||
description:
|
|
||||||
- Use with the started state to pause running processes inside the container.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
pid_mode:
|
|
||||||
description:
|
|
||||||
- Set the PID namespace mode for the container. Currenly only supports 'host'.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
privileged:
|
|
||||||
description:
|
|
||||||
- Give extended privileges to the container.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
published_ports:
|
|
||||||
description:
|
|
||||||
- List of ports to publish from the container to the host.
|
|
||||||
- Use docker CLI syntax: C(8000), C(9000:8000), or C(0.0.0.0:9000:8000), where 8000 is a
|
|
||||||
container port, 9000 is a host port, and 0.0.0.0 is a host interface.
|
|
||||||
- Container ports must be exposed either in the Dockerfile or via the C(expose) option.
|
|
||||||
- A value of ALL will publish all exposed container ports to random host ports, ignoring
|
|
||||||
any other mappings.
|
|
||||||
aliases:
|
|
||||||
- ports
|
|
||||||
|
|
||||||
read_only:
|
|
||||||
description:
|
|
||||||
- Mount the container's root file system as read-only.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
recreate:
|
|
||||||
description:
|
|
||||||
- Use with present and started states to force the re-creation of an existing container.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
restart:
|
|
||||||
description:
|
|
||||||
- Use with started state to force a matching container to be stopped and restarted.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
restart_policy:
|
|
||||||
description:
|
|
||||||
- Container restart policy.
|
|
||||||
choices:
|
|
||||||
- on-failure
|
|
||||||
- always
|
|
||||||
default: on-failure
|
|
||||||
|
|
||||||
restart_retries:
|
|
||||||
description:
|
|
||||||
- Use with restart policy to control maximum number of restart attempts.
|
|
||||||
default: 0
|
|
||||||
|
|
||||||
shm_size:
|
|
||||||
description:
|
|
||||||
- Size of `/dev/shm`. The format is `<number><unit>`. `number` must be greater than `0`.
|
|
||||||
Unit is optional and can be `b` (bytes), `k` (kilobytes), `m` (megabytes), or `g` (gigabytes).
|
|
||||||
- Ommitting the unit defaults to bytes. If you omit the size entirely, the system uses `64m`.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
security_opts:
|
|
||||||
description:
|
|
||||||
- List of security options in the form of C("label:user:User")
|
|
||||||
default: null
|
|
||||||
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- "absent" - A container matching the specified name will be stopped and removed. Use force_kill to kill the container
|
|
||||||
rather than stopping it. Use keep_volumes to retain volumes associated with the removed container.
|
|
||||||
|
|
||||||
- "present" - Asserts the existence of a container matching the name and any provided configuration parameters. If no
|
|
||||||
container matches the name, a container will be created. If a container matches the name but the provided configuration
|
|
||||||
does not match, the container will be updated, if it can be. If it cannot be updated, it will be removed and re-created
|
|
||||||
with the requested config. Use recreate to force the re-creation of the matching container. Use force_kill to kill the
|
|
||||||
container rather than stopping it. Use keep_volumes to retain volumes associated with a removed container.
|
|
||||||
|
|
||||||
- "started" - Asserts there is a running container matching the name and any provided configuration. If no container
|
|
||||||
matches the name, a container will be created and started. If a container matching the name is found but the
|
|
||||||
configuration does not match, the container will be updated, if it can be. If it cannot be updated, it will be removed
|
|
||||||
and a new container will be created with the requested configuration and started. Use recreate to always re-create a
|
|
||||||
matching container, even if it is running. Use restart to force a matching container to be stopped and restarted. Use
|
|
||||||
force_kill to kill a container rather than stopping it. Use keep_volumes to retain volumes associated with a removed
|
|
||||||
container.
|
|
||||||
|
|
||||||
- "stopped" - a container matching the specified name will be stopped. Use force_kill to kill a container rather than
|
|
||||||
stopping it.
|
|
||||||
|
|
||||||
required: false
|
|
||||||
default: started
|
|
||||||
choices:
|
|
||||||
- absent
|
|
||||||
- present
|
|
||||||
- stopped
|
|
||||||
- started
|
|
||||||
|
|
||||||
stop_signal:
|
|
||||||
description:
|
|
||||||
- Override default signal used to stop the container.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
stop_timeout:
|
|
||||||
description:
|
|
||||||
- Number of seconds to wait for the container to stop before sending SIGKILL.
|
|
||||||
required: false
|
|
||||||
|
|
||||||
trust_image_content:
|
|
||||||
description:
|
|
||||||
- If true, skip image verification.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
tty:
|
|
||||||
description:
|
|
||||||
- Allocate a psuedo-TTY.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
ulimits:
|
|
||||||
description:
|
|
||||||
- List of ulimit options. A ulimit is specified as C(nofile:262144:262144)
|
|
||||||
default: null
|
|
||||||
|
|
||||||
user:
|
|
||||||
description
|
|
||||||
- Sets the username or UID used and optionally the groupname or GID for the specified command.
|
|
||||||
- Can be [ user | user:group | uid | uid:gid | user:gid | uid:group ]
|
|
||||||
default: null
|
|
||||||
|
|
||||||
uts:
|
|
||||||
description:
|
|
||||||
- Set the UTS namespace mode for the container.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
description:
|
|
||||||
- List of volumes to mount within the container.
|
|
||||||
- 'Use docker CLI-style syntax: C(/host:/container[:mode])'
|
|
||||||
- You can specify a read mode for the mount with either C(ro) or C(rw).
|
|
||||||
- SELinux hosts can additionally use C(z) or C(Z) to use a shared or
|
|
||||||
private label for the volume.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
volume_driver:
|
|
||||||
description:
|
|
||||||
- The container's volume driver.
|
|
||||||
default: none
|
|
||||||
|
|
||||||
volumes_from:
|
|
||||||
description:
|
|
||||||
- List of container names or Ids to get volumes from.
|
|
||||||
default: null
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Examples:
|
|
||||||
|
|
||||||
```
|
|
||||||
- name: Create a data container
|
|
||||||
docker_container:
|
|
||||||
name: mydata
|
|
||||||
image: busybox
|
|
||||||
volumes:
|
|
||||||
- /data
|
|
||||||
|
|
||||||
- name: Re-create a redis container
|
|
||||||
docker_container:
|
|
||||||
name: myredis
|
|
||||||
image: redis
|
|
||||||
command: redis-server --appendonly yes
|
|
||||||
state: present
|
|
||||||
recreate: yes
|
|
||||||
expose:
|
|
||||||
- 6379
|
|
||||||
volumes_from:
|
|
||||||
- mydata
|
|
||||||
|
|
||||||
- name: Restart a container
|
|
||||||
docker_container:
|
|
||||||
name: myapplication
|
|
||||||
image: someuser/appimage
|
|
||||||
state: started
|
|
||||||
restart: yes
|
|
||||||
links:
|
|
||||||
- "myredis:aliasedredis"
|
|
||||||
devices:
|
|
||||||
- "/dev/sda:/dev/xvda:rwm"
|
|
||||||
ports:
|
|
||||||
- "8080:9000"
|
|
||||||
- "127.0.0.1:8081:9001/udp"
|
|
||||||
env:
|
|
||||||
SECRET_KEY: ssssh
|
|
||||||
|
|
||||||
|
|
||||||
- name: Container present
|
|
||||||
docker_container:
|
|
||||||
name: mycontainer
|
|
||||||
state: present
|
|
||||||
recreate: yes
|
|
||||||
forcekill: yes
|
|
||||||
image: someplace/image
|
|
||||||
command: echo "I'm here!"
|
|
||||||
|
|
||||||
|
|
||||||
- name: Start 4 load-balanced containers
|
|
||||||
docker_container:
|
|
||||||
name: "container{{ item }}"
|
|
||||||
state: started
|
|
||||||
recreate: yes
|
|
||||||
image: someuser/anotherappimage
|
|
||||||
command: sleep 1d
|
|
||||||
with_sequence: count=4
|
|
||||||
|
|
||||||
-name: remove container
|
|
||||||
docker_container:
|
|
||||||
name: ohno
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
- name: Syslogging output
|
|
||||||
docker_container:
|
|
||||||
name: myservice
|
|
||||||
state: started
|
|
||||||
log_driver: syslog
|
|
||||||
log_opt:
|
|
||||||
syslog-address: tcp://my-syslog-server:514
|
|
||||||
syslog-facility: daemon
|
|
||||||
syslog-tag: myservice
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
## Returns:
|
|
||||||
|
|
||||||
The JSON object returned by the module will include a *results* object providing `docker inspect` output for the affected container.
|
|
||||||
|
|
||||||
```
|
|
||||||
{
|
|
||||||
changed: True,
|
|
||||||
failed: False,
|
|
||||||
rc: 0
|
|
||||||
results: {
|
|
||||||
< the results of `docker inspect` >
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
@ -1,159 +0,0 @@
|
|||||||
# Docker_Files Modules Proposal
|
|
||||||
|
|
||||||
## Purpose and Scope
|
|
||||||
|
|
||||||
The purpose of docker_files is to provide for retrieving a file or folder from a container's file system,
|
|
||||||
inserting a file or folder into a container, exporting a container's entire filesystem as a tar archive, or
|
|
||||||
retrieving a list of changed files from a container's file system.
|
|
||||||
|
|
||||||
Docker_files will manage a container using docker-py to communicate with either a local or remote API. It will
|
|
||||||
support API versions >= 1.14. API connection details will be handled externally in a shared utility module similar to
|
|
||||||
how other cloud modules operate.
|
|
||||||
|
|
||||||
## Parameters
|
|
||||||
|
|
||||||
Docker_files accepts the parameters listed below. API connection parameters will be part of a shared utility module
|
|
||||||
as mentioned above.
|
|
||||||
|
|
||||||
```
|
|
||||||
diff:
|
|
||||||
description:
|
|
||||||
- Provide a list of container names or IDs. For each container a list of changed files and directories found on the
|
|
||||||
container's file system will be returned. Diff is mutually exclusive from all other options except event_type.
|
|
||||||
Use event_type to choose which events to include in the output.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
export:
|
|
||||||
description:
|
|
||||||
- Provide a container name or ID. The container's file system will be exported to a tar archive. Use dest
|
|
||||||
to provide a path for the archive on the local file system. If the output file already exists, it will not be
|
|
||||||
overwritten. Use the force option to overwrite an existing archive.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
dest:
|
|
||||||
description:
|
|
||||||
- Destination path of copied files. If the destination is a container file system, precede the path with a
|
|
||||||
container name or ID + ':'. For example, C(mycontainer:/path/to/file.txt). If the destination path does not
|
|
||||||
exist, it will be created. If the destination path exists on a the local filesystem, it will not be overwritten.
|
|
||||||
Use the force option to overwrite existing files on the local filesystem.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
force:
|
|
||||||
description:
|
|
||||||
- Overwrite existing files on the local filesystem.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
follow_link:
|
|
||||||
description:
|
|
||||||
- Follow symbolic links in the src path. If src is local and file is a symbolic link, the symbolic link, not the
|
|
||||||
target is copied by default. To copy the link target and not the link, set follow_link to true.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
event_type:
|
|
||||||
description:
|
|
||||||
- Select the specific event type to list in the diff output.
|
|
||||||
choices:
|
|
||||||
- all
|
|
||||||
- add
|
|
||||||
- delete
|
|
||||||
- change
|
|
||||||
default: all
|
|
||||||
|
|
||||||
src:
|
|
||||||
description:
|
|
||||||
- The source path of file(s) to be copied. If source files are found on the container's file system, precede the
|
|
||||||
path with the container name or ID + ':'. For example, C(mycontainer:/path/to/files).
|
|
||||||
default: null
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
```
|
|
||||||
- name: Copy files from the local file system to a container's file system
|
|
||||||
docker_files:
|
|
||||||
src: /tmp/rpm
|
|
||||||
dest: mycontainer:/tmp
|
|
||||||
follow_links: yes
|
|
||||||
|
|
||||||
- name: Copy files from the container to the local filesystem and overwrite existing files
|
|
||||||
docker_files:
|
|
||||||
src: container1:/var/lib/data
|
|
||||||
dest: /tmp/container1/data
|
|
||||||
force: yes
|
|
||||||
|
|
||||||
- name: Export container filesystem
|
|
||||||
docker_file:
|
|
||||||
export: container1
|
|
||||||
dest: /tmp/conainer1.tar
|
|
||||||
force: yes
|
|
||||||
|
|
||||||
- name: List all differences for multiple containers.
|
|
||||||
docker_files:
|
|
||||||
diff:
|
|
||||||
- mycontainer1
|
|
||||||
- mycontainer2
|
|
||||||
|
|
||||||
- name: Included changed files only in diff output
|
|
||||||
docker_files:
|
|
||||||
diff:
|
|
||||||
- mycontainer1
|
|
||||||
event_type: change
|
|
||||||
```
|
|
||||||
|
|
||||||
## Returns
|
|
||||||
|
|
||||||
Returned from diff:
|
|
||||||
|
|
||||||
```
|
|
||||||
{
|
|
||||||
changed: false,
|
|
||||||
failed: false,
|
|
||||||
rc: 0,
|
|
||||||
results: {
|
|
||||||
mycontainer1: [
|
|
||||||
{ state: 'C', path: '/dev' },
|
|
||||||
{ state: 'A', path: '/dev/kmsg' },
|
|
||||||
{ state: 'C', path: '/etc' },
|
|
||||||
{ state: 'A', path: '/etc/mtab' }
|
|
||||||
],
|
|
||||||
mycontainer2: [
|
|
||||||
{ state: 'C', path: '/foo' },
|
|
||||||
{ state: 'A', path: '/foo/bar.txt' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Returned when copying files:
|
|
||||||
|
|
||||||
```
|
|
||||||
{
|
|
||||||
changed: true,
|
|
||||||
failed: false,
|
|
||||||
rc: 0,
|
|
||||||
results: {
|
|
||||||
src: /tmp/rpms,
|
|
||||||
dest: mycontainer:/tmp
|
|
||||||
files_copied: [
|
|
||||||
'file1.txt',
|
|
||||||
'file2.jpg'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Return when exporting container filesystem:
|
|
||||||
|
|
||||||
```
|
|
||||||
{
|
|
||||||
changed: true,
|
|
||||||
failed: false,
|
|
||||||
rc: 0,
|
|
||||||
results: {
|
|
||||||
src: container_name,
|
|
||||||
dest: local/path/archive_name.tar
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
```
|
|
||||||
@ -1,47 +0,0 @@
|
|||||||
|
|
||||||
# Docker_Image_Facts Module Proposal
|
|
||||||
|
|
||||||
## Purpose and Scope
|
|
||||||
|
|
||||||
The purpose of docker_image_facts is to inspect docker images.
|
|
||||||
|
|
||||||
Docker_image_facts will use docker-py to communicate with either a local or remote API. It will
|
|
||||||
support API versions >= 1.14. API connection details will be handled externally in a shared utility module similar
|
|
||||||
to how other cloud modules operate.
|
|
||||||
|
|
||||||
## Parameters
|
|
||||||
|
|
||||||
Docker_image_facts will support the parameters listed below. API connection parameters will be part of a shared
|
|
||||||
utility module as mentioned above.
|
|
||||||
|
|
||||||
```
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- An image name or list of image names. The image name can include a tag using the format C(name:tag).
|
|
||||||
default: null
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
```
|
|
||||||
- name: Inspect all images
|
|
||||||
docker_image_facts
|
|
||||||
register: image_facts
|
|
||||||
|
|
||||||
- name: Inspect a single image
|
|
||||||
docker_image_facts:
|
|
||||||
name: myimage:v1
|
|
||||||
register: myimage_v1_facts
|
|
||||||
```
|
|
||||||
|
|
||||||
## Returns
|
|
||||||
|
|
||||||
```
|
|
||||||
{
|
|
||||||
changed: False
|
|
||||||
failed: False
|
|
||||||
rc: 0
|
|
||||||
result: [ < inspection output > ]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
@ -1,207 +0,0 @@
|
|||||||
|
|
||||||
# Docker_Image Module Proposal
|
|
||||||
|
|
||||||
## Purpose and Scope
|
|
||||||
|
|
||||||
The purpose is to update the existing docker_image module. The updates include expanding the module's capabilities to
|
|
||||||
match the build, load, pull, push, rmi, and save docker commands and adding support for remote registries.
|
|
||||||
|
|
||||||
Docker_image will manage images using docker-py to communicate with either a local or remote API. It will
|
|
||||||
support API versions >= 1.14. API connection details will be handled externally in a shared utility module similar
|
|
||||||
to how other cloud modules operate.
|
|
||||||
|
|
||||||
## Parameters
|
|
||||||
|
|
||||||
Docker_image will support the parameters listed below. API connection parameters will be part of a shared utility
|
|
||||||
module as mentioned above.
|
|
||||||
|
|
||||||
```
|
|
||||||
archive_path:
|
|
||||||
description:
|
|
||||||
- Save image to the provided path. Use with state present to always save the image to a tar archive. If
|
|
||||||
intermediate directories in the path do not exist, they will be created. If a matching
|
|
||||||
archive already exists, it will be overwritten.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
config_path:
|
|
||||||
description:
|
|
||||||
- Path to a custom docker config file. Docker-py defaults to using ~/.docker/config.json.
|
|
||||||
|
|
||||||
cgroup_parent:
|
|
||||||
description:
|
|
||||||
- Optional parent cgroup for build containers.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
cpu_shares:
|
|
||||||
description:
|
|
||||||
- CPU shares for build containers. Integer value.
|
|
||||||
default: 0
|
|
||||||
|
|
||||||
cpuset_cpus:
|
|
||||||
description:
|
|
||||||
- CPUs in which to allow build container execution C(1,3) or C(1-3).
|
|
||||||
default: null
|
|
||||||
|
|
||||||
dockerfile:
|
|
||||||
description:
|
|
||||||
- Name of dockerfile to use when building an image.
|
|
||||||
default: Dockerfile
|
|
||||||
|
|
||||||
email:
|
|
||||||
description:
|
|
||||||
- The email for the registry account. Provide with username and password when credentials are not encoded
|
|
||||||
in docker configuration file or when encoded credentials should be updated.
|
|
||||||
default: null
|
|
||||||
nolog: true
|
|
||||||
|
|
||||||
force:
|
|
||||||
description:
|
|
||||||
- Use with absent state to un-tag and remove all images matching the specified name. Use with present state to
|
|
||||||
force a pull or rebuild of the image.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
load_path:
|
|
||||||
description:
|
|
||||||
- Use with state present to load a previously save image. Provide the full path to the image archive file.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
memory:
|
|
||||||
description:
|
|
||||||
- Build container limit. Memory limit specified as a positive integer for number of bytes.
|
|
||||||
|
|
||||||
memswap:
|
|
||||||
description:
|
|
||||||
- Build container limit. Total memory (memory + swap). Specify as a positive integer for number of bytes or
|
|
||||||
-1 to disable swap.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- Image name or ID.
|
|
||||||
required: true
|
|
||||||
|
|
||||||
nocache:
|
|
||||||
description:
|
|
||||||
- Do not use cache when building an image.
|
|
||||||
deafult: false
|
|
||||||
|
|
||||||
password:
|
|
||||||
description:
|
|
||||||
- Password used when connecting to the registry. Provide with username and email when credentials are not encoded
|
|
||||||
in docker configuration file or when encoded credentials should be updated.
|
|
||||||
default: null
|
|
||||||
nolog: true
|
|
||||||
|
|
||||||
path:
|
|
||||||
description:
|
|
||||||
- Path to Dockerfile and context from which to build an image.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
push:
|
|
||||||
description:
|
|
||||||
- Use with state present to always push an image to the registry.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
registry:
|
|
||||||
description:
|
|
||||||
- URL of the registry. If not provided, defaults to Docker Hub.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
rm:
|
|
||||||
description:
|
|
||||||
- Remove intermediate containers after build.
|
|
||||||
default: true
|
|
||||||
|
|
||||||
tag:
|
|
||||||
description:
|
|
||||||
- Image tags. When pulling or pushing, set to 'all' to include all tags.
|
|
||||||
default: latest
|
|
||||||
|
|
||||||
url:
|
|
||||||
description:
|
|
||||||
- The location of a Git repository. The repository acts as the context when building an image.
|
|
||||||
- Mutually exclusive with path.
|
|
||||||
|
|
||||||
username:
|
|
||||||
description:
|
|
||||||
- Username used when connecting to the registry. Provide with password and email when credentials are not encoded
|
|
||||||
in docker configuration file or when encoded credentials should be updated.
|
|
||||||
default: null
|
|
||||||
nolog: true
|
|
||||||
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- "absent" - if image exists, unconditionally remove it. Use the force option to un-tag and remove all images
|
|
||||||
matching the provided name.
|
|
||||||
- "present" - check if image is present with the provided tag. If the image is not present or the force option
|
|
||||||
is used, the image will either be pulled from the registry, built or loaded from an archive. To build the image,
|
|
||||||
provide a path or url to the context and Dockerfile. To load an image, use load_path to provide a path to
|
|
||||||
an archive file. If no path, url or load_path is provided, the image will be pulled. Use the registry
|
|
||||||
parameters to control the registry from which the image is pulled.
|
|
||||||
|
|
||||||
required: false
|
|
||||||
default: present
|
|
||||||
choices:
|
|
||||||
- absent
|
|
||||||
- present
|
|
||||||
|
|
||||||
http_timeout:
|
|
||||||
description:
|
|
||||||
- Timeout for HTTP requests during the image build operation. Provide a positive integer value for the number of
|
|
||||||
seconds.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
```
|
|
||||||
- name: build image
|
|
||||||
docker_image:
|
|
||||||
path: "/path/to/build/dir"
|
|
||||||
name: "my_app"
|
|
||||||
tags:
|
|
||||||
- v1.0
|
|
||||||
- mybuild
|
|
||||||
|
|
||||||
- name: force pull an image and all tags
|
|
||||||
docker_image:
|
|
||||||
name: "my/app"
|
|
||||||
force: yes
|
|
||||||
tags: all
|
|
||||||
|
|
||||||
- name: untag and remove image
|
|
||||||
docker_image:
|
|
||||||
name: "my/app"
|
|
||||||
state: absent
|
|
||||||
force: yes
|
|
||||||
|
|
||||||
- name: push an image to Docker Hub with all tags
|
|
||||||
docker_image:
|
|
||||||
name: my_image
|
|
||||||
push: yes
|
|
||||||
tags: all
|
|
||||||
|
|
||||||
- name: pull image from a private registry
|
|
||||||
docker_image:
|
|
||||||
name: centos
|
|
||||||
registry: https://private_registry:8080
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Returns
|
|
||||||
|
|
||||||
```
|
|
||||||
{
|
|
||||||
changed: True
|
|
||||||
failed: False
|
|
||||||
rc: 0
|
|
||||||
action: built | pulled | loaded | removed | none
|
|
||||||
msg: < text confirming the action that was taken >
|
|
||||||
results: {
|
|
||||||
< output from docker inspect for the affected image >
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
@ -1,48 +0,0 @@
|
|||||||
|
|
||||||
# Docker_Network_Facts Module Proposal
|
|
||||||
|
|
||||||
## Purpose and Scope
|
|
||||||
|
|
||||||
Docker_network_facts will inspect networks.
|
|
||||||
|
|
||||||
Docker_network_facts will use docker-py to communicate with either a local or remote API. It will
|
|
||||||
support API versions >= 1.14. API connection details will be handled externally in a shared utility module similar
|
|
||||||
to how other cloud modules operate.
|
|
||||||
|
|
||||||
## Parameters
|
|
||||||
|
|
||||||
Docker_network_facts will accept the parameters listed below. API connection parameters will be part of a shared
|
|
||||||
utility module as mentioned above.
|
|
||||||
|
|
||||||
```
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- Network name or list of network names.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
```
|
|
||||||
- name: Inspect all networks
|
|
||||||
docker_network_facts
|
|
||||||
register: network_facts
|
|
||||||
|
|
||||||
- name: Inspect a specific network and format the output
|
|
||||||
docker_network_facts
|
|
||||||
name: web_app
|
|
||||||
register: web_app_facts
|
|
||||||
```
|
|
||||||
|
|
||||||
# Returns
|
|
||||||
|
|
||||||
```
|
|
||||||
{
|
|
||||||
changed: False
|
|
||||||
failed: False
|
|
||||||
rc: 0
|
|
||||||
results: [ < inspection output > ]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
@ -1,130 +0,0 @@
|
|||||||
# Docker_Network Module Proposal
|
|
||||||
|
|
||||||
## Purpose and Scope:
|
|
||||||
|
|
||||||
The purpose of Docker_network is to create networks, connect containers to networks, disconnect containers from
|
|
||||||
networks, and delete networks.
|
|
||||||
|
|
||||||
Docker network will manage networks using docker-py to communicate with either a local or remote API. It will
|
|
||||||
support API versions >= 1.14. API connection details will be handled externally in a shared utility module similar to
|
|
||||||
how other cloud modules operate.
|
|
||||||
|
|
||||||
## Parameters:
|
|
||||||
|
|
||||||
Docker_network will accept the parameters listed below. Parameters related to connecting to the API will be handled in
|
|
||||||
a shared utility module, as mentioned above.
|
|
||||||
|
|
||||||
```
|
|
||||||
connected:
|
|
||||||
description:
|
|
||||||
- List of container names or container IDs to connect to a network.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
driver:
|
|
||||||
description:
|
|
||||||
- Specify the type of network. Docker provides bridge and overlay drivers, but 3rd party drivers can also be used.
|
|
||||||
default: bridge
|
|
||||||
|
|
||||||
driver_options:
|
|
||||||
description:
|
|
||||||
- Dictionary of network settings. Consult docker docs for valid options and values.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
force:
|
|
||||||
description:
|
|
||||||
- With state 'absent' forces disconnecting all containers from the network prior to deleting the network. With
|
|
||||||
state 'present' will disconnect all containers, delete the network and re-create the network.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
incremental:
|
|
||||||
description:
|
|
||||||
- By default the connected list is canonical, meaning containers not on the list are removed from the network.
|
|
||||||
Use incremental to leave existing containers connected.
|
|
||||||
default: false
|
|
||||||
|
|
||||||
ipam_driver:
|
|
||||||
description:
|
|
||||||
- Specifiy an IPAM driver.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
ipam_options:
|
|
||||||
description:
|
|
||||||
- Dictionary of IPAM options.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
network_name:
|
|
||||||
description:
|
|
||||||
- Name of the network to operate on.
|
|
||||||
default: null
|
|
||||||
required: true
|
|
||||||
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- "absent" deletes the network. If a network has connected containers, it cannot be deleted. Use the force option
|
|
||||||
to disconnect all containers and delete the network.
|
|
||||||
- "present" creates the network, if it does not already exist with the specified parameters, and connects the list
|
|
||||||
of containers provided via the connected parameter. Containers not on the list will be disconnected. An empty
|
|
||||||
list will leave no containers connected to the network. Use the incremental option to leave existing containers
|
|
||||||
connected. Use the force options to force re-creation of the network.
|
|
||||||
default: present
|
|
||||||
choices:
|
|
||||||
- absent
|
|
||||||
- present
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Examples:
|
|
||||||
|
|
||||||
```
|
|
||||||
- name: Create a network
|
|
||||||
docker_network:
|
|
||||||
name: network_one
|
|
||||||
|
|
||||||
- name: Remove all but selected list of containers
|
|
||||||
docker_network:
|
|
||||||
name: network_one
|
|
||||||
connected:
|
|
||||||
- containera
|
|
||||||
- containerb
|
|
||||||
- containerc
|
|
||||||
|
|
||||||
- name: Remove a single container
|
|
||||||
docker_network:
|
|
||||||
name: network_one
|
|
||||||
connected: "{{ fulllist|difference(['containera']) }}"
|
|
||||||
|
|
||||||
- name: Add a container to a network, leaving existing containers connected
|
|
||||||
docker_network:
|
|
||||||
name: network_one
|
|
||||||
connected:
|
|
||||||
- containerc
|
|
||||||
incremental: yes
|
|
||||||
|
|
||||||
- name: Create a network with options (Not sure if 'ip_range' is correct key name)
|
|
||||||
docker_network
|
|
||||||
name: network_two
|
|
||||||
options:
|
|
||||||
subnet: '172.3.26.0/16'
|
|
||||||
gateway: 172.3.26.1
|
|
||||||
ip_range: '192.168.1.0/24'
|
|
||||||
|
|
||||||
- name: Delete a network, disconnecting all containers
|
|
||||||
docker_network:
|
|
||||||
name: network_one
|
|
||||||
state: absent
|
|
||||||
force: yes
|
|
||||||
```
|
|
||||||
|
|
||||||
## Returns:
|
|
||||||
|
|
||||||
```
|
|
||||||
{
|
|
||||||
changed: True,
|
|
||||||
failed: false
|
|
||||||
rc: 0
|
|
||||||
action: created | removed | none
|
|
||||||
results: {
|
|
||||||
< results from docker inspect for the affected network >
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
@ -1,48 +0,0 @@
|
|||||||
|
|
||||||
# Docker_Volume_Facts Module Proposal
|
|
||||||
|
|
||||||
## Purpose and Scope
|
|
||||||
|
|
||||||
Docker_volume_facts will inspect volumes.
|
|
||||||
|
|
||||||
Docker_volume_facts will use docker-py to communicate with either a local or remote API. It will
|
|
||||||
support API versions >= 1.14. API connection details will be handled externally in a shared utility module similar
|
|
||||||
to how other cloud modules operate.
|
|
||||||
|
|
||||||
## Parameters
|
|
||||||
|
|
||||||
Docker_volume_facts will accept the parameters listed below. API connection parameters will be part of a shared
|
|
||||||
utility module as mentioned above.
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- Volume name or list of volume names.
|
|
||||||
default: null
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
```
|
|
||||||
- name: Inspect all volumes
|
|
||||||
docker_volume_facts
|
|
||||||
register: volume_facts
|
|
||||||
|
|
||||||
- name: Inspect a specific volume
|
|
||||||
docker_volume_facts:
|
|
||||||
name: data
|
|
||||||
register: data_vol_facts
|
|
||||||
```
|
|
||||||
|
|
||||||
# Returns
|
|
||||||
|
|
||||||
```
|
|
||||||
{
|
|
||||||
changed: False
|
|
||||||
failed: False
|
|
||||||
rc: 0
|
|
||||||
results: [ < output from volume inspection > ]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
@ -1,82 +0,0 @@
|
|||||||
# Docker_Volume Modules Proposal
|
|
||||||
|
|
||||||
## Purpose and Scope
|
|
||||||
|
|
||||||
The purpose of docker_volume is to manage volumes.
|
|
||||||
|
|
||||||
Docker_volume will manage volumes using docker-py to communicate with either a local or remote API. It will
|
|
||||||
support API versions >= 1.14. API connection details will be handled externally in a shared utility module similar
|
|
||||||
to how other cloud modules operate.
|
|
||||||
|
|
||||||
## Parameters
|
|
||||||
|
|
||||||
Docker_volume accepts the parameters listed below. Parameters for connecting to the API are not listed here, as they
|
|
||||||
will be part of the shared module mentioned above.
|
|
||||||
|
|
||||||
```
|
|
||||||
driver:
|
|
||||||
description:
|
|
||||||
- Volume driver.
|
|
||||||
default: local
|
|
||||||
|
|
||||||
force:
|
|
||||||
description:
|
|
||||||
- Use with state 'present' to force removal and re-creation of an existing volume. This will not remove and
|
|
||||||
re-create the volume if it is already in use.
|
|
||||||
|
|
||||||
name:
|
|
||||||
description:
|
|
||||||
- Name of the volume.
|
|
||||||
required: true
|
|
||||||
default: null
|
|
||||||
|
|
||||||
options:
|
|
||||||
description:
|
|
||||||
- Dictionary of driver specific options. The local driver does not currently support
|
|
||||||
any options.
|
|
||||||
default: null
|
|
||||||
|
|
||||||
state:
|
|
||||||
description:
|
|
||||||
- "absent" removes a volume. A volume cannot be removed if it is in use.
|
|
||||||
- "present" create a volume with the specified name, if the volume does not already exist. Use the force
|
|
||||||
option to remove and re-create a volume. Even with the force option a volume cannot be removed and re-created if
|
|
||||||
it is in use.
|
|
||||||
default: present
|
|
||||||
choices:
|
|
||||||
- absent
|
|
||||||
- present
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
```
|
|
||||||
- name: Create a volume
|
|
||||||
docker_volume:
|
|
||||||
name: data
|
|
||||||
|
|
||||||
- name: Remove a volume
|
|
||||||
docker_volume:
|
|
||||||
name: data
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
- name: Re-create an existing volume
|
|
||||||
docker_volume:
|
|
||||||
name: data
|
|
||||||
state: present
|
|
||||||
force: yes
|
|
||||||
```
|
|
||||||
|
|
||||||
## Returns
|
|
||||||
|
|
||||||
```
|
|
||||||
{
|
|
||||||
changed: true,
|
|
||||||
failed: false,
|
|
||||||
rc: 0,
|
|
||||||
action: removed | created | none
|
|
||||||
results: {
|
|
||||||
< show the result of docker inspect of an affected volume >
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
@ -1,205 +0,0 @@
|
|||||||
# Publish / Subscribe for Handlers
|
|
||||||
|
|
||||||
*Author*: René Moser <@resmo>
|
|
||||||
|
|
||||||
*Date*: 07/03/2016
|
|
||||||
|
|
||||||
## Motivation
|
|
||||||
|
|
||||||
In some use cases a publish/subscribe kind of event to run a handler is more convenient, e.g. restart services after replacing SSL certs.
|
|
||||||
|
|
||||||
However, ansible does not provide a built-in way to handle it yet.
|
|
||||||
|
|
||||||
|
|
||||||
### Problem
|
|
||||||
|
|
||||||
If your SSL cert changes, you usually have to reload/restart services to use the new certificate.
|
|
||||||
|
|
||||||
However, If you have a ssl role or a generic ssl play, you usually don't want to add specific handlers to it.
|
|
||||||
Instead it would be much more convenient to use a publish/subscribe kind of paradigm in the roles where the services are configured in.
|
|
||||||
|
|
||||||
The way we implemented it currently:
|
|
||||||
|
|
||||||
I use notify to set a fact where later (in different plays) we act on a fact using notify again.
|
|
||||||
|
|
||||||
~~~yaml
|
|
||||||
---
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
tasks:
|
|
||||||
- name: copy an ssl cert
|
|
||||||
shell: echo cert has been changed
|
|
||||||
notify: publish ssl cert change
|
|
||||||
handlers:
|
|
||||||
- name: publish ssl cert change
|
|
||||||
set_fact:
|
|
||||||
ssl_cert_changed: true
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
tasks:
|
|
||||||
- name: subscribe for ssl cert change
|
|
||||||
shell: echo cert changed
|
|
||||||
notify: service restart one
|
|
||||||
when: ssl_cert_changed is defined and ssl_cert_changed
|
|
||||||
handlers:
|
|
||||||
- name: service restart one
|
|
||||||
shell: echo service one restarted
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
tasks:
|
|
||||||
- name: subscribe for ssl cert change
|
|
||||||
shell: echo cert changed
|
|
||||||
when: ssl_cert_changed is defined and ssl_cert_changed
|
|
||||||
notify: service restart two
|
|
||||||
handlers:
|
|
||||||
- name: service restart two
|
|
||||||
shell: echo service two restarted
|
|
||||||
~~~
|
|
||||||
|
|
||||||
However, this looks like a workaround of a feature that ansible should provide in a much cleaner way.
|
|
||||||
|
|
||||||
## Approaches
|
|
||||||
|
|
||||||
### Approach 1:
|
|
||||||
|
|
||||||
Provide new `subscribe` keyword on handlers:
|
|
||||||
|
|
||||||
~~~yaml
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
tasks:
|
|
||||||
- name: copy an ssl cert
|
|
||||||
shell: echo cert has been changed
|
|
||||||
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
handlers:
|
|
||||||
- name: service restart one
|
|
||||||
shell: echo service one restarted
|
|
||||||
subscribe: copy an ssl cert
|
|
||||||
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
handlers:
|
|
||||||
- name: service restart two
|
|
||||||
shell: echo service two restarted
|
|
||||||
subscribe: copy an ssl cert
|
|
||||||
~~~
|
|
||||||
|
|
||||||
### Approach 2:
|
|
||||||
|
|
||||||
Provide new `subscribe` on handlers and `publish` keywords in tasks:
|
|
||||||
|
|
||||||
~~~yaml
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
tasks:
|
|
||||||
- name: copy an ssl cert
|
|
||||||
shell: echo cert has been changed
|
|
||||||
publish: yes
|
|
||||||
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
handlers:
|
|
||||||
- name: service restart one
|
|
||||||
shell: echo service one restarted
|
|
||||||
subscribe: copy an ssl cert
|
|
||||||
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
handlers:
|
|
||||||
- name: service restart two
|
|
||||||
shell: echo service two restarted
|
|
||||||
subscribe: copy an ssl cert
|
|
||||||
~~~
|
|
||||||
|
|
||||||
### Approach 3:
|
|
||||||
|
|
||||||
Provide new `subscribe` module:
|
|
||||||
|
|
||||||
A subscribe module could consume the results of a task by name, optionally the value to react on could be specified (default: `changed`)
|
|
||||||
|
|
||||||
~~~yaml
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
tasks:
|
|
||||||
- name: copy an ssl cert
|
|
||||||
shell: echo cert has been changed
|
|
||||||
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
tasks:
|
|
||||||
- subscribe:
|
|
||||||
name: copy an ssl cert
|
|
||||||
notify: service restart one
|
|
||||||
handlers:
|
|
||||||
- name: service restart one
|
|
||||||
shell: echo service one restarted
|
|
||||||
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
tasks:
|
|
||||||
- subscribe:
|
|
||||||
name: copy an ssl cert
|
|
||||||
react_on: changed
|
|
||||||
notify: service restart two
|
|
||||||
handlers:
|
|
||||||
- name: service restart two
|
|
||||||
shell: echo service two restarted
|
|
||||||
~~~
|
|
||||||
|
|
||||||
|
|
||||||
### Approach 4:
|
|
||||||
|
|
||||||
Provide new `subscribe` module (same as Approach 3) and `publish` keyword:
|
|
||||||
|
|
||||||
~~~yaml
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
tasks:
|
|
||||||
- name: copy an ssl cert
|
|
||||||
shell: echo cert has been changed
|
|
||||||
publish: yes
|
|
||||||
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
tasks:
|
|
||||||
- subscribe:
|
|
||||||
name: copy an ssl cert
|
|
||||||
notify: service restart one
|
|
||||||
handlers:
|
|
||||||
- name: service restart one
|
|
||||||
shell: echo service one restarted
|
|
||||||
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
tasks:
|
|
||||||
- subscribe:
|
|
||||||
name: copy an ssl cert
|
|
||||||
notify: service restart two
|
|
||||||
handlers:
|
|
||||||
- name: service restart two
|
|
||||||
shell: echo service two restarted
|
|
||||||
~~~
|
|
||||||
|
|
||||||
### Clarifications about role dependencies and publish
|
|
||||||
|
|
||||||
When using service roles having the subscription handlers and the publish task (e.g. cert change) is defined in a depended role (SSL role) only the first service role running the "cert change" task as dependency will trigger the publish.
|
|
||||||
|
|
||||||
In any other service role in the playbook having "SSL role" as dependency, the task won't be `changed` anymore.
|
|
||||||
|
|
||||||
Therefore a once published "message" should not be overwritten or so called "unpublished" by running the same task in a followed role in the playbook.
|
|
||||||
|
|
||||||
## Conclusion
|
|
||||||
|
|
||||||
Feedback is requested to improve any of the above approaches, or provide further approaches to solve this problem.
|
|
||||||
@ -1,77 +0,0 @@
|
|||||||
# Proposal: Re-run handlers cli option
|
|
||||||
|
|
||||||
*Author*: René Moser <@resmo>
|
|
||||||
|
|
||||||
*Date*: 07/03/2016
|
|
||||||
|
|
||||||
- Status: New
|
|
||||||
|
|
||||||
## Motivation
|
|
||||||
|
|
||||||
The most annoying thing users face using ansible in production is running handlers manually after a task failed after a notified handler.
|
|
||||||
|
|
||||||
### Problems
|
|
||||||
|
|
||||||
Handler notifications get lost after a task failed and there is no help from ansible to catch up the notified handlers in a next ansible playbook run.
|
|
||||||
|
|
||||||
~~~yaml
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: no
|
|
||||||
tasks:
|
|
||||||
- name: simple task
|
|
||||||
shell: echo foo
|
|
||||||
notify: get msg out
|
|
||||||
|
|
||||||
- name: this tasks fails
|
|
||||||
fail: msg="something went wrong"
|
|
||||||
|
|
||||||
handlers:
|
|
||||||
- name: get msg out
|
|
||||||
shell: echo handler run
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Result:
|
|
||||||
|
|
||||||
~~~
|
|
||||||
$ ansible-playbook test.yml
|
|
||||||
|
|
||||||
PLAY ***************************************************************************
|
|
||||||
|
|
||||||
TASK [simple task] *************************************************************
|
|
||||||
changed: [localhost]
|
|
||||||
|
|
||||||
TASK [this tasks fails] ********************************************************
|
|
||||||
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "something went wrong"}
|
|
||||||
|
|
||||||
NO MORE HOSTS LEFT *************************************************************
|
|
||||||
|
|
||||||
RUNNING HANDLER [get msg out] **************************************************
|
|
||||||
to retry, use: --limit @test.retry
|
|
||||||
|
|
||||||
PLAY RECAP *********************************************************************
|
|
||||||
localhost : ok=1 changed=1 unreachable=0 failed=1
|
|
||||||
~~~
|
|
||||||
|
|
||||||
## Solution proposal
|
|
||||||
|
|
||||||
Similar to retry, ansible should provide a way to manully invoke a list of handlers additionaly to the notified handlers in the plays:
|
|
||||||
|
|
||||||
~~~
|
|
||||||
$ ansible-playbook test.yml --notify-handlers <handler>,<handler>,<handler>
|
|
||||||
$ ansible-playbook test.yml --notify-handlers @test.handlers
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
~~~
|
|
||||||
$ ansible-playbook test.yml --notify-handlers "get msg out"
|
|
||||||
~~~
|
|
||||||
|
|
||||||
The stdout of a failed play should provide an example how to run notified handlers in the next run:
|
|
||||||
|
|
||||||
~~~
|
|
||||||
...
|
|
||||||
RUNNING HANDLER [get msg out] **************************************************
|
|
||||||
to retry, use: --limit @test.retry --notify-handlers @test.handlers
|
|
||||||
~~~
|
|
||||||
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
# Rename always_run to ignore_checkmode
|
|
||||||
|
|
||||||
*Author*: René Moser <@resmo>
|
|
||||||
|
|
||||||
*Date*: 02/03/2016
|
|
||||||
|
|
||||||
## Motivation
|
|
||||||
|
|
||||||
The task argument `always_run` is misleading.
|
|
||||||
|
|
||||||
Ansible is known to be readable by users without deep knowledge of creating playbooks, they do not understand
|
|
||||||
what `always_run` does at the first glance.
|
|
||||||
|
|
||||||
### Problems
|
|
||||||
|
|
||||||
The following looks scary if you have no idea, what `always_run` does:
|
|
||||||
|
|
||||||
```
|
|
||||||
- shell: dangerous_cleanup.sh
|
|
||||||
when: cleanup == "yes"
|
|
||||||
always_run: yes
|
|
||||||
```
|
|
||||||
|
|
||||||
You have a conditional but also a word that says `always`. This is a conflict in terms of understanding.
|
|
||||||
|
|
||||||
## Solution Proposal
|
|
||||||
|
|
||||||
Deprecate `always_run` by rename it to `ignore_checkmode`:
|
|
||||||
|
|
||||||
```
|
|
||||||
- shell: dangerous_cleanup.sh
|
|
||||||
when: cleanup == "yes"
|
|
||||||
ignore_checkmode: yes
|
|
||||||
```
|
|
||||||
Loading…
Reference in New Issue