-
Notifications
You must be signed in to change notification settings - Fork 2.3k
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
Containerized installs on RHEL were downgrading docker unnecessarily #1718
Changes from all commits
477f04a
f443be0
463737f
ad9aad9
ff06c2e
09d6e9f
5c7b510
0879620
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,33 +1,4 @@ | ||
--- | ||
# This is a workaround for authenticated registries | ||
- name: Download new images | ||
hosts: oo_nodes_to_config | ||
roles: | ||
- openshift_facts | ||
tasks: | ||
- name: Pull Images | ||
command: > | ||
docker pull {{ item }}:v{{ g_new_version }} | ||
with_items: | ||
- "{{ openshift.node.node_image }}" | ||
- "{{ openshift.node.ovs_image }}" | ||
- "{{ openshift.common.pod_image }}" | ||
- "{{ openshift.common.router_image }}" | ||
- "{{ openshift.common.registry_image }}" | ||
- "{{ openshift.common.deployer_image }}" | ||
|
||
# This is a workaround for authenticated registries | ||
- name: Download new images | ||
hosts: oo_masters_to_config | ||
roles: | ||
- openshift_facts | ||
tasks: | ||
- name: Pull Images | ||
command: > | ||
docker pull {{ item }}:v{{ g_new_version }} | ||
with_items: | ||
- "{{ openshift.master.master_image }}" | ||
|
||
############################################################################### | ||
# The restart playbook should be run after this playbook completes. | ||
############################################################################### | ||
|
@@ -40,6 +11,20 @@ | |
- include: docker_upgrade.yml | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. docker_upgrade.yml file missing from PR? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That file already existed. I just had to move it earlier due to bugs in docker 1.8.2's --add-registry. Without docker 1.9 the workaround for authenticated registries doesn't even work. |
||
when: not openshift.common.is_atomic | bool | ||
|
||
# The cli image is used by openshift_facts to determine the currently installed | ||
# version. We need to explicitly pull the latest image to handle cases where | ||
# the locally cached 'latest' tag is older the g_new_version. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @abutcher, PTAL. This was why Docker was downgraded when upgrading to 3.2. |
||
- name: Download cli image | ||
hosts: oo_masters_to_config:oo_nodes_to_config | ||
roles: | ||
- openshift_facts | ||
tasks: | ||
- name: Pull Images | ||
command: > | ||
docker pull {{ item }}:latest | ||
with_items: | ||
- "{{ openshift.common.cli_image }}" | ||
|
||
############################################################################### | ||
# Upgrade Masters | ||
############################################################################### | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -7,22 +7,27 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
register: docker_version_result | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
changed_when: false | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- stat: path=/etc/sysconfig/docker-storage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
register: docker_storage_check | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- name: Remove deferred deletion for downgrades from 1.9 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
command: > | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sed -i 's/--storage-opt dm.use_deferred_deletion=true//' /etc/sysconfig/docker-storage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
when: docker_storage_check.stat.exists | bool and not docker_version_result | skipped and docker_version_result.stdout | default('0.0', True) | version_compare('1.9', '>=') and docker_version | version_compare('1.9', '<') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- name: Downgrade docker if necessary | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
command: "{{ ansible_pkg_mgr }} downgrade -y docker-{{ docker_version }}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
register: docker_downgrade_result | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
when: not docker_version_result | skipped and docker_version_result.stdout | default('0.0', True) | version_compare(docker_version, 'gt') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @sdodson, I think not using There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👍 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- name: Install docker | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
action: "{{ ansible_pkg_mgr }} name=docker{{ '-' + docker_version if docker_version != '' else '' }} state=present" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
when: not openshift.common.is_atomic | bool and not docker_downgrade_result | changed | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
action: "{{ ansible_pkg_mgr }} name=docker{{ '-' + docker_version if docker_version is defined and docker_version != '' else '' }} state=present" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
when: not openshift.common.is_atomic | bool and not docker_version_result | skipped and docker_version_result.stdout | default('0.0', True) | version_compare(docker_version, 'lt') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @detiber, @sdodson, this is what I'm testing. It's weird but it seems to handle the 1) no docker installed 2) downgrade and 3) upgrade cases. The idea is that if docker_version_result.stdout is empty we need to install the minimum required version. If there is a version installed and we didn't need to downgrade then we can ensure the latest version. I think there's still an edgecase if a version like 1.8.1 was installed and we needed 1.8.2. I think it would actually result in 1.9.1 being installed. This is a mess. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Did it not work without changing from There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nevermind, I see you're accounting for that in the when condition. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm actually surprised there isn't an error for line 16 and not having a else clause... I suppose that is just a jinja2'ism. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Again, I really think we should avoid latest to avoid upgrading docker inadvertently during regular CM operations, since we should only have to worry about initial installation, and 1.2/3.2 packages would have a requirement on docker-1.9, that should only leave us with issues related to containerized installs and docker versions. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm fine with reworking this to avoid using 'latest'. I think one of the problems I was hitting was coming up with some simple logic without reworking what we already had too much. I think if we don't have 'latest' the way the logic is now it could result in docker-1.9.1 being explicitly installed even though a 1.9.2 package was available. That isn't the end of the world but it's a spell of overly complicated logic. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've posted this[0] question regarding how we should express requirements of the host os. If we're not worried about containerized installs this is a non issue because installing 3.2 atomic-openshift-node package will ensure that we're at a minimum version so it's really the upper version limits for 3.1 and 3.0 that we require. 0 - http://ask.projectatomic.io/en/question/3641/expressing-requirements-of-the-host-os/ There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This showed that all the variables were actually defined as expected:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @brenton maybe stdout is not in docker_version_result? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Line above it is missing an else
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. From the logs I have it is:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @abutcher, yeah, that was it. :( There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @detiber, this is pretty hard to read but here's the thinking: If There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There's gaps in this that have been identified since I did the backport but should we try to be less clever for the sake of clarity? I liked how easy this was to follow in my backport openshift-ansible/roles/docker/tasks/main.yml Lines 10 to 65 in 7e39163
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's getting late on a Friday. I'm honestly struggling to see how either of these are easy to follow given all the logic branches for containerized installs. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So, I didn't test with Docker not installed, but with the current logic it failed for the upgrade scenario |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- stat: path=/etc/sysconfig/docker-storage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
register: docker_storage_check | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- name: Remove deferred deletion for downgrades from 1.9 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
command: > | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sed -i 's/--storage-opt dm.use_deferred_deletion=true//' /etc/sysconfig/docker-storage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
when: docker_downgrade_result | changed and docker_storage_check.stat.exists | bool and docker_version_result.stdout | default('0.0', True) | version_compare('1.9', '>=') and docker_version | version_compare('1.9', '<') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# We're getting ready to start docker. This is a workaround for cases where it | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# seems a package install/upgrade/downgrade has rebooted docker and crashed it. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- name: Reset docker service state | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
command: systemctl reset-failed docker.service | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- name: enable and start the docker service | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
service: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -46,10 +46,24 @@ | |
register: common_version | ||
failed_when: false | ||
changed_when: false | ||
when: not openshift.common.is_atomic | bool | ||
when: not openshift.common.is_containerized | bool | ||
|
||
- set_fact: | ||
l_common_version: "{{ openshift.common.image_tag | default('0.0', True) | oo_image_tag_to_rpm_version }}" | ||
when: openshift.common.is_containerized | bool | ||
|
||
- set_fact: | ||
l_common_version: "{{ common_version.stdout | default('0.0', True) }}" | ||
when: not openshift.common.is_containerized | bool | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I probably have an irrational hate of set_fact... I can't think of a way to put this into a vars file though, with the use of common_version.stdout though... it could be limited down to one set_fact if you do the following though:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd do whatever you prefer. I sort of hate inlining if/else like this. It almost always gets more complicated and I can no longer count how many bugs I've seen because of followup edits that subtly break things. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That's fine, if it can't be eliminated by pushing it to vars, it's not really worth it anyway. |
||
|
||
- name: Set docker version to be installed | ||
set_fact: | ||
docker_version: "{{ '1.8.2' }}" | ||
when: " ( common_version.stdout | default('0.0', True) | version_compare('3.2','<') and openshift.common.service_type == 'atomic-openshift' ) or | ||
( common_version.stdout | default('0.0', True) | version_compare('1.1.4','<') and openshift.common.service_type == 'origin' )" | ||
when: " ( l_common_version | version_compare('3.2','<') and openshift.common.service_type == 'atomic-openshift' ) or | ||
( l_common_version | version_compare('1.1.4','<') and openshift.common.service_type == 'origin' )" | ||
|
||
- name: Set docker version to be installed | ||
set_fact: | ||
docker_version: "{{ '1.9.1' }}" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @detiber, @sdodson, I'm not really excited about having to explicitly declare compatible version numbers. I suspect our supported versions of docker for each OSE release are only going to get more complicated over time. I definitely want the ansible install code to be a simple as possible and least likely to fail. I wanted to set There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @brenton I'm wondering if we shouldn't worry about upper bounds on docker version unless we have a known issue like we have with 3.1. Then during upgrades we could handle upgrading docker if necessary. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd prefer to wait to handle the upper bound issue when we see what the docker 1.9 vs 1.10 packaging looks like. There are still a lot of possibilities and I don't think we would guess correctly at this point. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I wonder if ensure=latest does the right thing if you're specifying version? We could just not specify the version for 3.2 until such a point that we know of an upper bound. Then the install task would ensure it's the latest. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'll test that out. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Every use of the docker role should be through the openshift_docker role which is pulling data from openshift_facts. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I was mostly just thinking out loud that the conditional is going to be a little tricky and require a lot of testing. I think my perception that this role was being applied multiple times was that I had multiple hosts in my environment that are all master+node. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @brenton indeed, for a HA master host, it will be applied 3 times (etcd, master, and node) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just wanted to add a comment that we should avoid using There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure why I didn't think about this earlier, but would it make sense to push the complex version logic in openshift_docker_facts into the openshift_facts module directly, then we wouldn't need to run multiple tasks to set the docker_version that is passed to the docker role. Moving the package version tests into the openshift_facts module would also probably prevent any issues around installing a newer version of docker only to downgrade later as well. We'd still have some funkiness in the docker role proper to handle downgrade, but I think it'd still be worth it to keep the docker role generic. |
||
when: " ( l_common_version | version_compare('3.2','>') and openshift.common.service_type == 'atomic-openshift' ) or | ||
( l_common_version | version_compare('1.2','>') and openshift.common.service_type == 'origin' )" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@detiber, are you OK with this? It's true there's an edge case of a running service being a different version from the node image that's already cached, however, if they haven't run the installer yet and restarted their system they would be running that version anyway. My goal here is to do something failsafe that will never result in setting the version to something that won't even start. Also, this way the upgrade playbook can safely be re-run.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@brenton yeah, I think that's fine... it's funny how I always thought the containerized installs would be "better" and "easier" :)