Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docker_swarm_service overrides service settings #648

Open
benformosa opened this issue Jun 19, 2023 · 2 comments
Open

docker_swarm_service overrides service settings #648

benformosa opened this issue Jun 19, 2023 · 2 comments
Labels
docker-swarm Docker Swarm question Further information is requested

Comments

@benformosa
Copy link

benformosa commented Jun 19, 2023

SUMMARY

When modifying an existing Docker Swarm service, anything that is not explictly set by the module is overriden with the generally empty defaults.

It's not clear to me if this is the expected behaviour, but it is pretty surprising coming from using the Docker cli.

ISSUE TYPE
  • Bug Report
COMPONENT NAME

docker_swarm_service

ANSIBLE VERSION
ansible [core 2.14.6]
  config file = /home/user/git/ansible/ansible.cfg
  configured module search path = ['/home/user/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.9/site-packages/ansible
  ansible collection location = /home/user/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.9.16 (main, Dec 21 2022, 10:57:18) [GCC 8.5.0 20210514 (Red Hat 8.5.0-17)] (/usr/bin/python3.9)
  jinja version = 3.1.2
  libyaml = True
COLLECTION VERSION
Collection       Version
---------------- -------
community.docker 3.4.8
CONFIGURATION
CONFIG_FILE() = /home/user/git/ansible/ansible.cfg
DEFAULT_HOST_LIST(/home/user/git/ansible/ansible.cfg) = ['/home/user/git/ansible/inventory.ini']
OS / ENVIRONMENT

RHEL 8.8

STEPS TO REPRODUCE

Targets an existing Docker swarm cluster.

https://gist.github.com/benformosa/7bf92e8975dc912326a0a8f789a47c24

EXPECTED RESULTS
  • Tasks Test 1 uri, Test 2 uri, Test 3 uri should all succeed
  • Tasks Test 1 swarm_info, Test 2 swarm_info, Test 3 swarm_info should all have the same output
ACTUAL RESULTS
TASK [Test 1 uri - create service] ********
ok: [node1.example.com]

TASK [Get swarm info] ********
ok: [node1.example.com]

TASK [Test 1 swarm_info - Display service info] ********
ok: [node1.example.com] => {
    "msg": {
        "Configs": [
            {
                "ConfigID": "s9hhu5ddge3lqbb3n8w954jvb",
                "ConfigName": "my_nginx_index",
                "File": {
                    "GID": "0",
                    "Mode": 292,
                    "Name": "/usr/share/nginx/html/index.html",
                    "UID": "0"
                }
            }
        ],
        "Image": "library/nginx:latest",
        "Isolation": "default"
    }
}
TASK [Test 2 uri - scale with command] ********
ok: [node1.example.com]

TASK [Get swarm info] ********
ok: [node1.example.com]

TASK [Test 2 swarm_info - Display service info] ********
ok: [node1.example.com] => {
    "msg": {
        "Configs": [
            {
                "ConfigID": "s9hhu5ddge3lqbb3n8w954jvb",
                "ConfigName": "my_nginx_index",
                "File": {
                    "GID": "0",
                    "Mode": 292,
                    "Name": "/usr/share/nginx/html/index.html",
                    "UID": "0"
                }
            }
        ],
        "Image": "library/nginx:latest",
        "Isolation": "default"
    }
}
TASK [Test 3 uri - scale with module] ********
fatal: [node1.example.com]: FAILED! => {"changed": false, "content": "", "elapsed": 0, "failed_when_result": true, "msg": "Status code was -1 and not [200]: Request failed: <urlopen error [Errno 99] Cannot assign requested address>", "redirected": false, "status": -1, "url": "http://localhost/index.html"}
...ignoring

TASK [Get swarm info] ********
ok: [node1.example.com]

TASK [Task 3 swarm_info - Display service info] ********
ok: [node1.example.com] => {
    "msg": {
        "Image": "library/nginx:latest",
        "Isolation": "default"
    }
}
@felixfontein felixfontein added question Further information is requested docker-swarm Docker Swarm labels Jun 19, 2023
@felixfontein
Copy link
Collaborator

This is a design decision; the same is also true for the docker_container module. The modules only compare parameters that have been explicitly specified, and if they find a difference, they update the container if possible, and if it isn't possible, they recreate it, but only with the parameters explicitly specified to the module.

There are disadvantages and advantages to this; the main advantage is that if a docker_swarm_service or docker_container task (re-)creates a service/container, it is exactly as specified.

(If you use the Docker CLI to remove and re-create a service/container, you also need to specify everything you want in the re-creation command.)

@benformosa
Copy link
Author

Thanks for the response. That makes sense.
My use case is updating a service which is created by some other mechanism, so I don't have its full specification.

I was looking at using docker_swarm_info to populate all the parameters from the current state, but it seemed like that output doesn't map nicely to the parameters in docker_swarm_service.

My solution was to just run the cli command, which is fine, it does exactly what I want.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
docker-swarm Docker Swarm question Further information is requested
Projects
None yet
Development

No branches or pull requests

2 participants